我正在尝试从Java代码执行hadoop fs -put <source> <destination>
。当我直接从终端执行此命令时,它工作正常,但当我尝试使用
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命令没有被执行,即使它们在终端上工作正常。
可能的原因是什么?如何解决?
JAVA API尝试:我尝试使用java api来执行复制操作,但是我收到错误。 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
文件夹,它具有完整的读写权限,但仍会出现此错误。我无法解决问题
答案 0 :(得分:1)
我猜你可能没有设置HADOOP_HOME
环境变量。
但是既然你是Java,那么当Java API比shell更友好时,为什么你想在外部进程中做haddop fs -put
?
答案 1 :(得分:0)
可以在旧帖子中找到,但如果您还没有尝试过,请使用hadoop jar app_name.jar
而不是java -jar
来执行。这样,如果罐子的类路径没有所有hadoop罐子,它将获取$HADOOP_CLASSPATH
中预定义的罐子。