苏州门户网站建设,网站建设 数据库管理,新乡商城网站建设哪家专业,济南手工网站建设Hadoop,mapreduce 介绍59888745qq.com大数据工程师是在Linux系统下搭建Hadoop生态系统(cloudera是最大的输出者类似于Linux的红帽)#xff0c;把用户的交易或行为信息通过HDFS(分布式文件系统)等存储用户数据文件#xff0c;然后通过Hbase(类似于NoSQL)等存储数据#xff0c…Hadoop,mapreduce 介绍59888745qq.com大数据工程师是在Linux系统下搭建Hadoop生态系统(cloudera是最大的输出者类似于Linux的红帽)把用户的交易或行为信息通过HDFS(分布式文件系统)等存储用户数据文件然后通过Hbase(类似于NoSQL)等存储数据再通过Mapreduce(并行计算框架)等计算数据然后通过hiv或pig(数据分析平台)等分析数据最后按照用户需要重现出数据.Hadoop是一个由Apache基金会所开发的开源分布式系统基础架构Hadoop最基础的也就是HDFS和Mapreduce了HDFS是一个分布式存储文件系统Mapreduce是一个分布式计算的框架两者结合起来就可以很容易做一些分布式处理任务了大纲一、MapReduce 基本原理二、MapReduce 入门示例 - WordCount 单词统计三、MapReduce 执行过程分析实例1 - 自定义对象序列化实例2 - 自定义分区实例3 - 计算出每组订单中金额最大的记录实例4 - 合并多个小文件实例5 - 分组输出到多个文件四、MapReduce 核心流程梳理实例6 - join 操作实例7 - 计算出用户间的共同好友五、下载方式一、MapReduce基本原理MapReduce是一种编程模型用于大规模数据集的分布式运算。1、MapReduce通俗解释图书馆要清点图书数量有10个书架管理员为了加快统计速度找来了10个同学每个同学负责统计一个书架的图书数量。张同学统计 书架1王同学统计 书架2刘同学统计 书架3……过了一会儿10个同学陆续到管理员这汇报自己的统计数字管理员把各个数字加起来就得到了图书总数。这个过程就可以理解为MapReduce的工作过程。2、MapReduce中有两个核心操作(1)map管理员分配哪个同学统计哪个书架每个同学都进行相同的“统计”操作这个过程就是map。(2)reduce每个同学的结果进行汇总这个过程是reduce。3、MapReduce工作过程拆解下面通过一个景点案例(单词统计)看MapReduce是如何工作的。有一个文本文件被分成了4份分别放到了4台服务器中存储Text1the weather is goodText2today is goodText3good weather is goodText4today has good weather现在要统计出每个单词的出现次数。处理过程(1)拆分单词map节点1输入“the weather is good”输出(the1)(weather1)(is1)(good1)map节点2输入“today is good”输出(today1)(is1)(good1)map节点3输入“good weather is good”输出(good1)(weather1)(is1)(good1)map节点4输入“today has good weather”输出(today1)(has1)(good1)(weather1)(2)排序map节点1map节点2map节点3map节点4(3)合并map节点1map节点2map节点3map节点4(4)汇总统计每个map节点都完成以后就要进入reduce阶段了。例如使用了3个reduce节点需要对上面4个map节点的结果进行重新组合比如按照26个字母分成3段分配给3个reduce节点。Reduce节点进行统计计算出最终结果。这就是最基本的MapReduce处理流程。4、MapReduce编程思路了解了MapReduce的工作过程我们思考一下用代码实现时需要做哪些工作在4个服务器中启动4个map任务每个map任务读取目标文件每读一行就拆分一下单词并记下来次单词出现了一次目标文件的每一行都处理完成后需要把单词进行排序在3个服务器上启动reduce任务每个reduce获取一部分map的处理结果reduce任务进行汇总统计输出最终的结果数据但不用担心MapReduce是一个非常优秀的编程模型已经把绝大多数的工作做完了我们只需要关心2个部分map处理逻辑——对传进来的一行数据如何处理输出什么信息reduce处理逻辑——对传进来的map处理结果如何处理输出什么信息编写好这两个核心业务逻辑之后只需要几行简单的代码把map和reduce装配成一个job然后提交给Hadoop集群就可以了。至于其它的复杂细节例如如何启动map任务和reduce任务、如何读取文件、如对map结果排序、如何把map结果数据分配给reduce、reduce如何把最终结果保存到文件等等MapReduce框架都帮我们做好了而且还支持很多自定义扩展配置例如如何读文件、如何组织map或者reduce的输出结果等等后面的示例中会有介绍。二、MapReduce入门示例WordCount单词统计WordCount是非常好的入门示例相当于helloword下面就开发一个WordCount的MapReduce程序体验实际开发方式。example:#删除已有文件夹hadoop fs -rmr /chenshaojun/input/example_1hadoop fs -rmr /chenshaojun/output/example_1#创建输入文件夹hadoop fs -mkdir /chenshaojun/input/example_1#放入输入文件hadoop fs -put text* /chenshaojun/input/example_1#查看文件是否放好hadoop fs -ls /chenshaojun/input/example_1#本地测试一下map和reducehead -20 text1.txt | python count_mapper.py | sort | python count_reducer.py#集群上跑任务hadoop jar /usr/lib/hadoop-current/share/hadoop/tools/lib/hadoop-streaming-2.7.2.jar \-file count_mapper.py \ #提交文件到集群-mapper count_mapper.py \-file count_reducer.py \-reducer count_reducer.py \-input /chenshaojun/input/example_1 \-output /chenshaojun/output/example_1 # 必须不存在,若存在output会抱错不会覆盖count_mapper.pyimport sys# input comes from STDIN (standard input)for line in sys.stdin:# remove leading and trailing whitespaceline line.strip()# split the line into wordswords line.split()# increase countersfor word in words:# write the results to STDOUT (standard output);# what we output here will be the input for the# Reduce step, i.e. the input for reducer.py## tab-delimited; the trivial word count is 1print %s\t%s % (word.lower(), 1)count_reducer.pyfrom operator import itemgetterimport syscurrent_word Nonecurrent_count 0word None# input comes from STDINfor line in sys.stdin:# remove leading and trailing whitespaceline line.strip()# parse the input we got from mapper.pyword, count line.split(\t, 1)# convert count (currently a string) to inttry:count int(count)except ValueError:# count was not a number, so silently# ignore/discard this linecontinue# this IF-switch only works because Hadoop sorts map output# by key (here: word) before it is passed to the reducerif current_word word:current_count countelse:if current_word:# write result to STDOUTprint %s\t%s % (current_word, current_count)current_count countcurrent_word word# do not forget to output the last word if needed!if current_word word:print %s\t%s % (current_word, current_count)