我正在研究Hadoop。
我想使用Hadoop与exe文件并行处理数据。
我试图在Mapper类中调用一个exe文件,但是发生了以下错误。
■错误消息:
wine: '/home' is not owned by you, refusing to create a configuration directory there
■我的环境:
OS:CentOS 7(VMWare)
Hadoop 2.9.2(伪分布式)
java openjdk 1.8.0_191
■方法1:指定“ WINEPREFIX”
我在运行时在Java文件中设置了WINEPREFIX。并使用下面的代码。
ProcessBuilder pb_ex = new ProcessBuilder( "export", "WINEPREFIX=/user/(username)/wine_env" ); // the directory /user/(username)/wine_env is exists.
Process process_ex = pb_ex.start();
process_ex.waitFor();
但是,发生以下错误。
Error: java.io.IOException: Cannot run program "export": error=2, No such file or directory
■方法2:“小丑”表示“ / home”
在终端中执行以下代码后,我执行了jar文件。
bin/hdfs dfs -chown (username) /home
or
bin/hdfs dfs -chown -R (username) /home
发生了与第一个错误相同的错误(酒:“ / home”不归您所有,拒绝在此处创建配置目录)。
■方法3:更改访问权限
HDFS上“ ./home”的访问权限从1更改为2。
1:drwxr-xr-x
2:drwxrwxrwx
发生了与第一个错误相同的错误(酒:“ / home”不归您所有,拒绝在此处创建配置目录)。
■源代码:
我使用了官方页面教程中的源代码。 (https://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html)
我如下更改了TokenizerMapper类的“地图”功能。
※“ convertInputStreamToString()”是将Stream值转换为String值的函数。
※“ fileName”已获取。
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
// from here
ProcessBuilder pb = new ProcessBuilder( "./testHello.exe", fileName );
Process process = pb.start();
int ret = process.waitFor();
InputStream is = process.getInputStream();
InputStream es = process.getErrorStream();
String theString1 = convertInputStreamToString(is);
String theString2 = convertInputStreamToString(es);
Text word2 = new Text( ret + " " + cmd + " ," + theString1 + " ," + theString2);
IntWritable one2 = new IntWritable(1);
context.write(word2, one2); // Confirm error message
}
■预期结果:
ret = 0
■实际结果:
ret = 1
theString2 =葡萄酒:'/ home'不是您的所有,拒绝在此处创建配置目录
有人对我可以尝试的其他事情有任何想法吗?
任何帮助将不胜感激。在这里变得绝望。