我需要从外部源(如Windows框)将数据写入Hadoop(HDFS).现在我一直在将数据复制到namenode上,并使用HDFS的put命令将其摄取到集群中.在我浏览代码时,我没有看到用于执行此操作的API.我希望有人可以告诉我我错了,并且有一种简单的方法可以对外部客户端进行HDFS编码.
Java中有一个API.您可以通过在项目中包含Hadoop代码来使用它.JavaDoc一般非常有用,但当然你必须知道,你在寻找什么*g* http://hadoop.apache.org/common/docs/
有关您的特定问题,请查看:http: //hadoop.apache.org/common/docs/current/api/org/apache/hadoop/fs/FileSystem.html (这适用于最新版本,请参阅其他JavaDocs对于不同的版本!)
典型的调用是:
Filesystem.get(new JobConf()).create(new Path("however.file"));
它返回一个您可以使用常规JavaIO处理的流.
对于加载我需要放入HDFS的数据的问题,我选择解决问题.
我没有将文件从他们所在的服务器上传到HDFS,而是写了一个Java Map/Reduce作业,映射器从文件服务器读取文件(在这种情况下通过https),然后直接写入HDFS(通过Java) API).
从输入中读取文件列表.然后我有一个外部脚本,用一个要获取的文件列表填充文件,将文件上传到HDFS(使用hadoop dfs -put),然后使用相当数量的映射器启动map/reduce作业.
这为我提供了出色的传输性能,因为可以同时读/写多个文件.
也许不是你想要的答案,但无论如何希望有用:-).
在我上一次回答后大约2年,现在有两个新的替代品 - Hoop/HttpFS和WebHDFS.
关于Hoop,它首先在Cloudera的博客中宣布,可以从github存储库下载.我已经成功地让这个版本成功地与至少Hadoop 0.20.1进行了对话,它也可能与较旧的版本对话.
如果您正在运行Hadoop 0.23.1,在编写本文时仍未发布,则Hoop将成为Hadoop的一部分,作为其自己的组件HttpFS.这项工作是作为HDFS-2178的一部分完成的.Hoop/HttpFS不仅可以代理HDFS,还可以代理其他与Hadoop兼容的文件系统,如Amazon S3.
Hoop/HttpFS作为自己的独立服务运行.
还有WebHDFS作为NameNode和DataNode服务的一部分运行.它还提供了一个REST API,如果我理解正确,它与HttpFS API兼容.WebHDFS是Hadoop 1.0的一部分,其主要功能之一是它提供数据局部性 - 当您发出读取请求时,您将被重定向到数据所在的datanode上的WebHDFS组件.
选择哪个组件取决于您当前的设置以及您的需求.如果你现在需要一个到HDFS的HTTP REST接口而你正在运行一个不包含WebHDFS的版本,那么从github存储库开始使用Hoop似乎是最简单的选择.如果您正在运行包含WebHDFS的版本,我会继续这样做,除非您需要一些WebHDFS缺少的功能(访问其他文件系统,带宽限制等)
安装Cygwin,在本地安装Hadoop(你只需要指向NN的二进制文件和配置文件 - 无需实际运行服务),运行 hadoop fs -copyFromLocal /path/to/localfile /hdfs/path/
您还可以使用新的Cloudera桌面通过Web UI上传文件,但这对于巨型文件来说可能不是一个好选择.
还有一个用于HDFS的WebDAV覆盖,但我不知道它是多么稳定/可靠.