【问题标题】:Writing data to Hadoop将数据写入 Hadoop
【发布时间】:2010-12-04 17:39:51
【问题描述】:

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

【问题讨论】:

    标签: hadoop hdfs


    【解决方案1】:

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

    【讨论】:

    • 更具体地说(并使用 hadoop jar code.jar {classname} 运行) org.apache.hadoop.fs.FileSystem.get(new org.apache.hadoop.mapred.JobConf()).create (new org.apache.hadoop.fs.Path("however.file"));
    【解决方案2】:

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

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

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

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

    也许不是您要找的答案,但希望对您有所帮助:-)。

    【讨论】:

      【解决方案3】:

      在我上次回答大约 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 所缺乏的某些功能(访问其他文件系统、带宽限制等),否则我会这样做。

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

          现在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 相同的需求

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                【解决方案8】:

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2017-07-22
                  • 2012-01-14
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-07-22
                  • 1970-01-01
                  相关资源
                  最近更新 更多