千锋教育-做有情怀、有良心、有品质的IT职业教育机构

400-811-9990
当前位置:首页  >  行业资讯  >  正文
分享到:

千锋郑州大数据培训讲师精讲MapReduce

时间:2018-10-09 15:18     来源:千锋教育郑州校区 作者:Yolanda

  本文由千锋郑州大数据培训讲师分享Yarn的工作流程,Mapreduce的三大核心问题,Map过程的切片读取的原则等。

  一、Yarn的工作流程

  任务被打成jar包,并上传到linux然后执行hadoop jar xxxx 命令。

  1. client提交任务向RM请求一个JobID,RM响应它给client返回一个jobID。

  2.客户端获取jobID之后开始检查输入输出路径,并计算输入切片。

  3.将JAR包、配置文件、输入分片复制到一个以作业ID命名的HDFS文件系统的目录下;(作业jar的副本较多一般是10个为了提高集群的读取速度,这个数量是可以设置的)这样集群中有多个副本可供节点管理器NM访问。

  4.调用资源管理器RM的 submitApplication() 方法提交作业job。

  5.NM收到提交的作业后将请求转给yarn的scheduler,scheduler会分配一个 空闲的container,然后NM在RM的管理下在容器中启动AppM进程。

  6.AM接受来自HDFS系统的在客户端计算的输入分片,然后判断任务所需要的资源,

  如果自己 的本机器够用就用自己的机器计算,如果不够用再去向RM申请资源。

  7.RM分配资源给AM,AM根据RM获取的资源信息去和NM通信来启动container并分发task,在container运行人物之前会先将资源本地化(将计算需要的jar文件、配置文件、来自分布式缓存的文件下载到本地),最后再执行map或者reduce任务。

  AppMaster 是mapreduce框架内部的一个组件,只要调用使用了reduce就会实例化一个Appmaster,客户也是可以自己重写自己的Appmaster的这样就不会使用系统自己的了。

  二、Mapreduce的三大核心问题

  1. map读数据是怎么读取的?

  2.shuffle是怎么分解又聚集数据的?

  3.reduce的结果输出是怎么输出的?

  三、Map过程的切片读取的原则

  以128M为一个切片和block块大小一样,如果严格按照128M来进行切割读取的话,有可能128M恰好在一个单词的中间这样读取的话计算结果就会出错。

  为了解决这个问题,在读取的时候都会多读取一行即多读取下一个切片的一小部分下一个切片永远抛弃第一行文件的起始片不能抛弃第一行。文件的最后一个切片不能往下多读一行。

图片1

图片2

  shuffle流程原理

图片3

  1.map将分片之后的数据以特定的格式(TextInputFormat)读取,以具体的方式读取 (一次一行的方式 LineRecordReader),将读取的一行数据以空格切割(要取出每一行的单词数)。

  2.将切割后的数据发送出去 context.write(k2 , v2) // 这样的形式。

  3.OutputCollector收集器会接收map输出的数据(应该是一个一个的小数据),收集的差不多大小就将收集的数据写入环形缓存器内(环形缓存器默认是100M,当内部写入的数据达到阈值80%也就是80M就会启动一个后台线程将数据溢出到磁盘这一过程中会对溢出的数据进行分区和排序。为了解决重复的k v过多的问题还可以在写入磁盘之前做一次combiner的局部合并,它的特点是有可能调用一次或多次但是不能改变最终结果)。

  4.写入磁盘之前首先将数据按照分区规则进行分区,如果没有指定分区规则(一般分区

  的个数和reduce的个数相同),就会按照Hadoop默认的分区规则进行分区,然后按照排序规则对分区内的数据按照k2(map输出的key即reducer输入的key)进行排序 ,如果k2 是Text类型则按照k2的字典顺序的排序规则,如果是Bean按照自定义的排序规则排序,然后得到多个分区且排序的小文件。分区是按照分区号排序,分区内的数据是按照k2的排序规则进行排序,小文件内可以有多个分区。由于map向缓存区中存数据速度远远比缓冲区向磁盘写数据的速度,所以当缓冲区中的数据达到80%,map就会阻塞,停止向缓冲区存入数据,直到缓冲区中的数据写入到多个小文件并清空缓冲区,才让map继续向缓冲区存入数据,之所以写入多个小文件,是因为文件越小排序的速度越快。注意:一个分区如果过大可能存在于多个小文件之中。在得到多个分区且排序的小文件后要进行合并,合并规则是按照分区号将多个小文件中的部分分区数据合并成对应分区号的完整分区数据里面,在合并的同时再对分区内的多个部分数据按照k2排序规则进行一次排序。

图片4

  5.框架reducetask先从合并文件中读出一个key传给reduce方法,同时传一个value 迭代器;value迭代器的hasnext方法会判断文件的下一个key是否是已经传入的key如果是则next返回下一个value这个key的总value值增加,如果不是则直接返回false结束本次reduce方法的调用;继续传入新的key重复这一步骤直到结束

  6.将最终的结果写入到指定的目录里存放在HDFS上

  zookeeper的相关操作

  在zookeeper的安装目录bin/下执行 ./zkCli.sh 可以进入 zookeeper的shell

  help 可以查看帮助文档。

图片5

  ls / 查看zookeeper根目录下注册节点启动ZK服务: bin/zkServer.sh start 查看ZK服务状态: bin/zkServer.sh status

  停止ZK服务: bin/zkServer.sh stop 重启ZK服务bin/zkServer.sh restart 连接服务器 zkCli.sh -server 127.0.0.1:2181 创建 testnode节点,关联字符串"zz" create /zk/testnode "zz" 查看节点内容 get /zk/testnode 设置节点内容 set /zk/testnode abc 删除节点 delete /zk/testnode

  正常情况下程序注册了节点之后节点是可以一直持续到程序运行结束的,如果想让程序一直检测节点信息可以让进程休眠在后台运行。

图片6

  程序里加入这一句之后,如果在zookeeper上手动创建节点或者修改节点IDEA就能够接收到信息。

  IDEA连接高可用HDFS系统不能再像以前直接连接一个hdfs主机即可

图片7

  高可用集群的连接需要将所有工作的机器的主机名或者地址、端口号都设置到程序里

图片8

  这样虽然能连上HDFS-HA但是代码太啰嗦,可以使用将HDFS的两个配置文件(core-site.xml hdfs-site.xml)放到工程的resources里面,代码中的配置参数就只需要配置

  onf.set("fs.defaultFS","hdfs://集群的命名空间名");

图片9

  服务器的动态上下线服务器在zookeeper上注册自己,客户端对服务器的注册节点进行监测,动态感知服务器的上线和下线。

  每一个不同的key就调用一次reduce方法,然后把这个key的个数给统计出来。

  二进制串在Java里面所指的是byte[],byte是Java的8中原生数据类型之一(Primitive

  data types)

  mapreduce是可以人工干预的地方。map数据怎么读取(流式文本,按行还是。。); map比较排序时按照自己的业务逻辑写;reduce汇总的分组(欺骗迭代器);reduce结果的输出。

  大数据时代,中国IT环境也将面临重新洗牌,不仅仅是企业,更是程序员们转型可遇而不可求的机遇。千锋大数据培训机构郑重承诺,无论是有基础的你选择网络教育培训,还是没有基础的你选择全程面授的线下培训班,只要你来,千锋定会让你满载而归!

相关文章

热门视频

开班信息

  • JavaEE培训就业班--------------------------------

    11.05抢座

  • Python培训就业班--------------------------------

    11.12抢座

  • HTML5培训就业班--------------------------------

    10.29抢座

  • 全链路UI设计培训班--------------------------------

    10.29抢座

  • HTML5培训就业班--------------------------------

    08.20开班

  • JavaEE培训就业班--------------------------------

    09.10开班

  • Python培训就业班--------------------------------

    12.24抢座

  • HTML5培训就业班--------------------------------

    11.26抢座

  • HTML5培训就业班--------------------------------

    01.07抢座

  • JavaEE培训就业班--------------------------------

    12.17抢座

  • 北京天丰利校区(总部)地址:北京市海淀区宝盛北里西区28号天丰利商城4层
    北京沙河校区:北京市昌平区沙阳路18号北京科技职业技术学院广场服务楼2、3层
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 深圳西部硅谷校区地址:深圳市宝安区宝安大道5010号深圳西部硅谷B座A区605-619
    深圳大学城校区地址:深圳市南山区留仙大道1201号大学城创客小镇16栋3楼
    咨询电话: 0755-23015275/23015546-801(硅谷) 0755-86660670-801(大学城)
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 上海校区地址:上海市宝山区同济支路199号智慧七立方3号楼2-4层
    咨询电话:400-811-9990 021-65233829-609
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 郑州校区地址:郑州市二七区航海中路60号海为科技园C区10层、12层
    咨询电话:0371-55191750
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 广州校区地址:广州市天河区元岗路200号慧通产业园B9三层
    咨询电话:020-38035223 020-38035220
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 大连校区地址:辽宁省大连市高新园区爱贤街10号大连设计城A座901
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 武汉金融港校区地址:武汉市东湖高新技术开发区光谷大道77号金融港B18栋3楼
    武汉智慧园校区地址:武汉市东湖高新技术开发区光谷大道61号智慧园21栋2楼
    咨询电话:027-59313371
    面授课程:HTML5大前端培训、全链路UI/UE设计培训、PHP全栈+服务器集群培训、JavaEE+分布式开发培训、大数据+人工智能培训、 Unity游戏开发培训、360网络安全、Python培训、云计算+信息安全培训、全栈软件测试培训、智能物联网+嵌入式培训
  • 成都校区地址:成都市武侯区科华北路62号力宝大厦N(北楼)18楼
    咨询电话:400-811-9990 028-83178771
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 西安校区地址:西安市雁塔区高新六路52号立人科技C座西区4楼
    咨询电话:029-85363390
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 杭州旺田校区:浙江省杭州市江干区九堡旺田书画城A座4层
    杭州龙驰校区:浙江省杭州市下沙经济技术开发区元成路199号龙驰智慧谷B座7层
    咨询电话:400-811-9990 0571-86893632/0571-86094032
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 青岛校区地址:青岛市市北区龙城路卓越世纪中心3号楼8层801
    咨询电话:0532-80911190
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 重庆校区地址:重庆市高新区科园一路2号大西洋国际12-1
    咨询电话:400-811-9990 023-68883009
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 长沙校区地址:湖南省长沙市岳麓区麓谷企业广场A2栋三单元306号
    咨询电话:0731-85513210
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 哈尔滨校区地址:哈尔滨市松北区创新一路699号 科技创新城19号楼B座五楼
    咨询电话:400-811-9990/0451-87173191
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 南京校区地址:南京市建邺区应天大街780号应天智汇产业园弘辉园1幢2楼
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、物联网+嵌入式培训、360网络安全、大数据+人工智能培训、全栈软件测试培训、PHP全栈+服务器集群培训、云计算+信息安全培训、Unity游戏开发培训、区块链、红帽RHCE认证、好程序员
  • 千锋教育服务号

    了解千锋动态
    关注千锋教育服务号

  • 千锋教育移动站

    扫一扫快速进入
    千锋移动端页面

  • 千锋互联服务号

    扫码匿名提建议
    直达CEO信箱