替换HDFS中的control-m字符

时间:2015-12-09 04:45:41

标签: mapreduce hdfs hadoop-streaming

所以......,各种来源的边缘节点都有大量数据。一些文件具有来自特定数据库的评论部分的控制-M字符。

由于文件作为平面文件而不是sqoop登陆边缘节点,因此当文件上传到hive时,control-m字符被视为新记录并且验证失败(hive表获取的行多于源)

解决方案很简单,使用sed删除control-m,perl你有什么。

过了一会儿,边缘节点太紧张了,我正在评估是否可以在HDFS上进行数据清理,以便分配负载(使用map reduce),如下所示:

hadoop jar  /path/to/streaming/hadoop-streaming-2.6.0.2.2.4.2-2.jar  \
-input data/file_with_control-m.txt \
-mapper /bin/cat  \
-reducer "/bin/sh myreducer.sh"  \
-file "/home/shell/myreducer.sh"   \
-output data/output

myreducer.sh

perl -p -i -e "s/\r//g"

# or

sed 's/^M//g'

这样可行,但问题是,map的inherit属性是shuffle / sort,数据没有排序。不只是“记录”,如第5行和第8行互换,即使每个记录中的字段都在随机位置。 Map reduce不保证订购

Pig也不起作用,control-m字符被视为行尾,数据加载方式与hive完全相同(行数多于给定数量)

考虑的其他事项是:

  • 查看源系统是否可以清理文件

  • 源系统指定不同的记录分隔符(我使用它 创建hive表时记录分隔符[以#结尾的行 '源系统记录分隔符'])

虽然这已经完成并且知道订购和Map-Reduce没有合在一起,只需将它放在那里看看是否有办法解决。

0 个答案:

没有答案