hdfs—如何使hadoop snappy输出文件与spark生成的格式相同

kxkpmulp  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(396)

我们使用的是spark,到目前为止输出都是psv文件。现在为了节省空间,我们要压缩输出。为此,我们将更改为使用snappycodec保存javardd,如下所示:

objectRDD.saveAsTextFile(rddOutputFolder, org.apache.hadoop.io.compress.SnappyCodec.class);

然后我们将使用sqoop将输出导入数据库。整个过程很好。
对于以前在hdfs中生成的psv文件,我们也希望以snappy格式压缩它们。这是我们尝试的命令:

hadoop jar /usr/hdp/2.6.5.106-2/hadoop-mapreduce/hadoop-streaming-2.7.3.2.6.5.106-2.jar \
-Dmapred.output.compress=true -Dmapred.compress.map.output=true \
-Dmapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec \
-Dmapred.reduce.tasks=0 \
-input input-path \
-output output-path

命令行得通。但问题是,sqoop无法解析snappy输出文件。
当我们使用类似“hdfs dfs-text hdfs file name”的命令查看生成的文件时,输出如下所示,每行中都添加了类似“index”的字段:

0       2019-05-02|AMRS||5072||||3540||MMPT|0|
41      2019-05-02|AMRS||5538|HK|51218||1000||Dummy|45276|
118     2019-05-02|AMRS||5448|US|51218|TRADING|2282|HFT|NCR|45119|

i、 例如,在每行的开头加上一个额外的值,如“0”、“41”、“118”。请注意,spark生成的.snappy文件没有这个“额外字段”。
你知道如何防止这个额外的字段被插入吗?
谢谢!

gc0ot86w

gc0ot86w1#

这些不是索引,而是由 TextInputFormat ,如本文所述。
为输入格式提供的类应该返回文本类的键/值对。如果未指定输入格式类,则默认使用textinputformat。由于textinputformat返回longwritable类的键,而这些键实际上不是输入数据的一部分,因此这些键将被丢弃;只有值将通过管道传输到流Map器。
由于在作业中没有定义任何Map器,因此这些键/值对将直接写入文件系统。因此,正如上面摘录的提示,您需要某种Map器来丢弃这些键。一个快速而肮脏的方法是使用一些已经可用的东西作为传递,比如一个外壳 cat 命令:

hadoop jar /usr/hdp/2.6.5.106-2/hadoop-mapreduce/hadoop-streaming-2.7.3.2.6.5.106-2.jar \
-Dmapred.output.compress=true -Dmapred.compress.map.output=true \
-Dmapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec \
    -mapper /bin/cat \
-Dmapred.reduce.tasks=0 \
-input input-path \
-output output-path

相关问题