【问题标题】:How can I create one linux shell command out of two commands that behaves like standard piping?如何从行为类似于标准管道的两个命令中创建一个 linux shell 命令?
【发布时间】:2012-05-12 20:05:48
【问题描述】:

我正在尝试使用 Hadoop Streaming 来运行两个命令,例如 gunzip | map_to_old_format.py,但是 gzip 错误提示“|.gz not found”或类似的内容(仅当通过 Hadoop 运行时.. 如果我运行在命令行上,它工作正常)。

由于我不知道如何即时在 Python 中进行 gunzip,因此我想创建一个 shell 脚本来为我执行此命令的组合(例如 gunzip_and_map_to_old.sh)。我尝试了以下方法,但 gzip 不喜欢(gzip 抱怨“gzip:stdin:不是 gzip 格式”):

#!/bin/bash
while read data; do
    echo $data | gunzip | map_to_old_format.py $2
done

关于python gunzip,我尝试了f = gzip.GzipFile("", "rb", fileobj=sys.stdin) 以及here 描述的Wrapper 方法。

【问题讨论】:

    标签: python bash hadoop gzip hadoop-streaming


    【解决方案1】:

    我对 Hadoop 一无所知,但我猜echo $data | gunzip 不起作用,因为$datadata 的一行,而$data 本身可能不是gzip 格式。与其逐行传递数据,不如在 bash 脚本文件中这样做?

    #!/bin/bash
    gunzip | map_to_old_format.py
    

    然后您可以通过像这样传入 gzip 文件来调用它:

    cat data.gz | gunzip_and_map_to_old.sh
    

    【讨论】:

    • 嗯,这比我想象的要简单!谢谢:)
    【解决方案2】:

    Hadoop 流通常使用 TextInputFormat 读取输入文件,并通过 std in 将其逐行传递给您的 python 映射器(使用制表符分隔键和值(在大多数情况下是行号和行文本)。

    如果输入文件的文件扩展名不以 .gz 结尾,那么 hadoops TextInputFormat 在一次传递一行之前将不知道 gunzip 文件内容。您可以按照其他答案中的建议配置属性以强制 hadoop 压缩文件。

    【讨论】:

      【解决方案3】:

      这并不能回答我的确切问题,但我可以通过在我的 Hadoop 命令 (source where I learned this) 中添加 -jobconf stream.recordreader.compression=gzip 来绕过它:

      hadoop jar /usr/lib/hadoop/contrib/streaming/hadoop-streaming-*.jar \
          -jobconf stream.recordreader.compression=gzip \
          -D mapred.reduce.tasks=0 \
          -file map_to_old_format.py \
          -mapper map_to_old_format.py \
          -input /mydata/* -output output/newdata
      

      注意:我仍然很好奇如何通过 shell 脚本完成上述操作,所以如果可能的话,请告诉我。

      【讨论】:

      • 那样做有什么问题?我想你也可以使用 -D mapred.input.compression.codec='org.apache.hadoop.io.compress.GzipCodec'
      • 这种方式没有错,你的方式也没有。我在发布我的问题后才发现它,但很好奇如何假设使用 shell-scripting 方法(redcurry 用他的回答确定了这个方法)。感谢您提供此替代设置:)
      猜你喜欢
      • 2019-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-03
      • 2012-06-18
      • 2018-10-09
      • 1970-01-01
      相关资源
      最近更新 更多