将数据写入Hadoop

时间:2009-10-07 18:22:42

标签: hadoop hdfs

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

8 个答案:

答案 0 :(得分: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处理的流。

答案 1 :(得分:13)

对于加载我需要输入HDFS的数据的问题,我选择解决问题。

我没有将文件从他们所在的服务器上传到HDFS,而是写了一个Java Map / Reduce作业,映射器从文件服务器读取文件(在这种情况下通过https),然后直接写入HDFS(通过Java API)。

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

这使我具有出色的传输性能,因为可以同时读/写多个文件。

也许不是你想要的答案,但无论如何都希望有用: - )。

答案 2 :(得分:12)

在我上一次回答后大约2年,现在有两个新的选择 - Hoop / HttpFS和WebHDFS。

关于Hoop,它首先在Cloudera's blog宣布,可以从github repository下载。我已经设法让这个版本成功地与至少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缺少的功能(访问其他文件系统,带宽限制等)

答案 3 :(得分:11)

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

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

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

答案 4 :(得分:3)

现在http://wiki.apache.org/hadoop/MountableHDFS

似乎有专门的页面
  

这些项目(下面列举)允许安装HDFS(大多数情况下)   使用mount命令作为标准文件系统的Unix版本。   安装后,用户可以使用hdfs实例进行操作   标准的Unix实用程序,如'ls','cd','cp','mkdir','find',   'grep',或使用标准的Posix库,如open,write,read,close   来自C,C ++,Python,Ruby,Perl,Java,bash等。

后来它描述了这些项目

  
      
  • contrib / fuse-dfs建立在fuse,some C glue,libhdfs和hadoop-dev.jar
  • 之上   
  • fuse-j-hdfs建立在保险丝上,用于java的保险丝和hadoop-dev.jar
  •   
  • hdfs-fuse - 谷歌代码项目与contrib / fuse-dfs
  • 非常相似   
  • webdav - 作为webdav资源mapR公开的hdfs - 包含支持读/写的封闭源hdfs兼容文件系统   NFS访问
  •   
  • HDFS NFS代理 - 在不使用保险丝的情况下将HDFS导出为NFS。支持Kerberos并重新排序写入,以便将它们写入hdfs   顺序。
  •   

我还没有尝试过这些,但我会尽快更新答案,因为我有与OP相同的需求

答案 5 :(得分:0)

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

答案 6 :(得分:0)

你可以尝试在你的机器上安装HDFS(称之为machine_X)你执行代码的地方和machine_X应该与HDFS有infiniband连接检查这个,https://wiki.apache.org/hadoop/MountableHDFS

答案 7 :(得分:0)

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