Unixシェルガイド

Apache Hadoopの機能の多くは、シェルを介して制御されます。これらのコマンドの実行方法のデフォルトの動作を変更する方法はいくつかあります。

重要なエンドユーザー環境変数

Apache Hadoopには、ソフトウェアのさまざまな側面を制御する多くの環境変数があります。(hadoop-env.shおよび関連ファイルを参照してください。)これらの環境変数の一部は、エンドユーザーがランタイムを管理するのに役立つように設計されています。

HADOOP_CLIENT_OPTS

この環境変数は、すべてのエンドユーザーのデーモン以外の操作に使用されます。システムプロパティ定義を使用して、JavaオプションとApache Hadoopオプションの両方を設定するために使用できます。たとえば

HADOOP_CLIENT_OPTS="-Xmx1g -Dhadoop.socks.server=localhost:4000" hadoop fs -ls /tmp

メモリを増やし、このコマンドをSOCKSプロキシサーバーを介して送信します。

注: 'YARN_CLIENT_OPTS'が定義されている場合、コマンドが'yarn'で実行されると、'HADOOP_CLIENT_OPTS'を置き換えます。

(command)_(subcommand)_OPTS

サブコマンドごとにオプションを設定することもできます。これにより、特定のケースに対して特別なオプションを作成できます。パターンの最初の部分は使用されているコマンドですが、すべて大文字です。コマンドの2番目の部分は、使用されているサブコマンドです。最後に文字列_OPTが続きます。

たとえば、mapred distcpが2GBのヒープを使用するように構成するには、次のようにします。

MAPRED_DISTCP_OPTS="-Xmx2g"

これらのオプションは実行時にHADOOP_CLIENT_OPTSに表示され、一般的に優先されます。

HADOOP_CLASSPATH

注:サイト全体の設定はシェルプロファイルエントリを介して構成する必要があり、永続的なユーザー全体の設定は、hadoop_add_classpath関数を用いて${HOME}/.hadooprcを介して構成する必要があります。詳細については、以下を参照してください。

Apache Hadoopスクリプトには、この環境変数を設定することにより、実行中のコマンドのクラスパスにさらにコンテンツを挿入する機能があります。コロン区切りのディレクトリ、ファイル、またはワイルドカードの場所のリストである必要があります。

HADOOP_CLASSPATH=${HOME}/lib/myjars/*.jar hadoop classpath

ユーザーは、HADOOP_USER_CLASSPATH_FIRST変数を介してパスの場所のヒントを提供できます。これを任意の値に設定すると、システムはこれらのパスを先頭に押し込もうとします。

変数の自動設定

ユーザーが共通の設定セットを持っている場合、それらを${HOME}/.hadoop-envファイルに入れることができます。このファイルは常に読み取られて、ユーザーがカスタマイズしたい変数を初期化および上書きします。これは、.bashrcファイルと同様のbash構文を使用します。

たとえば

#
# my custom Apache Hadoop settings!
#

HADOOP_CLIENT_OPTS="-Xmx1g"
MAPRED_DISTCP_OPTS="-Xmx2g"
HADOOP_DISTCP_OPTS="-Xmx2g"

.hadoop-envファイルは、機能を拡張し、Apache Hadoopに新しい機能を教えるためにも使用できます。たとえば、環境変数${HADOOP_SERVER}で参照されるサーバーにアクセスするhadoopコマンドを実行するには、.hadoop-env内の次の操作を行います。

if [[ -n ${HADOOP_SERVER} ]]; then
  HADOOP_CONF_DIR=/etc/hadoop.${HADOOP_SERVER}
fi

警告:すべてのUnixシェルAPIルーチンが.hadoop-envで使用可能であるか、正しく機能するとは限りません。.hadooprcの詳細については、以下を参照してください。

管理者環境

さまざまなXMLファイルに加えて、管理者がUnixシェルを使用する場合、Apache Hadoopを構成するための2つの重要な機能があります。

  • システムの動作に影響を与える多くの環境変数。このガイドでは、いくつかの重要なものだけを強調します。一般的に、さまざまな*-env.shファイルに詳細情報があります。

  • 既存のスクリプトを補足するか、プラットフォーム固有の変更を行います。Apache Hadoopは、関数の上書き機能を提供するため、その作業全体を行うことなく、既存のコードベースをその場で変更できます。関数の置換については、後のシェルAPIドキュメントで説明します。

(command)_(subcommand)_OPTS

間違いなく最も重要なのは、デーモンの動作を制御する_OPTS変数のシリーズです。これらの変数には、これらのデーモンに関するすべての関連設定を含める必要があります。

上記ユーザーコマンドと同様に、すべてのデーモンは(command)_(subcommand)_OPTSパターンを尊重します。システムが再起動時に使用する設定を確実に認識させるために、これらをhadoop-env.shで設定することをお勧めします。ユーザー向けのサブコマンドとは異なり、デーモンはHADOOP_CLIENT_OPTS尊重しません

さらに、追加のセキュアモードで実行されるデーモンは、(command)_(subcommand)_SECURE_EXTRA_OPTSもサポートします。これらのオプションは、一般的な*_OPTS補足するものであり、その後に表示され、したがって一般的に優先されます。

(command)_(subcommand)_USER

Apache Hadoopは、サブコマンドごとにユーザーチェックを行う方法を提供します。この方法は簡単に回避できるため、セキュリティ機能とは見なすことはできませんが、事故を防ぐためのメカニズムを提供します。たとえば、HDFS_NAMENODE_USER=hdfsを設定すると、hdfs namenodehdfs --daemon start namenodeコマンドは、USER環境変数をチェックすることで、コマンドを実行しているユーザーがhdfsユーザーであることを確認します。これはデーモン以外でも機能します。HADOOP_DISTCP_USER=janeを設定すると、hadoop distcpコマンドの実行が許可される前に、USERjaneに設定されていることが確認されます。

_USER環境変数が存在し、コマンドが特権(例:rootとして;APIドキュメントのhadoop_privilege_checkを参照)を使用して実行されると、最初に指定されたユーザーに切り替わります。セキュリティ上の理由からユーザーアカウントの切り替えをサポートし、そのためSECURE_USER変数を持つコマンド(以下を参照)の場合、基本の_USER変数は、SECURE_USERアカウントに切り替えるために使用されると予想されるユーザーである必要があります。たとえば

HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs

は「hdfs –daemon start datanode」をrootにすることを強制しますが、特権のある作業が完了した後、最終的にhdfsユーザーに切り替わります。

--workersフラグが使用されている場合、ユーザーの切り替えはsshが呼び出されたに発生することに注意してください。ただし、sbinのマルチデーモンの開始と停止コマンドは、(適切な場合)事前に切り替えを行うため、指定された_USERのキーを使用します。

開発者と上級管理者環境

シェルプロファイル

Apache Hadoopでは、さまざまなプラグ可能なインターフェースを通じて、サードパーティが新しい機能を簡単に追加できます。これには、必要なコンテンツを基本インストールに簡単に挿入できるシェルコードサブシステムが含まれています。

この機能の中核となるのは、シェルプロファイルの概念です。シェルプロファイルは、クラスパスにjarを追加したり、Javaシステムプロパティを構成したりなどを行うことができるシェルスニペットです。

シェルプロファイルは、${HADOOP_CONF_DIR}/shellprofile.dまたは${HADOOP_HOME}/libexec/shellprofile.dのいずれかにインストールできます。libexecディレクトリにあるシェルプロファイルは基本インストールの一部であり、ユーザーによって上書きすることはできません。構成ディレクトリにあるシェルプロファイルは、エンドユーザーが実行時に構成ディレクトリを変更した場合、無視される場合があります。

シェルプロファイルの例は、libexecディレクトリにあります。

シェルAPI

Apache Hadoopのシェルコードには、関数ライブラリがあり、管理者と開発者が構成と高度な機能管理を支援するために使用できます。これらのAPIは標準のApache Hadoopインターフェース分類に従いますが、追加として「置換可能」があります。

シェルコードでは、コア関数を上書きできます。ただし、すべての関数を置換できるわけではなく、置換しても安全なわけではありません。関数を置換しても安全でない場合、その属性は「置換可能:いいえ」になります。関数を安全に置換できる場合、その属性は「置換可能:はい」になります。

関数を置換するには、${HADOOP_CONF_DIR}ディレクトリにhadoop-user-functions.shというファイルを作成します。このファイルに新しい置換関数を定義するだけで、システムは自動的にそれを認識します。このファイルには、必要な数の置換関数を配置できます。関数の置換の例は、hadoop-user-functions.sh.exampleファイルにあります。

PublicおよびStableとマークされている関数は、そのままシェルプロファイルで使用しても安全です。他の関数はマイナーリリースで変更される可能性があります。

ユーザーレベルAPIアクセス

個々のユーザーがhadoop-env.shをオーバーライドできるようにする.hadoop-envに加えて、ユーザーは.hadooprcも使用できます。これは、Apache Hadoopシェル環境の構成後呼び出され、シェルのAPI関数呼び出しの完全なセットを使用できます。

たとえば

hadoop_add_classpath /some/path/custom.jar

.hadooprcに記述されます。

動的サブコマンド

シェルAPIを利用することで、サードパーティが独自のサブコマンドを主要なHadoopシェルスクリプト(hadoop、hdfs、mapred、yarn)に追加することが可能です。

サブコマンドを実行する前に、主要なスクリプトは(scriptname)_subcommand_(subcommand)関数の存在を確認します。この関数は、残りのコマンドライン引数すべてがパラメーターとして設定されて実行されます。例えば、以下の関数が定義されている場合

function yarn_subcommand_hello
{
  echo "$@"
  exit $?
}

yarn --debug hello world I see youを実行すると、スクリプトのデバッグが有効になり、yarn_subcommand_hello関数が以下のように呼び出されます。

yarn_subcommand_hello world I see you

これにより、以下が出力されます。

world I see you

新しいサブコマンドを使用方法出力に追加することも可能です。hadoop_add_subcommand関数は、使用方法出力にテキストを追加します。標準のHADOOP_SHELL_EXECNAME変数を利用することで、新しい関数を適用するコマンドを制限できます。

if [[ "${HADOOP_SHELL_EXECNAME}" = "yarn" ]]; then
  hadoop_add_subcommand "hello" client "Print some text to the screen"
fi

特別な制限、追加機能などが無いので、サブコマンドの種類を "client" に設定します。この機能は、ビルトイン関数をオーバーライドするためにも使用できます。例えば、以下を定義すると

function hdfs_subcommand_fetchdt
{
  ...
}

…既存のhdfs fetchdtサブコマンドがカスタムのものに置き換えられます。

動的サブコマンドの主な環境変数

  • HADOOP_CLASSNAME

プログラムの実行が続行される際に使用するJavaクラスの名前です。

  • HADOOP_PRIV_CLASSNAME

デーモンが特権モードで実行されることが想定されている場合に使用するJavaクラスの名前です。(詳細は下記参照)

  • HADOOP_SHELL_EXECNAME

実行されているスクリプトの名前です。hadoop、hdfs、mapred、またはyarnのいずれかになります。

  • HADOOP_SUBCMD

コマンドラインで渡されたサブコマンドです。

  • HADOOP_SUBCMD_ARGS

この配列には、Apache Hadoop共通の引数処理が行われた後の引数リストが含まれており、サブコマンド関数に引数として渡されるリストと同じです。例えば、コマンドラインでhadoop --debug subcmd 1 2 3を実行した場合、${HADOOP_SUBCMD_ARGS[0]}は1になり、hadoop_subcommand_subcmdの$1も1になります。この配列リストは、サブコマンド関数によって変更され、後続の処理のために引数リストから値を追加または削除することができます。

  • HADOOP_SECURE_CLASSNAME

このサブコマンドがセキュアモードをサポートするサービスを実行する場合、この変数はセキュアバージョンのクラス名に設定する必要があります。

  • HADOOP_SUBCMD_SECURESERVICE

これをtrueに設定すると、hadoop_detect_priv_subcmdに関係なく、サブコマンドがセキュアモードで実行されます。HADOOP_SECURE_USERが、最終的なプロセスを実行するユーザーに設定されていることが想定されます。セキュアモードの詳細については、下記を参照してください。

  • HADOOP_SUBCMD_SUPPORTDAEMONIZATION

このコマンドをデーモンとして実行できる場合は、これをtrueに設定します。

  • HADOOP_USER_PARAMS

これは、解析が行われる前のコマンドラインの完全な内容です。--debugなどのフラグが含まれます。操作することはできません。

Apache Hadoopランタイム機能では、それ以上の処理が不要な場合は関数を終了する必要があります。上記のhelloの例では、Javaやその他の機能は必要なかったため、単純なexit $?で十分でした。しかし、関数がHADOOP_CLASSNAMEを使用する場合、Apache Hadoop固有のパラメータを持つJavaが指定されたJavaクラスに対して起動されるように、プログラムの実行を継続する必要があります。別の例としては、回復不能なエラーの場合があります。適切なメッセージを表示し(できればhadoop_error API呼び出しを使用)、適切に終了するのは関数の責任です。

特権での実行(セキュアモード)

DataNodeやNFSゲートウェイなどのデーモンの中には、特権モードで実行されるものがあります。これは、rootとして起動され(デフォルトで)、jsvcを介して別のユーザーIDに切り替えられることが想定されていることを意味します。これにより、これらのデーモンは低い特権ポートを取得し、通常の処理中はスーパーユーザー権限をドロップできます。動的サブコマンドを利用するサードパーティも、特権での実行が可能です。以下の条件がすべて真である場合

  • (command)_(subcommand)_SECURE_USER環境変数が定義され、有効なユーザー名を指している
  • HADOOP_SECURE_CLASSNAMEが定義され、有効なJavaクラスを指している

シェルスクリプトは、ビルトイン関数と同様に、コマンドを特権を持って実行しようとします。一般的に、ユーザーは_SECURE_USER変数を定義し、開発者はシェルスクリプトのブートストラップで_CLASSNAMEを定義することが期待されます。