前提・実現したいこと
hadoop、Linux、Java等諸々勉強中です。
hadoopを使って大量のファイルをexeファイルの処理にかけようとしています。
そのためにMapperクラス内で処理のためのexeを実行したいのですが、exe実行時にエラーが出てしまい、どうしても実行できません。
OSはCentOS7(VMware)、Hadoop2.9.2です。現時点では疑似分散モードを使っています。
Linuxでexeを動かすためにwineを使おうとしています。
発生している問題・エラーメッセージ
wine: '/home' is not owned by you, refusing to create a configuration directory there
該当のソースコード
公式ページのチュートリアル(https://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html)にあるソースをほぼそのまま使っています。
Mapperクラス内のmap()関数に以下の内容を実装し、コンパイルしたものをbin/hadoop jarで実行しています。
java
1String fileName = ((FileSplit) context.getInputSplit()).getPath().getName(); 2ProcessBuilder pb = new ProcessBuilder( "./test.exe", fileName ); 3Process process = pb.start(); 4process.waitFor() 5InputStream es = process.getErrorStream() // エラーメッセージ取得
試したこと
■ WINEPREFIXでディレクトリを指定
HDFS内にjavaの上記のProcessBuilder実行前に、以下を書き加えました。
java
1ProcessBuilder pb_ex = new ProcessBuilder( "export", "WINEPREFIX=/user/(username)/wine_env" ); // ディレクトリ/user/(username)/wine_envは作成済み 2Process process_ex = pb_ex.start(); 3process_ex.waitFor();
これについてはProcessBuilderで「export」が使えず、失敗でした。
(java.io.IOException: Cannot run program "export"…というエラーが出ます)
■ /homeを作成し、chownを使用
terminal上で以下を実行した後、jarファイルを実行しました。
bin/hdfs dfs -chown (username) /home
これについては他にsudoを頭につける、 -chown -R としてみる、というのも試しましたが、どちらも結局「wine: '/home' is not owned by you, ...」が出てしまいました。
■ アクセス権限の変更
HDFS上の/homeのアクセス権限が
【drwxr-xr-x 】
だったため、hdfs dfs -chmodを使い以下の状態に変更しました。
【drwxrwxrwx】
これでも「wine: '/home' is not owned by you, ...」が出てしまいました。
ほかのやり方が思いつかないため、アドバイス頂けると幸いです。
補足情報(FW/ツールのバージョンなど)
OS:CentOS 7(VMware)
Hadoop 2.9.2
java openjdk 1.8.0_191
exeファイルは以下のimportと-files引数を使うことで持ち込んでいます。
import org.apache.hadoop.util.GenericOptionsParser;
あなたの回答
tips
プレビュー