【问题标题】:Pipe multiple files to HDFS将多个文件通过管道传输到 HDFS
【发布时间】:2015-02-18 22:31:28
【问题描述】:

我正在尝试将 gzip 压缩文件从远程计算机上的目录加载到本地计算机的 HDFS 上。我希望能够从远程机器读取 gzip 压缩文件并将它们直接通过管道传输到本地机器上的 HDFS。这是我在本地机器上得到的:

ssh remote-host "cd /files/wanted; tar -cf - *.gz" | tar -xf - | hadoop fs -put - "/files/hadoop"

这显然会将所有 gzip 压缩文件从指定的远程路径复制到我执行命令的路径并将空文件 - 加载到 HDFS 中。如果我在没有tar 的情况下尝试它也会发生同样的事情:

ssh remote-host "cd /files/wanted; cat *.gz" | hadoop fs -put - "/files/hadoop"

只是为了看看我是否遗漏了一些简单的东西,我在本地机器上尝试了以下操作:

tar -cf - *.gz | tar -xf -C tmp

这符合我的预期,它将当前目录中的所有 gzip 压缩文件放入现有目录 tmp

然后在本地机器上使用 Hadoop 部分:

cat my_file.gz | hadoop fs -put - "/files/hadoop"

这也符合我的预期,它将我的 gzip 文件放入 HDFS 上的/files/hadoop

不能将多个文件通过管道传输到 HDFS 中吗?

【问题讨论】:

  • 我读了一遍又一遍,我不明白哪一部分不适合你:-/
  • @maksimov 所以它将前两个命令中的文件从远程主机复制到本地主机,这是不应该发生的(所以我想)。它应该直接进入 HDFS,由于某种原因,将多个文件传送到不起作用的 HDFS。
  • 这是相关的:stackoverflow.com/questions/11270509/…,但是他们正在走另一条路,但它可能会给你一些线索。请注意,当直接通过管道连接到 hdfs 时,OP 发现了性能问题。
  • @maksimov 是的,这正是我现在能做的,问题在于多个文件。嗯,我看到他在哪里提到管道的性能问题,但这没有意义。我想我会尝试两种方式,看看是否出于某种奇怪的原因。

标签: hadoop pipe hdfs


【解决方案1】:

无论出于何种原因,我似乎无法将多个文件通过管道传输到 HDFS。所以我最终做的是创建一个后台 SSH 会话,这样我就不必为要加载的每个文件都创建一个:

ssh -fNn remote-host

然后遍历我需要加载到 HDFS 的文件列表并将每个文件通过管道输入:

for file in /files/wanted/*; do
  ssh -n remote-host "cat $file" | "hadoop fs -put - /files/hadoop/$file"
done

还要确保关闭 SSH 会话:

ssh -O exit remote-host

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    相关资源
    最近更新 更多