我想执行 hadoop fs -put <source> <destination>
来自java代码。当我直接从终端执行这个命令时,它工作得很好,但是当我尝试从java代码中使用
String[] str = {"/usr/bin/hadoop","fs -put", source, dest};
Runtime.getRuntime().exec(str);
我得到的错误是 Error: Could not find or load main class fs
. 我试着从java执行一些非hadoop命令,比如ls,mkdir命令,它们工作得很好,但是hadoop命令没有得到执行,即使它们在终端上工作得很好。
可能的原因是什么?我该如何解决?
javaapi尝试:我试图使用javaapi来执行复制操作,但是我得到了一个错误。java代码是:
String source = "/home/tmpe/file1.csv";
String dest = "/user/tmpe/file1.csv";
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://node1:8020");
FileSystem fs = FileSystem.get(conf);
Path targetPath = new Path(dest);
Path sourcePath = new Path(source);
fs.copyFromLocalFile(false,true,sourcePath,targetPath);
我得到的错误是:
Exception in thread "main" java.io.IOException: Mkdirs failed to create /user/tmpe
at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:378)
at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:364)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:564)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:545)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:452)
at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:229)
at org.apache.hadoop.fs.FileSystem.copyFromLocalFile(FileSystem.java:1230)
我已经创建了 /user/tmpe
文件夹,并且它具有完全的读写权限,但仍然会出现此错误。我无法解决这个问题
2条答案
按热度按时间xdnvmnnf1#
遇到了旧的帖子,但如果你还没有尝试过,请用
hadoop jar app_name.jar
而不是java -jar
. 这样,如果jar的类路径没有所有hadoop jar,它将获取预定义的jar$HADOOP_CLASSPATH
.vc9ivgsu2#
我猜你可能没有
HADOOP_HOME
环境变量集。但是既然你在 java ,你到底为什么要做一个
haddop fs -put
在外部进程中,当javaapi比shell更友好时?