我已经搜索了一段时间,但似乎没有一个解决方案适合我。
非常简单 - 我想使用 Java API 将数据从本地文件系统上传到 HDFS。 Java 程序将在已配置为通过 shell 与远程 Hadoop 集群通信的主机上运行(即hdfs dfs -ls
, etc.).
我在我的项目中包含了以下依赖项:
hadoop-core:1.2.1
hadoop-common:2.7.1
hadoop-hdfs:2.7.1
我的代码如下所示:
File localDir = ...;
File hdfsDir = ...;
Path localPath = new Path(localDir.getCanonicalPath());
Path hdfsPath = new Path(hdfsDir.getCanonicalPath());
Configuration conf = new Configuration();
conf.set("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());
conf.set("fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class.getName());
Filesystem fs = FileSystem.get(configuration);
fs.getFromLocalFile(localPath, hdfsPath);
本地数据没有复制到Hadoop集群,但没有报错,也没有抛出异常。我已启用TRACE
记录为org.apache.hadoop
包裹。我看到以下输出:
DEBUG Groups:139 - Creating new Groups object
DEBUG Groups:139 - Creating new Groups object
DEBUG Groups:59 - Group mapping impl=org.apache.hadoop.security.ShellBasedUnixGroupsMapping; cacheTimeout=300000
DEBUG Groups:59 - Group mapping impl=org.apache.hadoop.security.ShellBasedUnixGroupsMapping; cacheTimeout=300000
DEBUG UserGroupInformation:147 - hadoop login
DEBUG UserGroupInformation:147 - hadoop login
DEBUG UserGroupInformation:96 - hadoop login commit
DEBUG UserGroupInformation:96 - hadoop login commit
DEBUG UserGroupInformation:126 - using local user:UnixPrincipal: willra05
DEBUG UserGroupInformation:126 - using local user:UnixPrincipal: willra05
DEBUG UserGroupInformation:558 - UGI loginUser:<username_redacted>
DEBUG UserGroupInformation:558 - UGI loginUser:<username_redacted>
DEBUG FileSystem:1441 - Creating filesystem for file:///
DEBUG FileSystem:1441 - Creating filesystem for file:///
DEBUG FileSystem:1290 - Removing filesystem for file:///
DEBUG FileSystem:1290 - Removing filesystem for file:///
DEBUG FileSystem:1290 - Removing filesystem for file:///
DEBUG FileSystem:1290 - Removing filesystem for file:///
任何人都可以帮助我解决这个问题吗?
编辑 1:(2015 年 9 月 15 日)
我已经删除了 2 个 Hadoop 依赖项 - 我现在只使用一个:
hadoop-core:1.2.1
我的代码现在如下:
File localDir = ...;
File hdfsDir = ...;
Path localPath = new Path(localDir.getCanonicalPath());
Path hdfsPath = new Path(hdfsDir.getCanonicalPath());
Configuration conf = new Configuration();
fs.getFromLocalFile(localPath, hdfsPath);
我之前使用以下命令执行我的应用程序:
$ java -jar <app_name>.jar <app_arg1> <app_arg2> ...
现在我用这个命令执行它:
$ hadoop jar <app_name>.jar <app_arg1> <app_arg2> ...
通过这些更改,我的应用程序现在可以按预期与 HDFS 交互。据我所知,hadoop jar
命令仅适用于打包为可执行 jar 的 MapReduce 作业,但这些更改对我来说很有效。