18

我需要从 Windows 框等外部源将数据写入 Hadoop (HDFS)。现在我一直在将数据复制到名称节点并使用 HDFS 的 put 命令将其摄取到集群中。在我浏览代码时,我没有看到用于执行此操作的 API。我希望有人能告诉我我错了,并且有一种简单的方法可以针对 HDFS 对外部客户端进行编码。

4

8 回答 8

17

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 处理的流。

于 2009-10-27T10:17:18.650 回答
13

对于加载我需要放入HDFS的数据的问题,我选择了扭转这个问题。

我没有将文件从它们所在的服务器上传到 HDFS,而是编写了一个 Java Map/Reduce 作业,其中映射器从文件服务器(在本例中通过 https)读取文件,然后将其直接写入 HDFS(通过Java应用程序接口)。

从输入中读取文件列表。然后我有一个外部脚本,它用要获取的文件列表填充文件,将文件上传到 HDFS(使用hadoop dfs -put),然后使用相当数量的映射器启动 map/reduce 作业。

这给了我出色的传输性能,因为同时读取/写入了多个文件。

也许不是您正在寻找的答案,但无论如何希望对您有所帮助:-)。

于 2009-11-06T20:28:14.557 回答
12

在我上次回答大约 2 年后,现在有两个新的替代方案 - Hoop/HttpFS 和 WebHDFS。

关于 Hoop,最早是在Cloudera 的博客中公布的,可以从github 存储库中下载。我已经设法让这个版本成功地与至少 Hadoop 0.20.1 通信,它可能也可以与稍旧的版本通信。

如果您正在运行在撰写本文时仍未发布的 Hadoop 0.23.1,那么 Hoop 作为其自己的组件 HttpFS 是 Hadoop 的一部分。这项工作是作为HDFS-2178的一部分完成的。Hoop/HttpFS 不仅可以作为 HDFS 的代理,还可以作为其他与 Hadoop 兼容的文件系统(例如 Amazon S3)的代理。

Hoop/HttpFS 作为自己的独立服务运行。

还有作为 NameNode 和 DataNode 服务的一部分运行的WebHDFS 。它还提供了一个 REST API,如果我理解正确的话,它与 HttpFS API 兼容。WebHDFS 是 Hadoop 1.0 的一部分,它的主要特性之一是它提供了数据局部性——当您发出读取请求时,您将被重定向到数据所在数据节点上的 WebHDFS 组件。

选择哪个组件取决于您当前的设置以及您的需求。如果您现在需要到 HDFS 的 HTTP REST 接口并且您正在运行的版本不包含 WebHDFS,那么从 github 存储库中的 Hoop 开始似乎是最简单的选择。如果您正在运行包含 WebHDFS 的版本,除非您需要 Hoop 具有 WebHDFS 缺乏的某些功能(访问其他文件系统、带宽限制等),否则我会这样做。

于 2012-01-22T12:47:37.683 回答
11

安装 Cygwin,在本地安装 Hadoop(您只需要指向 NN 的二进制文件和配置——无需实际运行服务),运行hadoop fs -copyFromLocal /path/to/localfile /hdfs/path/

您还可以使用新的 Cloudera 桌面通过 Web UI 上传文件,但这对于大型文件可能不是一个好的选择。

HDFS 还有一个 WebDAV 覆盖,但我不知道它有多稳定/可靠。

于 2009-10-07T18:27:57.157 回答
3

现在似乎在 http://wiki.apache.org/hadoop/MountableHDFS有一个专门的页面:

这些项目(列举如下)允许使用 mount 命令将 HDFS 挂载(在大多数 Unix 风格上)作为标准文件系统。挂载后,用户可以使用标准 Unix 实用程序(例如 'ls'、'cd'、'cp'、'mkdir'、'find'、'grep')对 hdfs 实例进行操作,或使用标准 Posix 库,如 open,从 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 相同的需求

于 2012-12-14T19:59:14.630 回答
0

您现在还可以尝试使用 Talend,它包含用于 Hadoop 集成的组件。

于 2013-06-29T06:55:39.733 回答
0

您可以尝试在执行代码的机器上安装 HDFS(称为 machine_X),并且 machine_X 应该与 HDFS 具有 infiniband 连接检查这一点,https://wiki.apache.org/hadoop/MountableHDFS

于 2014-07-15T21:50:35.150 回答
0

您还可以使用 HadoopDrive ( http://hadoopdrive.effisoft.eu )。这是一个 Windows shell 扩展。

于 2015-10-22T07:26:37.710 回答