【发布时间】:2010-12-04 17:39:51
【问题描述】:
我需要从 Windows 框等外部源将数据写入 Hadoop (HDFS)。现在我一直在将数据复制到名称节点并使用 HDFS 的 put 命令将其摄取到集群中。在我浏览代码时,我没有看到用于执行此操作的 API。我希望有人能告诉我我错了,并且有一种简单的方法可以针对 HDFS 对外部客户端进行编码。
【问题讨论】:
我需要从 Windows 框等外部源将数据写入 Hadoop (HDFS)。现在我一直在将数据复制到名称节点并使用 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),然后以相当数量的映射器。
这给了我出色的传输性能,因为同时读取/写入了多个文件。
也许不是您要找的答案,但希望对您有所帮助:-)。
【讨论】:
在我上次回答大约 2 年后,现在有两个新的替代方案 - Hoop/HttpFS 和 WebHDFS。
关于 Hoop,它在Cloudera's blog 首次公布,可以从github repository 下载。我已经设法让这个版本至少与 Hadoop 0.20.1 成功通信,它可能也可以与稍旧的版本通信。
如果您运行的 Hadoop 0.23.1 在撰写本文时仍未发布,那么 Hoop 作为其自己的组件 HttpFS 是 Hadoop 的一部分。这项工作是作为HDFS-2178 的一部分完成的。 Hoop/HttpFS 不仅可以作为 HDFS 的代理,还可以作为 Amazon S3 等其他 Hadoop 兼容文件系统的代理。
Hoop/HttpFS 作为自己的独立服务运行。
还有 WebHDFS 作为 NameNode 和 DataNode 服务的一部分运行。它还提供了一个 REST API,如果我理解正确的话,它与 HttpFS API 兼容。 WebHDFS 是 Hadoop 1.0 的一部分,其主要功能之一是它提供数据本地性 - 当您发出读取请求时,您将被重定向到数据所在数据节点上的 WebHDFS 组件。
选择哪个组件取决于您当前的设置和您的需求。如果您现在需要到 HDFS 的 HTTP REST 接口并且您正在运行的版本不包含 WebHDFS,那么从 github 存储库中的 Hoop 开始似乎是最简单的选择。如果您正在运行包含 WebHDFS 的版本,除非您需要 Hoop 具有的 WebHDFS 所缺乏的某些功能(访问其他文件系统、带宽限制等),否则我会这样做。
【讨论】:
安装 Cygwin,在本地安装 Hadoop(您只需要指向 NN 的二进制文件和配置 - 无需实际运行服务),运行 hadoop fs -copyFromLocal /path/to/localfile /hdfs/path/
您还可以使用新的 Cloudera 桌面通过 Web UI 上传文件,但这对于大型文件可能不是一个好的选择。
还有一个用于 HDFS 的 WebDAV 覆盖,但我不知道它有多稳定/可靠。
【讨论】:
现在http://wiki.apache.org/hadoop/MountableHDFS似乎有一个专门的页面:
这些项目(列举如下)允许挂载 HDFS(在大多数 Unix 风格)作为标准文件系统使用 mount 命令。 安装后,用户可以使用 hdfs 对实例进行操作 标准 Unix 实用程序,例如 'ls'、'cd'、'cp'、'mkdir'、'find'、 'grep',或使用标准 Posix 库,如打开、写入、读取、关闭 来自 C、C++、Python、Ruby、Perl、Java、bash 等。
稍后会描述这些项目
- contrib/fuse-dfs 建立在 fuse、一些 C 胶水、libhdfs 和 hadoop-dev.jar 之上
- fuse-j-hdfs 是基于 fuse、fuse for java 和 hadoop-dev.jar 构建的
- hdfs-fuse - 一个谷歌代码项目,非常类似于 contrib/fuse-dfs
- webdav - hdfs 暴露为 webdav 资源 mapR - 包含支持读/写的封闭源 hdfs 兼容文件系统 NFS 访问
- HDFS NFS 代理 - 将 HDFS 导出为 NFS,而不使用熔断器。支持 Kerberos 并重新排序写入,以便将它们写入 hdfs 按顺序排列。
我没有尝试过任何这些,但我会尽快更新答案,因为我有与 OP 相同的需求
【讨论】:
您现在也可以尝试使用 Talend,它包含用于 Hadoop 集成的组件。
【讨论】:
您可以尝试在执行代码的机器上安装 HDFS(称为 machine_X),并且 machine_X 应该与 HDFS 具有 infiniband 连接检查这一点,https://wiki.apache.org/hadoop/MountableHDFS
【讨论】:
您也可以使用 HadoopDrive (http://hadoopdrive.effisoft.eu)。这是一个 Windows shell 扩展。
【讨论】: