zoukankan      html  css  js  c++  java
  • 如何编写MapReduce代码

    关于maperduce,可以参考:http://en.wikipedia.org/wiki/MapReduce

    这里假设你具备一定的hadoop编程经验。

    Mapper接受原始输入,比如网站日志,分析并输出中间结果。经历排序,分组成为Reducer的输入,经过统计汇总,输出结果。当然这个过程可以是多个。

    其中Mapper比较简单,但是需要对输入具有深入的理解,不光是格式还包括意义。其中有如下注意:

    • 一条输入尽量不要拓展为多条输出,因为这会增加网络传输
    • 对于partition的key要仔细选择,这会决定有多少reducer,确保这个的结果尽量均匀分布

    reducer其实有现实的模板,这个是我要重点介绍的。下面的例子都是基于Perl语言。

    对于简单的输入,模板如下:

    # read configuration
    # initiate global vairables 
    # initiate key level counter
    # initiate group level counter
    # initiate final counter
    
    ### reset all key level counter
    sub onBeginKey() {}
    
    ### aggregate count
    sub onSameKey {}
    
    ### print out the counter
    sub onEndKey() {}
    
    ### main loop
    while (<STDIN>) {
    	chomp($_);
    
    	# step 1:filter input
    
    	# step 2: split input
    
    	# step 3: get group and key
    
    	# main logic
    	if ($cur_key) {
    		if ( $key ne $cur_key ) {
    			&onEndKey();
    			&onBeginKey();
    		}
    		&onSameKey();
    	}
    	else {
    		&onBeginKey();
    		&onSameKey();
    	}
    }
    if ($cur_key) {
    	&onEndKey();
    }
    
    

    对于复杂的输入,模板如下:

    # read configuration
    # initiate global vairables 
    # initiate key level counter
    # initiate group level counter
    # initiate final counter
    
    ### reset all group level counter
    sub onBeginGroup() {}
    
    ### reset all key level counter
    sub onBeginKey() {}
    
    ### add count at key level
    sub onSameKey {}
    
    ### aggregate count from key level to group level
    sub onEndKey() {}
    
    ### aggregate count from group level to final result
    sub onEndGroup() {}
    
    ### main loop
    while (<STDIN>) {
    	chomp($_);
    
    	# step 1:filter input
    
    	# step 2: split input
    
    	# step 3: get group and key
    
    	# main logic
    	if ($cur_group) {
    		if ( $group ne $cur_group ) {
    			&onEndKey();
    			&onEndGroup();
    			&onBeginGroup();
    			&onBeginKey();
    		}
    		else {
    			if ( $key ne $cur_key ) {
    				&onEndKey();
    				&onBeginKey();
    			}    #else just the same key
    		}
    		&onSameKey();
    	}
    	else {
    		&onBeginGroup();
    		&onBeginKey();
    		&onSameKey();
    	}
    }
    if ($cur_key) {
    	&onEndKey();
    	&onEndGroup();
    }
    
    ### print out the final counter
    两个版本的区别在于,多了一级的group,但是原理一样。当然理论上还可以再嵌套更多的级别。

    最后推荐一下市面上的hadoop编程书籍:

    • Hadoop: The Definitive Guide
    • Hadoop in Action
    • Pro Hadoop
  • 相关阅读:
    mysql常用基本命令
    mysql8.0.13下载与安装图文教程
    k8s ingress 增加跨域配置
    Jenkins 备份恢复插件 thinBackup 使用
    k8s HA master 节点宕机修复
    nginx 跨域问题解决
    mongodb 3.4.24 主从复制
    k8s 线上安装 jenkins并结合 jenkinsfile 实现 helm 自动化部署
    k8s helm 运用与自建helm仓库chartmuseum
    centos6 源码安装 unzip
  • 原文地址:https://www.cnblogs.com/ainima/p/6331305.html
Copyright © 2011-2022 走看看