1
killpanda 2013-06-30 22:27:38 +08:00
hadoop streaming
貌似复杂的排序之类的支持的不好 |
2
likuku 2013-06-30 22:50:24 +08:00
嗯,最近一周正全力在搞这个,刚好昨天也拿 python 写 map/reduce 测试过。
13天的邮件日志文本,一天一个,总量62GB,存有5个数据节点的hdfs。 以 hadoop streaming 方式跑 很简单的 python,搜索发给 qq.com 的失败退信,取出退信代码,按退信代码分类求数量。 hadoop 跑了9分8秒,大部分都是map时间,reduce 瞬间完成。 然后在一台单机(与一台数据节点机器配置一样),用 一行指令完成同样事情: time cat * | grep "@qq.com" | grep -v "success" | awk -F "," '{print $7 $8}' | sort | uniq -c 耗时28分25秒。 |
3
clowwindy 2013-06-30 23:01:17 +08:00
缺点是只能处理单行文本,否则要转义掉回车。
|
5
ivanlw 2013-07-01 07:51:26 +08:00
昨天刚把这个跑了一遍……看到标题就猜到可能是这个了=.=
|
6
rrfeng 2013-07-01 08:50:24 +08:00
@likuku
sort 开销巨大…… 你的任务完全可以只用 awk 一次搞定 awk -F ',' '/@qq\.com/&&!/success/{!a[$7,$8]++}' 唯一的缺点就是最后一步去重可能会吃掉大量内存,视你的数据情况而定 |
7
rrfeng 2013-07-01 08:57:35 +08:00
|
9
rrfeng 2013-07-01 14:29:47 +08:00
@likuku
其实还是错了。。。uniq -c 是计数,我看成去重了哈哈 awk -F ',' '/@qq\.com/&&!/success/{a[$7" "$8]++}END{for(i in a)print i,a[i]}' 你跑跑试试多长时间呗 最后消耗的内存相当于 ... | sort | uniq 之后每行作为 key 存入一个数组,比文件大小略大。 |
10
cloudzhou 2013-07-01 15:14:02 +08:00
cat * | grep "@qq.com" 这个方式也会带来性能问题
直接 grep "@qq.com" * 就可以了 |
12
likuku 2013-07-01 21:06:25 +08:00
|
13
rrfeng 2013-07-02 08:26:47 +08:00
|
14
ysjdx 2013-07-02 08:41:46 +08:00
学习了~都是大神
|
16
bengol 2013-07-02 22:57:26 +08:00
个人感觉就是n*n
|
17
rrfeng 2013-07-02 23:29:18 +08:00
@lovejoy
-F ',' 以逗号作分隔符 /pattern1/&&/pattern2/ 匹配两个条件的行 {a[$7" "$8]++} 满足上面条件的行 以 [$7" "$8] 作为键存入数组a,如果重复就是 ++ 递增 END{} 在所有文件读入结束之后执行的程序块,输出数组a的所有键以及值 |