使用s3a在MapReduce处理CommonCrawl WARC文件:换行符被替换原因问询
MapReduce处理CommonCrawl WARC文件时回车符被替换为制表符的问题解析
你遇到的这个问题其实是Hadoop Streaming默认的文本处理逻辑在“搞鬼”,咱们来拆解下背后的原因:
核心原因:Hadoop Streaming的LineReader默认行为
Hadoop Streaming默认使用LineInputFormat来读取输入数据,它的底层LineReader组件有个默认规则:会把输入中所有的换行符(包括\n、\r、\r\n这类不同系统的换行符)统一替换成制表符(\t)。
这个规则和你用的s3a输入格式无关——不管你是从S3、HDFS还是其他存储源读取数据,只要用的是默认的LineInputFormat,都会触发这个替换行为。它的设计初衷是为了统一不同系统下的行分隔符,但显然和你想保留WARC文件原始行尾格式的需求冲突了。
结合你的代码看问题
你的mapper代码只是把sys.stdin读到的每一行直接输出,但这里的line已经被Hadoop的LineReader处理过了:原始WARC文件里的行尾回车符已经被替换成了制表符,所以你输出的内容自然就没有回车,变成了制表符结尾。
快速解决方法
如果想保留原始的换行符,只需要在启动MapReduce的命令里添加一个配置参数,指定行终止符为你需要的换行符即可:
time yarn jar /usr/hdp/current/hadoop-mapreduce-client/hadoop-streaming.jar \ -D mapred.compress.map.output=true \ -D mapred.reduce.tasks=0 \ -D mapred.job.name=cc \ -D fs.s3a.aws.credentials.provider=org.apache.hadoop.fs.s3a.AnonymousAWSCredentialsProvider \ -D mapreduce.input.lineinputformat.lines.terminator=\n # 新增这个配置 -files mapper.py \ -archives wasbs://cluster@ccscsg.blob.core.windows.net/user/ubuntu/virtualenv/.venv2.zip#venv \ -mapper mapper.py \ -input s3a://commoncrawl/crawl-data/CC-MAIN-2018-39/segments/1537267155413.17/warc/CC-MAIN-20180918130631-20180918150631-00000.warc.gz \ -output /output_warc
如果WARC文件里是Windows风格的\r\n换行,就把参数值改成\r\n即可。
另外提一句:WARC文件有专门的格式规范,如果你后续需要解析WARC的内容(比如提取网页、元数据),建议用专门的解析库(比如Python的warcio),这样能避免手动处理行分割带来的各种问题。
内容的提问来源于stack exchange,提问作者Afe
相关产品推荐
相关产品推荐

