Hadoopクラスターがセットアップされており、共通のデフォルトユーザー名「user1」で作業しています。 hadoopクラスターの一部ではないリモートマシンからhadoopにファイルを配置したい。リモートマシンでhadoopファイルを構成し、
hadoop dfs -put file1 ...
リモートマシンから呼び出され、file1をHadoopクラスターに配置します。
唯一の問題は、リモートマシンに「user2」としてログインしているため、期待どおりの結果が得られないことです。実際、上記のコードは、次のようにリモートマシンでのみ実行できます。
hadoop dfs -put file1 /user/user2/testFolder
しかし、私が本当に欲しいのは、ファイルを次のように保存できるようにすることです。
hadoop dfs -put file1 /user/user1/testFolder
最後のコードを実行しようとすると、アクセス許可のためにhadoopがエラーをスローします。とにかくhadoop dfsコマンド内でユーザー名を指定できるのでしょうか?
私は次のようなものを探しています:
hadoop dfs -username user1 file1 /user/user1/testFolder
ありがとう
デフォルトでは、Hadoopで認証と許可はオフになっています。 Hadoop-The Definitive Guide (ところで、ニースの本-それを購入することをお勧めします)
HadoopがHDFSの権限に使用するユーザーIDは、クライアントシステムでwhoamiコマンドを実行することにより決定されます。同様に、グループ名は実行中のグループの出力から導出されます。
したがって、必要なユーザー名を返す新しいwhoami
コマンドを作成し、適切にPATHに入れると、Linuxに付属する実際のwhoamiが見つかる前に、作成されたwhoamiが見つかります。同様に、groups
コマンドでも遊ぶことができます。
これはハッキングであり、認証と承認がオンになると機能しません。
HADOOP_USER_NAME環境変数を使用すると、操作するユーザー名をHDFSに伝えることができます。これは、クラスターがセキュリティ機能(Kerberosなど)を使用していない場合にのみ機能することに注意してください。例えば:
HADOOP_USER_NAME=hdfs hadoop dfs -put ...
これは誰にとっても問題ではないかもしれませんが、私はこのために小さなハックを使用しています。
.bash_profileでHADOOP_USER_NAMEをエクスポートしているため、ログインするたびにユーザーが設定されます。
次のコード行を.bash_profileに追加するだけです。
export HADOOP_USER_NAME=<your hdfs user>
Ssh経由のストリーミングを使用して回避策を提供できる、これに類似した別の投稿があります。
cat file.txt | ssh user1@clusternode "hadoop fs -put - /path/in/hdfs/file.txt"
詳細については、 ローカルファイルにコピーせずにリモートファイルをhadoopに入れる を参照してください。