本帖最后由 pig2 于 2014-8-3 14:40 编辑
我们写mapreduce的过程中,会不会产生这些疑问。比如:
我们在MapReduce初级案例(3):使用MapReduce实现平均成绩,我们会特意,换行,让mapreduce能够识别。
1)math:
复制代码
2)chinese :
复制代码 那么为什么需要换行。因为mapreduce默认是以行为处理单位。
那么假如我们的日志或则待处理的文件,不是以行为单位,那么会产生什么问题。
183.131.11.98 - - [01/Aug/2014:01:01:05 +0800] "GET /thread-5981-1-1.html HTTP/1.1" 200 18152 "http://www.baidu.com/s?wd=cocos2dx%203.2%20wp8%E6%94%AF%E6%8C%81&pn=30&oq=cocos2dx%203.2%20wp8%E6%94%AF%E6%8C%81&tn=28035039_2_pg&ie=utf-8&rsv_page=1" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 UBrowser/1.0.349.1252 Safari/537.36"
183.131.11.98 - - [01/Aug/2014:01:01:06 +0800] "GET /data/cache/style_1_common.css?A4A HTTP/1.1" 200 15402 "http://www.aboutyun.com/thread-5981-1-1.html" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 UBrowser/1.0.349.1252 Safari/537.36"
183.131.11.98 - - [01/Aug/2014:01:01:06 +0800] "GET /data/cache/style_1_forum_viewthread.css?A4A HTTP/1.1"
像上面日志,我们能否处理,答案是不可以的。
原因:
因为mapreduce中map函数所接受的参数,是其中的一行,这一行是哪里来的,是由mapreduce框架来处理的。这是很多迷惑的地方。
总结:
对于日志记录如果不是以行数来记录一条数据的话,那么mapreduce就不能处理。
而这里的一条记录的定义包含如下信息:
183.131.11.98 - - [01/Aug/2014:01:01:05 +0800] "GET /thread-5981-1-1.html HTTP/1.1" 200 18152 "http://www.baidu.com/s?wd=cocos2dx%203.2%20wp8%E6%94%AF%E6%8C%81&pn=30&oq=cocos2dx%203.2%20wp8%E6%94%AF%E6%8C%81&tn=28035039_2_pg&ie=utf-8&rsv_page=1" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 UBrowser/1.0.349.1252 Safari/537.36"
也就是说,在一行中如果日志记录了两条数据,那么map就会收到两条记录,但是我们在处理的过程中,都是按照一条来处理的,所以就会产生错误。
我们在看上面日志
上面的日志可以的,为什么。因为这里的一条记录放在了一行。
可是你会反驳说,这明明是三行,这有点像咱们的文本框,如果你去掉换行,那么这条信息:
183.131.11.98 - - [01/Aug/2014:01:01:05 +0800] "GET /thread-5981-1-1.html HTTP/1.1" 200 18152 "http://www.baidu.com/s?wd=cocos2dx%203.2%20wp8%E6%94%AF%E6%8C%81&pn=30&oq=cocos2dx%203.2%20wp8%E6%94%AF%E6%8C%81&tn=28035039_2_pg&ie=utf-8&rsv_page=1" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 UBrowser/1.0.349.1252 Safari/537.36"
如上,则是直接显示在一行。
现在留下一个问题?
对于一条记录放在了两行或则多行,mapreduce能否处理?怎么样mapreduce才能处理。
进一步:
Apache日志一条记录是否都放在一行?
|