Hadoop ha搭建
windows软件 必须从G盘加载一个文件 conf xml linux/a /b /c /d /e /f /gmount /g -> disk:G分区 /b -> disk:B分区软件 必须从/g 文件好处:软件具备了 移动性hdfs 目录树结构角色 即 JVM进程----------------------------------------------- 数据持久化:日志文件: 记录实时发生的增删改的操作 mkdir /abc append 文本文件完整性比较好加载恢复数据:慢/占空间 < 比如说,我NN 内存4G 运行了10年 日志 是多大5年恢复,内存会不会溢出镜像、快照、dump、db、序列化间隔(小时,天,10分钟,1分钟,5秒钟),内存全量数据基于某一个时间点做的向磁盘的溢写I/O :慢恢复速度快过 日志文件因为是间隔的,容易丢失一部分数据HDFS:EditsLog: 日志体积小,记录少:必然有优势FsImage: 镜像、快照如果能更快的滚动更新时点最近时点的FsImage + 增量的EditsLog现在10点FI:9点+ 9点到10点的增量的EL1,加载FI2,加载EL3,内存就得到了关机前的全量数据!!!!问题:那么: FI 时点是怎么滚动更新的!!!!!?由 NN 8点溢写,9点溢写。。。NN :第一次开机的时候,只写一次FI ,假设8点,到9点的时候,EL 记录的是8~9的日志只需要将8~9的日志的记录,更新到8点的FI中,FI的数据时点就变成了9点~!脱了裤子放屁寻求另外一台机器来做知识点:NN 存元数据: 文件属性 / 每个块存在哪个DN上属性:path /a/b/c.txt 32G root:root rwxrwxrwxblk01blk02在持久化的时候:文件属性会持久化,但是文件的每一个块不会持久化恢复的时候,NN会丢失块的位置信息分布式时代,数据一致性~!!!等。DN 会和 NN 建立心跳,汇报块信息~!!!!请问:999999999 请问占用多大的磁盘空间文件编码:txt byte 9个字节int a=9999999 4个字节 < 二进制文件hadoop 安装:centos 6.5 jdk 1.8 hadoop 2.6.5 1基础设施:设置网络:设置IP* 大家自己看看自己的vm的编辑->虚拟网络编辑器->观察 NAT模式的地址 vi /etc/sysconfig/network-scripts/ifcfg-eth0DEVICE=eth0#HWADDR=00:0C:29:42:15:C2TYPE=EthernetONBOOT=yesNM_CONTROLLED=yesBOOTPROTO=staticIPADDR=192.168.150.11NETMASK=255.255.255.0GATEWAY=192.168.150.2DNS1=223.5.5.5DNS2=114.114.114.114设置主机名vi /etc/sysconfig/networkNETWORKING=yesHOSTNAME=node01设置本机的ip到主机名的映射关系vi /etc/hosts192.168.150.11 node01192.168.150.12 node02关闭防火墙service iptables stopchkconfig iptables off关闭 selinuxvi /etc/selinux/configSELINUX=disabled做时间同步yum install ntp -yvi /etc/ntp.confserver ntp1.aliyun.comservice ntpd startchkconfig ntpd on安装JDK:rpm -i jdk-8u181-linux-x64.rpm *有一些软件只认:/usr/java/defaultvi /etc/profile export JAVA_HOME=/usr/java/defaultexport PATH=$PATH:$JAVA_HOME/binsource /etc/profile | . /etc/profilessh免密: ssh localhost 1,验证自己还没免密 2,被动生成了 /root/.sshssh-keygen -t dsa -P '' -f ~/.ssh/id_dsacat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys如果A 想 免密的登陆到B:A:ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsaB:cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys结论:B包含了A的公钥,A就可以免密的登陆你去陌生人家里得撬锁去女朋友家里:拿钥匙开门 2,Hadoop的配置(应用的搭建过程)规划路径:mkdir /opt/bigdatatar xf hadoop-2.6.5.tar.gzmv hadoop-2.6.5 /opt/bigdata/pwd/opt/bigdata/hadoop-2.6.5vi /etc/profile export JAVA_HOME=/usr/java/defaultexport HADOOP_HOME=/opt/bigdata/hadoop-2.6.5export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbinsource /etc/profile配置hadoop的角色:cd $HADOOP_HOME/etc/hadoop必须给hadoop配置javahome要不ssh过去找不到vi hadoop-env.shexport JAVA_HOME=/usr/java/default给出NN角色在哪里启动vi core-site.xml<property><name>fs.defaultFS</name><value>hdfs://node01:9000</value></property>配置hdfs 副本数为1.。。。vi hdfs-site.xml<property><name>dfs.replication</name><value>1</value></property><property><name>dfs.namenode.name.dir</name><value>/var/bigdata/hadoop/local/dfs/name</value></property><property><name>dfs.datanode.data.dir</name><value>/var/bigdata/hadoop/local/dfs/data</value></property><property><name>dfs.namenode.secondary.http-address</name><value>node01:50090</value></property><property><name>dfs.namenode.checkpoint.dir</name><value>/var/bigdata/hadoop/local/dfs/secondary</value></property>配置DN这个角色再那里启动vi slavesnode013,初始化&启动:hdfs namenode -format 创建目录并初始化一个空的fsimageVERSIONCIDstart-dfs.sh第一次:datanode和secondary角色会初始化创建自己的数据目录http://node01:50070修改windows: C:\Windows\System32\drivers\etc\hosts192.168.150.11 node01192.168.150.12 node02192.168.150.13 node03192.168.150.14 node044,简单使用:hdfs dfs -mkdir /bigdatahdfs dfs -mkdir -p /user/root5,验证知识点:cd /var/bigdata/hadoop/local/dfs/name/current观察 editlog的id是不是再fsimage的后边cd /var/bigdata/hadoop/local/dfs/secondary/currentSNN 只需要从NN拷贝最后时点的FSimage和增量的Editloghdfs dfs -put hadoop*.tar.gz /user/rootcd /var/bigdata/hadoop/local/dfs/data/current/BP-281147636-192.168.150.11-1560691854170/current/finalized/subdir0/subdir0for i in `seq 100000`;do echo "hello hadoop $i" >> data.txt ;donehdfs dfs -D dfs.blocksize=1048576 -put data.txt cd /var/bigdata/hadoop/local/dfs/data/current/BP-281147636-192.168.150.11-1560691854170/current/finalized/subdir0/subdir0检查data.txt被切割的块,他们数据什么样子----------------------------------------------------------------------------------------- 伪分布式: 在一个节点启动所有的角色: NN,DN,SNN 完全分布式:基础环境部署配置1)角色在哪里启动NN: core-site.xml: fs.defaultFS hdfs://node01:9000DN: slaves: node01SNN: hdfs-siet.xml: dfs.namenode.secondary.http.address node01:500902) 角色启动时的细节配置:dfs.namenode.name.dir dfs.datanode.data.dir初始化&启动格式化FsimageVERSIONstart-dfs.sh加载我们的配置文件通过ssh 免密的方式去启动相应的角色伪分布式到完全分布式:角色重新规划node01:stop-dfs.shssh 免密是为了什么 : 启动start-dfs.sh: 在哪里启动,那台就要对别人公开自己的公钥这一台有什么特殊要求吗: 没有node02~node04:rpm -i jdk....node01:scp /root/.ssh/id_dsa.pub node02:/root/.ssh/node01.pubscp /root/.ssh/id_dsa.pub node03:/root/.ssh/node01.pubscp /root/.ssh/id_dsa.pub node04:/root/.ssh/node01.pubnode02:cd ~/.sshcat node01.pub >> authorized_keysnode03:cd ~/.sshcat node01.pub >> authorized_keysnode04:cd ~/.sshcat node01.pub >> authorized_keys配置部署:node01:cd $HADOOP/etc/hadoopvi core-site.xml 不需要改vi hdfs-site.xml<property><name>dfs.replication</name><value>2</value></property><property><name>dfs.namenode.name.dir</name><value>/var/bigdata/hadoop/full/dfs/name</value></property><property><name>dfs.datanode.data.dir</name><value>/var/bigdata/hadoop/full/dfs/data</value></property><property><name>dfs.namenode.secondary.http-address</name><value>node02:50090</value></property><property><name>dfs.namenode.checkpoint.dir</name><value>/var/bigdata/hadoop/full/dfs/secondary</value></property>vi slavesnode02node03node04分发:cd /optscp -r ./bigdata/ node02:`pwd`scp -r ./bigdata/ node03:`pwd`scp -r ./bigdata/ node04:`pwd`格式化启动hdfs namenode -formatstart-dfs.sh-----------------------------------------------------做减法: 作业:笔记~! 发到群里 人名作为笔记的文件名 周六晚上之前-----------------------------------------------------FULL -> HA: HA模式下:有一个问题,你的NN是2台?在某一时刻,谁是Active呢?client是只能连接Activecore-site.xml fs.defaultFs -> hdfs://node01:9000配置:core-site.xml<property><name>fs.defaultFS</name><value>hdfs://mycluster</value></property><property><name>ha.zookeeper.quorum</name><value>node02:2181,node03:2181,node04:2181</value></property>hdfs-site.xml#以下是 一对多,逻辑到物理节点的映射<property><name>dfs.nameservices</name><value>mycluster</value></property><property><name>dfs.ha.namenodes.mycluster</name><value>nn1,nn2</value></property><property><name>dfs.namenode.rpc-address.mycluster.nn1</name><value>node01:8020</value></property><property><name>dfs.namenode.rpc-address.mycluster.nn2</name><value>node02:8020</value></property><property><name>dfs.namenode.http-address.mycluster.nn1</name><value>node01:50070</value></property><property><name>dfs.namenode.http-address.mycluster.nn2</name><value>node02:50070</value></property>#以下是JN在哪里启动,数据存那个磁盘<property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value></property><property><name>dfs.journalnode.edits.dir</name><value>/var/bigdata/hadoop/ha/dfs/jn</value></property>#HA角色切换的代理类和实现方法,我们用的ssh免密<property><name>dfs.client.failover.proxy.provider.mycluster</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property><property><name>dfs.ha.fencing.methods</name><value>sshfence</value></property><property><name>dfs.ha.fencing.ssh.private-key-files</name><value>/root/.ssh/id_dsa</value></property>#开启自动化: 启动zkfc<property><name>dfs.ha.automatic-failover.enabled</name><value>true</value></property>流程:基础设施ssh免密:1)启动start-dfs.sh脚本的机器需要将公钥分发给别的节点2)在HA模式下,每一个NN身边会启动ZKFC,ZKFC会用免密的方式控制自己和其他NN节点的NN状态应用搭建HA 依赖 ZK 搭建ZK集群修改hadoop的配置文件,并集群同步初始化启动1)先启动JN hadoop-daemon.sh start journalnode 2)选择一个NN 做格式化:hdfs namenode -format <只有第一次搭建做,以后不用做>3)启动这个格式化的NN ,以备另外一台同步 hadoop-daemon.sh start namenode 4)在另外一台机器中: hdfs namenode -bootstrapStandby5)格式化zk: hdfs zkfc -formatZK <只有第一次搭建做,以后不用做>6) start-dfs.sh使用------实操:1)停止之前的集群2)免密:node01,node02node02: cd ~/.sshssh-keygen -t dsa -P '' -f ./id_dsacat id_dsa.pub >> authorized_keysscp ./id_dsa.pub node01:`pwd`/node02.pubnode01:cd ~/.sshcat node02.pub >> authorized_keys3)zookeeper 集群搭建 java语言开发 需要jdk 部署在2,3,4node02:tar xf zook....tar.gzmv zoo... /opt/bigdatacd /opt/bigdata/zoo....cd confcp zoo_sample.cfg zoo.cfgvi zoo.cfgdatadir=/var/bigdata/hadoop/zkserver.1=node02:2888:3888server.2=node03:2888:3888server.3=node04:2888:3888mkdir /var/bigdata/hadoop/zkecho 1 > /var/bigdata/hadoop/zk/myid vi /etc/profileexport ZOOKEEPER_HOME=/opt/bigdata/zookeeper-3.4.6export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin. /etc/profilecd /opt/bigdatascp -r ./zookeeper-3.4.6 node03:`pwd`scp -r ./zookeeper-3.4.6 node04:`pwd`node03:mkdir /var/bigdata/hadoop/zkecho 2 > /var/bigdata/hadoop/zk/myid*环境变量. /etc/profilenode04:mkdir /var/bigdata/hadoop/zkecho 3 > /var/bigdata/hadoop/zk/myid*环境变量. /etc/profilenode02~node04:zkServer.sh start4)配置hadoop的core和hdfs5)分发配置给每一台都分发6)初始化:1)先启动JN hadoop-daemon.sh start journalnode 2)选择一个NN 做格式化:hdfs namenode -format <只有第一次搭建做,以后不用做>3)启动这个格式化的NN ,以备另外一台同步 hadoop-daemon.sh start namenode 4)在另外一台机器中: hdfs namenode -bootstrapStandby5)格式化zk: hdfs zkfc -formatZK <只有第一次搭建做,以后不用做>6) start-dfs.sh 使用验证:1)去看jn的日志和目录变化:2)node04zkCli.sh ls /启动之后可以看到锁:get /hadoop-ha/mycluster/ActiveStandbyElectorLock3)杀死namenode 杀死zkfckill -9 xxxa)杀死active NNb)杀死active NN身边的zkfcc)shutdown activeNN 主机的网卡 : ifconfig eth0 down2节点一直阻塞降级如果恢复1上的网卡 ifconfig eth0 up 最终 2编程active==================================================================================1,hdfs 的权限 2,hdfs java api idea 3,mapreduce 启蒙Permission Owner Group Size Replication Block Size Name drwxr-xr-x root supergroup 0 B 0 0 B user -rw-r--r-- root supergroup 8.61 KB 2 128 MB install.loghdfs是一个文件系统类unix、linux有用户概念hdfs没有相关命令和接口去创建用户信任客户端 <- 默认情况使用的 操作系统提供的用户扩展 kerberos LDAP 继承第三方用户认证系统有超级用户的概念linux系统中超级用户:roothdfs系统中超级用户: 是namenode进程的启动用户有权限概念hdfs的权限是自己控制的 来自于hdfs的超级用户-----------实操:(一般在企业中不会用root做什么事情)面向操作系统 root是管理员 其他用户都叫【普通用户】面向操作系统的软件 谁启动,管理这个进程,那么这个用户叫做这个软件的管理员实操:切换我们用root搭建的HDFS 用god这个用户来启动node01~node04:*)stop-dfs.sh1)添加用户:rootuseradd godpasswd god2)讲资源与用户绑定(a,安装部署程序;b,数据存放的目录)chown -R god srcchown -R god /opt/bigdata/hadoop-2.6.5chown -R god /var/bigdata/hadoop3)切换到god去启动 start-dfs.sh < 需要免密给god做免密*我们是HA模式:免密的2中场景都要做的ssh localhost >> 为了拿到.sshnode01~node02:cd /home/god/.sshssh-keygen -t dsa -P '' -f ./id_dsanode01:ssh-copy-id -i id_dsa node01ssh-copy-id -i id_dsa node02ssh-copy-id -i id_dsa node03ssh-copy-id -i id_dsa node04node02cd /home/god/.sshssh-copy-id -i id_dsa node01ssh-copy-id -i id_dsa node024)hdfs-site.xml<property><name>dfs.ha.fencing.ssh.private-key-files</name><value>/home/god/.ssh/id_dsa</value></property>分发给node02~045)god : start-dfs.sh----------用户权限验证实操:node01:su godhdfs dfs -mkdir /temphdfs dfs -chown god:ooxx /temphdfs dfs -chmod 770 /tempnode04:root:useradd goodgroupadd ooxxusermod -a -G ooxx goodid goodsu goodhdfs dfs -mkdir /temp/abc <失败hdfs groups good: <因为hdfs已经启动了,不知道你操作系统又偷偷摸摸创建了用户和组*node01:root:useradd goodgroupadd ooxxusermod -a -G ooxx goodsu god hdfs dfsadmin -refreshUserToGroupsMappingsnode04:good:hdfs groups good : good ooxx结论:默认hdfs依赖操作系统上的用户和组-------------------hdfs api 实操:windows idea eclips 叫什么: 集成开发环境 ide 你不需要做太多,用它~!!!语义:开发hdfs的client权限:1)参考系统登录用户名;2)参考环境变量;3)代码中给出;HADOOP_USER_NAME god这一步操作优先启动ideajdk版本:集群和开发环境jdk版本一致~!!maven:构建工具 包含了依赖管理(pom)jar包有仓库的概念,互联网仓库全,大本地仓库,用过的会缓存打包、测试、清除、构建项目目录。。。。GAV定位。。。。https://mvnrepository.com/hdfs的pom:hadoop:(common,hdfs,yarn,mapreduce)===================================================================1,最终去开发MR计算程序*,HDFS和YARN 是俩概念 2,hadoop2.x 出现了一个yarn : 资源管理 》 MR 没有后台常服务yarn模型:container 容器,里面会运行我们的AppMaster ,map/reduce Task解耦mapreduce on yarn架构:RMNM搭建:NN NN JN ZKFC ZK DN RM NMnode01 * * *node02 * * * * * *node03 * * * * *node04 * * * *hadoop 1.x 2.x 3.xhdfs: no ha ha(向前兼容,没有过多的改NN,二是通过新增了角色 zkfc)yarn no yarn yarn (不是新增角色,二是直接在RM进程中增加了HA的模块)-----通过官网:mapred-site.xml > mapreduce on yarn <property><name>mapreduce.framework.name</name><value>yarn</value></property>yarn-site.xml//shuffle 洗牌 M -shuffle> R<property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><property><name>yarn.resourcemanager.ha.enabled</name><value>true</value></property><property><name>yarn.resourcemanager.zk-address</name><value>node02:2181,node03:2181,node04:2181</value></property><property><name>yarn.resourcemanager.cluster-id</name><value>mashibing</value></property><property><name>yarn.resourcemanager.ha.rm-ids</name><value>rm1,rm2</value></property><property><name>yarn.resourcemanager.hostname.rm1</name><value>node03</value></property><property><name>yarn.resourcemanager.hostname.rm2</name><value>node04</value></property>流程:我hdfs等所有的都用root来操作的node01:cd $HADOOP_HOME/etc/hadoopcp mapred-site.xml.template mapred-site.xml vi mapred-site.xmlvi yarn-site.xmlscp mapred-site.xml yarn-site.xml node02:`pwd`scp mapred-site.xml yarn-site.xml node03:`pwd`scp mapred-site.xml yarn-site.xml node04:`pwd`vi slaves //可以不用管,搭建hdfs时候已经改过了。。。start-yarn.shnode03~04:yarn-daemon.sh start resourcemanagerhttp://node03:8088http://node04:8088This is standby RM. Redirecting to the current active RM: http://node03:8088/-------MR 官方案例使用:wc实战:MR ON YARN 的运行方式:hdfs dfs -mkdir -p /data/wc/inputhdfs dfs -D dfs.blocksize=1048576 -put data.txt /data/wc/inputcd $HADOOP_HOMEcd share/hadoop/mapreducehadoop jar hadoop-mapreduce-examples-2.6.5.jar wordcount /data/wc/input /data/wc/output1)webui:2)cli:hdfs dfs -ls /data/wc/output-rw-r--r-- 2 root supergroup 0 2019-06-22 11:37 /data/wc/output/_SUCCESS //标志成功的文件-rw-r--r-- 2 root supergroup 788922 2019-06-22 11:37 /data/wc/output/part-r-00000 //数据文件part-r-00000part-m-00000r/m : map+reduce r / map mhdfs dfs -cat /data/wc/output/part-r-00000hdfs dfs -get /data/wc/output/part-r-00000 ./抛出一个问题:data.txt 上传会切割成2个block 计算完,发现数据是对的~!~?后边注意听源码分析~!~~===================================================================== MR 提交方式 源码提交方式:1,开发-> jar -> 上传到集群中的某一个节点 -> hadoop jar ooxx.jar ooxx in out2,嵌入【linux,windows】(非hadoop jar)的集群方式 on yarn集群:M、Rclient -> RM -> AppMastermapreduce.framework.name -> yarn //决定了集群运行conf.set("mapreduce.app-submission.cross-platform","true");job.setJar("C:\\Users\\Administrator\\IdeaProjects\\msbhadoop\\target\\hadoop-hdfs-1.0-0.1.jar");//^推送jar包到hdfs3,local,单机 自测mapreduce.framework.name -> localconf.set("mapreduce.app-submission.cross-platform","true"); //windows上必须配1,在win的系统中部署我们的hadoop:C:\usr\hadoop-2.6.5\hadoop-2.6.52,在我给你的资料中\hadoop-install\soft\bin 文件覆盖到 你部署的bin目录下还要将hadoop.dll 复制到 c:\windwos\system32\3,设置环境变量:HADOOP_HOME C:\usr\hadoop-2.6.5\hadoop-2.6.5 IDE -> 集成开发: hadoop最好的平台是linux部署hadoop,bin参数个性化:GenericOptionsParser parser = new GenericOptionsParser(conf, args); //工具类帮我们把-D 等等的属性直接set到conf,会留下commandOptionsString[] othargs = parser.getRemainingArgs();----------------------------------------------------------------- 源码的分析:(目的) 更好的理解你学的技术的细节 以及原理资源层yarnwhat?why?how?3个环节 <- 分布式计算 <- 追求:计算向数据移动 并行度、分治数据本地化读取Client没有计算发生很重要:支撑了计算向数据移动和计算的并行度1,Checking the input and output specifications of the job.2,Computing the InputSplits for the job. // split ->并行度和计算向数据移动就可以实现了3,Setup the requisite accounting information for the DistributedCache of the job, if necessary.4,Copying the job's jar and configuration to the map-reduce system directory on the distributed file-system.5,Submitting the job to the JobTracker and optionally monitoring it's statusMR框架默认的输入格式化类: TextInputFormat < FileInputFormat < InputFormatgetSplits() minSize = 1maxSize = Long.MaxblockSize = filesplitSize = Math.max(minSize, Math.min(maxSize, blockSize)); //默认split大小等于block大小切片split是一个窗口机制:(调大split改小,调小split改大)如果我想得到一个比block大的split:if ((blkLocations[i].getOffset() <= offset < blkLocations[i].getOffset() + blkLocations[i].getLength()))split:解耦 存储层和计算层1,file2,offset3,length4,hosts //支撑的计算向数据移动MapTaskinput -> map -> outputinput:(split+format) 通用的知识,未来的spark底层也是来自于我们的输入格式化类给我们实际返回的记录读取器对象TextInputFormat->LineRecordreadersplit: file , offset , lengthinit():in = fs.open(file).seek(offset)除了第一个切片对应的map,之后的map都在init环节,从切片包含的数据中,让出第一行,并把切片的起始更新为切片的第二行。换言之,前一个map会多读取一行,来弥补hdfs把数据切割的问题~!nextKeyValue():1,读取数据中的一条记录对key,value赋值2,返回布尔值getCurrentKey():getCurrentValue():output:NewOutputCollectorpartitionercollectorMapOutputBuffer:*:map输出的KV会序列化成字节数组,算出P,最中是3元组:K,V,Pbuffer是使用的环形缓冲区:1,本质还是线性字节数组2,赤道,两端方向放KV,索引3,索引:是固定宽度:16B:4个inta)Pb)KSc)VSd)VL5,如果数据填充到阈值:80%,启动线程:快速排序80%数据,同时map输出的线程向剩余的空间写快速排序的过程:是比较key排序,但是移动的是索引6,最终,溢写时只要按照排序的索引,卸下的文件中的数据就是有序的注意:排序是二次排序(索引里有P,排序先比较索引的P决定顺序,然后在比较相同P中的Key的顺序)分区有序 : 最后reduce拉取是按照分区的分区内key有序: 因为reduce计算是按分组计算,分组的语义(相同的key排在了一起)7,调优:combiner1,其实就是一个map里的reduce按组统计2,发生在哪个时间点:a)内存溢写数据之前排序之后溢写的io变少~!b)最终map输出结束,过程中,buffer溢写出多个小文件(内部有序)minSpillsForCombine = 3map最终会把溢写出来的小文件合并成一个大文件:避免小文件的碎片化对未来reduce拉取数据造成的随机读写也会触发combine3,combine注意必须幂等例子:1,求和计算1,平均数计算80:数值和,个数和init():spillper = 0.8sortmb = 100Msorter = QuickSortcomparator = job.getOutputKeyComparator();1,优先取用户覆盖的自定义排序比较器2,保底,取key这个类型自身的比较器combiner ?reduceminSpillsForCombine = 3SpillThreadsortAndSpill()if (combinerRunner == null)ReduceTaskinput -> reduce -> outputmap:run: while (context.nextKeyValue())一条记录调用一次mapreduce:run: while (context.nextKey())一组数据调用一次reducedoc:1,shuffle: 洗牌(相同的key被拉取到一个分区),拉取数据2,sort: 整个MR框架中只有map端是无序到有序的过程,用的是快速排序reduce这里的所谓的sort其实你可以想成就是一个对着map排好序的一堆小文件做归并排序grouping comparator1970-1-22 33 bj1970-1-8 23 sh排序比较啥:年,月,温度,,且温度倒序分组比较器:年,月3,reduce:run:rIter = shuffle。。//reduce拉取回属于自己的数据,并包装成迭代器~!真@迭代器file(磁盘上)-> open -> readline -> hasNext() next()时时刻刻想:我们做的是大数据计算,数据可能撑爆内存~!comparator = job.getOutputValueGroupingComparator();1,取用户设置的分组比较器2,取getOutputKeyComparator();1,优先取用户覆盖的自定义排序比较器2,保底,取key这个类型自身的比较器#:分组比较器可不可以复用排序比较器什么叫做排序比较器:返回值:-1,0,1什么叫做分组比较器:返回值:布尔值,false/true排序比较器可不可以做分组比较器:可以的mapTask reduceTask1,取用户自定义的分组比较器1,用户定义的排序比较器 2,用户定义的排序比较器2,取key自身的排序比较器 3,取key自身的排序比较器组合方式:1)不设置排序和分组比较器:map:取key自身的排序比较器reduce:取key自身的排序比较器2)设置了排序map:用户定义的排序比较器reduce:用户定义的排序比较器3)设置了分组map:取key自身的排序比较器reduce:取用户自定义的分组比较器4)设置了排序和分组map:用户定义的排序比较器reduce:取用户自定义的分组比较器做减法:结论,框架很灵活,给了我们各种加工数据排序和分组的方式ReduceContextImplinput = rIter 真@迭代器hasMore = truenextKeyIsSame = falseiterable = ValueIterableiterator = ValueIteratorValueIterableiterator()return iterator;ValueIterator 假@迭代器 嵌套迭代器hasNext()return firstValue || nextKeyIsSame;next()nextKeyValue();nextKey()nextKeyValue()nextKeyValue()1,通过input取数据,对key和value赋值2,返回布尔值3,多取一条记录判断更新nextKeyIsSame窥探下一条记录是不是还是一组的!getCurrentKey()return keygetValues()return iterable;**:reduceTask拉取回的数据被包装成一个迭代器reduce方法被调用的时候,并没有把一组数据真的加载到内存而是传递一个迭代器-values在reduce方法中使用这个迭代器的时候:hasNext方法判断nextKeyIsSame:下一条是不是还是一组next方法:负责调取nextKeyValue方法,从reduceTask级别的迭代器中取记录,并同时更新nextKeyIsSame以上的设计艺术:充分利用了迭代器模式:规避了内存数据OOM的问题且:之前不是说了框架是排序的所以真假迭代器他们只需要协作,一次I/O就可以线性处理完每一组数据~!========普通方式讲知识点。。。 费曼学习法。。。========
Hadoop ha搭建相关推荐
- Hadoop HA 搭建(三台主机)
Hadoop HA 搭建 搭建准备 安装步骤 一.关闭防火墙 二.解压组件 三.配置文件 四.环境变量 五.发送到其他两个节点 六.初始化HDFS 七.启动Hadoop 启动结果 搭建准备 Cento ...
- hadoop ha搭建 namenode格式化失败等错误
简单来说,按照官方配置即可,但是要足够细心配置xml文件 先贴自己虚拟机搭建namenode格式化错误 昨晚搜索了一下没找到确定的解决办法,决定是配置文件的原因,自己早上去官网看了下配置文件 我的hd ...
- Hadoop HA+Federation 高可用联邦模式搭建指南
为什么80%的码农都做不了架构师?>>> 简述 Hadoop 集群一共有4种部署模式,详见<Hadoop 生态圈介绍>. HA联邦模式解决了单纯HA模式的性能瓶颈( ...
- [Hadoop基础]-- Hadoop namenode的HA搭建
基本架构如下 1\\准备机器h15.h16.h17.h18 将zookeeper文件复制到h15\h16\h17上,并且解压 说明如下:zookeeper-3.4.6/zookeeper-3.4.6/ ...
- 【Hadoop HA】搭建Hadoop HA的详细教程
搭建Hadoop HA的详细教程 前置工作 配置host文件 ssh免密登录 JDK的配置 ZooKeeper配置 Hadoop HA配置文件 core-site.xml hdfs-site.xml ...
- Hadoop HA 高可用集群搭建
Hadoop HA 高可用集群搭建 一.首先配置集群信息 1 vi /etc/hosts 二.安装zookeeper 1.解压至/usr/hadoop/下 1 tar -zxvf zookeeper- ...
- (超详细)基于Zookeeper的Hadoop HA集群的搭建
基于Zookeeper的Hadoop HA集群的搭建 JunLeon--go big or go home 前言: 高可用(high availability,HA)指的是若当前工作中的机器宕机了,系 ...
- Hadoop HA高可用集群搭建(Hadoop+Zookeeper+HBase)
一.服务器环境 主机名 IP 用户名 密码 安装目录 master 192.168.142.124 root xxx /usr/hadoop-2.6.5/ slave1 192.168.142.125 ...
- Hadoop 00_hadoop伪分布式,完全分布式,HA搭建
伪分布式 (single node setup) --------------------------- 安装jdk.配置环境变量,测试 rpm -i jdk-7u67-linux-x64.rpm c ...
最新文章
- word修改一处另一处自动修改_这么做让word自动记录修改明细,再也不用一个字一个字的核对了...
- 业务爆发式增长,音视频服务如何做好质量监控与优化?
- 20. Cookie 和 Session
- python查看网络连接_python – 检查网络连接
- 凯撒/摩斯/栅栏/维吉尼亚/元音密码加解密的Python实现
- 反激电源基本原理和简单的使用例程 学习笔记
- c语言图片输出,C语言输出图片?
- smart原则_如何利用SMART原则制定适合自己的高效学习计划
- 微信小程序:数据传输长度已经超过最大长度 1048576 的错误
- LDR6028充电OTG直播线直播声卡音频转接器最具性价比方案
- 计算机分组Excel,【Excel神技能】如何在Excel表格中进行“数据分组”?
- U盘winpe启动盘的制作
- 人民币大写数字 C++
- i7 8700k 安装linux,i7 8700k能装win7吗?i7 8700k搭配华硕B365主板装win7
- 破解Esxi服务器中Windows虚机密码(Esxi服务器Windows虚拟机忘记密码解决方案)
- java中insteadof_Java代码规范小结(一)
- 武侠中的基本要素(武侠之奥义)
- CodeWarrior IDE
- DZ论坛+克米模板3.5版本全解密+教程
- 霜蝉DTU对接组态王组态软件的使用方法
热门文章
- ucla计算机科学和数学专业,加州大学(UCLA)数学统计专业解析
- 软考高项论文范文——论信息系统项目的采购管理
- VS2019MFC实现汉诺塔游戏(鼠标拖动盘子无轨迹、连续演示、单步演示)
- linux下网卡测速,Linux下 网卡测速
- TCP/IP,HTTP,RPC、SOA、长连接短连接等的区别
- 兄弟连python_兄弟连Python视频教程(完整版)
- 【20考研】如何度过一个有意义的寒假?
- POJ 2092 Grandpa is Famous G++
- Xshell连接虚拟机失败,解决办法!
- 同时用公司内网和手机热点上网(真的有用!)