|
TOP
|
|
用 MapReduce 解决与云计算相关的 Big Data 问题(二)
|
ducer(ip_key_val):
ip, count = ip_key_val
return (ip, sum(sum(count,[])))
def start_mr(mapper_func, reducer_func, files, processes=8, chunksize=1):
pool = Pool(processes)
map_output = pool.map(mapper_func, files, chunksize)
partitioned_data = ip_partition(chain(*map_output))
reduced_output = pool.map(reducer_func, partitioned_data)
return reduced_output
def print_report(sort_list, num=25):
for items in sort_list[0:num]:
print "%s, %s" % (items[0], items[1])
def run():
files = glob("*.log")
ip_stats = start_mr(mapper, reducer, files)
sorted_ip_stats = sorted(ip_stats, key=itemgetter(1), reverse=True)
print_report(sorted_ip_stats)
if __name__ == "__main__":
run()
|
图 1 以图形方式说明操作过程。 图 1. IIS 日志文件 MapReduce 图
我们来研究一下代码。您可以看到它非常简短,只有大约 50 行: - mapper
函数提取出每行中的 IP 地址并返回它和值 1。这是 (key,value) 提取阶段,这在生成的每个进程中执行。当产生结果时,把结果收集到一个链式的迭代器中(参见 more on chain(*iterables) and other Python itertools),为缩减阶段做好准备。这称为数据分区。
在 MapReduce 生命周期中,下一步是浓缩和汇总所有中间结果。这由示例中的缩减函数完成,包含缩减阶段。
最后,生成一个很大的列表并输出前 25 个结果。使用多处理模块是为了便于解释 MapReduce,但是这段代码只需稍加修改,就可以在其他一些 MapReduce 云上运行。这个作业的完整输出见清单 2。 清单 2. 运行的清单 1 的完整输出
|
lion% time python iisparse.py
Processing Log File: PoolWorker-1-ex100812.log
Processing Log File: PoolWorker-2-ex100813.log
Processing Log File: PoolWorker-3-ex100814.log
Processing Log File: PoolWorker-4-ex100815.log
Processing Log File: PoolWorker-5-ex100816.log
Processing Log File: PoolWorker-6-ex100817.log
Processing Log File: PoolWorker-7-ex100818.log
Processing Log File: PoolWorker-8-ex100819.log
Processing Log File: PoolWorker-7-ex100820.log
Processing Log File: PoolWorker-3-ex100821.log
Processing Log File: PoolWorker-8-ex100822.log
Processing Log File: PoolWorker-4-ex100823.log
Processing Log File: PoolWorker-6-ex100824.log
Processing Log File: PoolWorker-1-ex100825.log
Processing Log File: PoolWorker-2-ex100826.log
10.0.1.1, 24047
10.0.1.2, 22667
10.0.1.4, 20234
10.0.1.5, 18180
[...output supressed for space, and IP addresses changed for privacy]
python iisparse.py 57.40s user 7.48s system 54% cpu 1:59.47 total
|
结束语 严格地说,云计算可以意味着许多活动,包括在数据中心中的虚拟机上运行顺序的脚本。在本文中,我应用 MapReduce 和云计算背后的一些理论解决汇总大量数据这个实际问题。 基于云的 MapReduce 系统既有开放源码的,也有商用产品。您可以应用从本文学到的知识处理数 PB 的日志文件;因此,MapReduce 抽象是一种非常有用的工具,尤其是在云环境中。 |