一、Yarn配置mr-historyServer

1、历史日志的概念

  1. 我们在YARN运行MapReduce的程序的时候,任务会被分发到不同的节点,在不同的Container内去执行。如果一个程序执行结束后,我们想去查看这个程序的运行状态呢?每一个MapTask的执行细节?每一个ReduceTask的执行细节?这个时候我们是查看不到的,因此我们需要开启记录历史日志的服务。
  2. 历史日志服务开启之后,Container在运行任务的过程中,会将日志记录下来,保存到当前的节点。例如: qianfeng02节点上开启了一个Container去执行MapTask,那么此时就会在qianfeng02$HADOOP_HOME/logs/userlogs中记录下来日志。我们可以到不同的节点上去查看日志。虽然这样可以查看,但是很不方便!因此,我们一般还会开启另外的一个服务: 日志聚合。顾名思义,就是将不同节点的日志聚合到一起保存起来。

2、操作
1) 修改mapred-site.xml

  1. <!-- 历史任务的内部通讯地址 -->
  2. <property>
  3. <name>MapReduce.jobhistory.address</name>
  4. <value>bigdata01:10020</value>
  5. </property>
  6. <!--历史任务的外部监听页面-->
  7. <property>
  8. <name>MapReduce.jobhistory.webapp.address</name>
  9. <value>bigdata01:19888</value>
  10. </property>
  11. <property>
  12. <name>yarn.app.mapreduce.am.env</name>
  13. <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
  14. </property>
  15. <property>
  16. <name>mapreduce.map.env</name>
  17. <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
  18. </property>
  19. <property>
  20. <name>mapreduce.reduce.env</name>
  21. <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
  22. </property>

2) yarn-site.xml

  1. <property>
  2. <name>yarn.log-aggregation-enable</name>
  3. <value>true</value>
  4. </property>
  5. <!-- 历史日志在HDFS保存的时间,单位是秒 -->
  6. <!-- 默认的是-1,表示永久保存 -->
  7. <property>
  8. <name>yarn.log-aggregation.retain-seconds</name>
  9. <value>604800</value>
  10. </property>
  11. <property>
  12. <name>yarn.log.server.url</name>
  13. <value>http://bigdata01:19888/jobhistory/logs</value>
  14. </property>

3) 分发到不同的节点上

  1. xsync.sh mapred-site.xml
  2. xsync.sh yarn-site.xml

4) 重启yarn.sh

  1. stop-yarn.sh
  2. start-yarn.sh

5) 开启历史日志

  1. mapred --daemon start historyserver

6) 后面再执行的任务就可看日志了,之前的看不了

  1. hadoop jar /home/mr2.jar com.qfedu.yarn.WordCountDriver /input /output2

7)查看日志情况:
image.png
image.png
8)我的URL中不是IP,而是一个主机名,根据主机名如何IP,修改windows上hosts文件。
SwitchHosts 这个软件可以轻松的帮我们修改我们的hosts文件。
hosts文件的真实路径:
image.png
image.png
image.png
9) 我们的mr-historyserver 是查看mr任务的历史日志,如果你没有使用mr,使用spark,Tez 这样的技术,那么我们这个历史日志也就不起作用了。—timeline 技术。它可以进行(mr,spark等任务的查看)

二、Yarn的任务提交流程

image.png

三、Yarn的三种任务调度器

1、FIFO Scheduler(先进先出)

image.png

2、Capacity Scheduler(容量调度器-Apache Hadoop默认使用的)

  1. 容量调度器 Capacity Scheduler 允许多个组织共享一个 Hadoop 集群。使用容量调度器时,一个独立的专门队列保证小作业一提交就可以启动。
  2. 优点:小任务不会因为前面有大任务在执行,而只能一直等下去
  3. 缺点:这种策略是以整个集群利用率为代价的,这意味着与使用FIFO调度器相比,大作业执行的时间要长上一些。

image.png
image.png
整个集群中,内存只有100G , 30G 40G 30G

3、Fair Scheduler(公平调度器—CDH版本默认的调度器)

image.png
比如Yarn集群100G的内存,如果有一个任务,这个任务直接使用100G的内存。如果任务一没有执行完,又来了一个任务二,任务一和任务二平分资源。可以保证每一个任务都可以公平的享用资源。
hadoop有三个版本:

  1. 1apache 版本
  2. 2CDH版本
  3. 3HotonWorks 版本

四、ZooKeeper的简介

1、zk是什么?

动物园管理员,因为我们的大数据技术都是动物的Logo.
1、zk是一个专门为分布式应用程序提供服务的,分布式协调服务框架。开源免费的。Hadoop以及HBase都需要使用zk.
2、因为我们需要搭建hadoop的高可用环境,所以我们讲zk.
3、本身有点类似于unix系统,因为它的目录节点都是树状结构的。
4、可以通过命令操作也可以通过java代码操作。

2、zk的特点?

1) 是一个分布式的,有一个Leader,多个追随者Follower
2) 集群中只要有半数的节点存活,整个集群就还能正常工作。
3) 每一个server都有一个相同的副本,client 不管连接哪个Server都可以获取到数据,数据都是一致的。
4) 更新数据有一定的顺序。
5) 更新数据的时候,要么同时更新成功,要么更新失败。
image.png

3、zk的数据模式

image.png
每一个节点称之为Node,这个节点可以理解为文件,也可以理解为文件夹。

一个节点下,可以有很多节点,这个节点还可以有自己的数据。
set /znode1 “hello world”
get /znode1 得到一个值 “hello world”
set /znode1/test “abc”
get /znode1/test 得到值 abc

4、zk的使用场景?

  1. 1、统一配置管理(比如java项目中的配置文件)
  2. 2、服务器节点动态上下线的感知
  3. 3、分布式锁(分布式锁可以用zk来解决,但是不是说zk就是分布式锁)
  4. 比如转账
  5. 张三 -100
  6. 李四 +100
  7. 系统
  8. 购物的系统
  9. 下订单 减库存
  10. A项目 通过消息中间件通过其他项目 B项目

五、zk的安装

  1. 1、上传文件至 /home/soft
  2. 2、解压 tar -xvf apache-zookeeper-3.6.3-bin.tar.gz -C /usr/local
  3. 3、重命名
  4. cd /usr/local/
  5. mv apache-zookeeper-3.6.3-bin zookeeper
  6. 4、配置环境变量
  7. 修改 /etc/profile
  8. 添加: export ZOOKEEPER_HOME=/usr/local/zookeeper
  9. PATH中,追加一个 $ZOOKEEPER_HOME/bin
  10. 5、刷新一下环境变量
  11. source /etc/profile
  12. 6、修改zookeeper中的conf配置文件
  13. 里面有一个样例,将样例拷贝一份即可
  14. 进入到 zookeeper 中的conf
  15. cp zoo_sample.cfg zoo.cfg
  16. 7、修改zoo.cfg
  17. tickTime=2000 # 定义的时间单元(单位毫秒),下面的两个值都是tickTime的倍数。
  18. initLimit=10 # follower连接并同步leader的初始化连接时间。
  19. syncLimit=5 # 心跳机制的时间(正常情况下的请求和应答的时间)
  20. dataDir=/usr/local/zookeeper-3.6.3/zkData # 修改zookeeper的存储路径,zkData目录一会要创建出来
  21. clientPort=2181 # 客户端连接服务器的port
  22. # 添加三个服务器节点 3888后面不能跟空格,否则报错!!!!
  23. server.1=qianfeng01:2888:3888
  24. server.2=qianfeng02:2888:3888
  25. server.3=qianfeng03:2888:3888
  26. # 解析 Server.id=ip:port1:port2
  27. # id: 服务器的id号,对应zkData/myid文件内的数字
  28. # ip: 服务器的ip地址
  29. # port1: followerleader交互的port
  30. # port2: 选举期间使用的port
  31. # 注意:此配置文件中,不支持汉字注释
  32. 8、创建zkData以及myid
  33. mkdir zkData
  34. 进入到zkData 文件夹 echo "1" > myid
  35. 以上是配置一台zk的步骤。

搞集群,我们使用三台zk.

  1. 同步我的zookeeper文件夹
  2. xsync.sh zookeeper
  3. 同步环境变量
  4. xsync.sh /etc/profile
  5. 刷新一下变量:
  6. xcall.sh source /etc/profile
  7. 修改剩余两台的myid
  8. bigdata02 上的myid --> 2
  9. bigdata03 上的myid --> 3
  10. 启动集群:
  11. 在每一台电脑上执行 zkServer.sh start
  12. 通过zkServer.sh status 查看状态。

image.png
为了以后启动zk或者停止zk比较的方便,我们可以编写一个脚本zk.sh

  1. #!/bin/bash
  2. # 获取参数
  3. COMMAND=$1
  4. if [ ! $COMMAND ]; then
  5. echo "please input your option in [start | stop | status]"
  6. exit -1
  7. fi
  8. if [ $COMMAND != "start" -a $COMMAND != "stop" -a $COMMAND != "status" ]; then
  9. echo "please input your option in [start | stop | status]"
  10. exit -1
  11. fi
  12. # 所有的服务器
  13. HOSTS=( bigdata01 bigdata02 bigdata03 )
  14. for HOST in ${HOSTS[*]}
  15. do
  16. ssh -T $HOST << TERMINATOR
  17. echo "---------- $HOST ----------"
  18. zkServer.sh $COMMAND 2> /dev/null | grep -ivh SSL
  19. exit
  20. TERMINATOR
  21. done

六、zk的shell操作

1、打开shell客户端,连接集群

  1. zkCli.sh 默认连接的是本机的zk节点
  2. zkCli.sh -server bigdata02:2181

2、ls 查看是否有子节点

  1. 查看某个节点下的子节点
  2. ls /
  3. ls /zookeeper
  4. 还可以添加一个-s参数 ,可以查看具体的信息
  5. ls -s /zookeeper/config

3、get 查看这个节点上的数据

  1. get /zookeeper/config
  2. get -s 节点 除了展示节点数据之外还可以看到其他信息

4、create 创建节点

  1. 节点分为四种情况:
  2. -e 创建出来的节点是临时节点,只要zk服务一关,数据就没了
  3. -s 设置带有序号的节点
  4. create /qianfeng01 永久节点
  5. create -e /qianfeng02 临时节点
  6. create -e -s /qianfeng03 "这是我的数据"
  7. 节点根据是否有序以及是否是临时节点,总共有四类:
  • 短暂类型ephemeral: 客户端和服务器断开后,创建的节点自己删除。
  • 持久类型persistent: 客户端和服务器断开后,创建的节点不删除(默认情况)。 | 节点类型 | 描述信息 | | —- | —- | | EPHEMERAL | 临时节点,在会话结束后自动被删除。 | | EPHEMERAL_SEQUENTIAL | 临时顺序节点,在会话结束后会自动被删除。会在给定的path节点名称后添加一个序列号。 | | PERSISTENT | 永久节点,在会话结束后不会被自动删除。 | | PERSISTENT_SEQUENTIAL | 永久顺序节点,在会话结束后不会被自动删除。会在给定的path节点名称后添加一个序列号。 |

5、set

  1. set /qianfeng01 2000

6、delete 只能删除空的没有子节点的数据

  1. delete /qianfeng02

7、deleteall 删除所有数据,包含子节点

  1. delete /qianfeng02

8、监听 addwatch

  1. addWatch /test2 在这个目录下进行监听,可以监听到这个节点的新增,修改,删除状态的变化
  2. 取消监听
  3. removewatches /test2

9、断开连接 quit