文章目录
job在YARN上的提交流程
(0)Mr 程序提交到客户端所在的节点。
(1)Yarnrunner 向 Resourcemanager 申请一个 Application。
(2)rm 将该应用程序的资源路径返回给 yarnrunner。
(3)该程序将运行所需资源提交到 HDFS 上。
(4)程序资源提交完毕后,申请运行 mrAppMaster。
(5)RM 将用户的请求初始化成一个 task。
(6)其中一个 NodeManager 领取到 task 任务。
(7)该 NodeManager 创建容器 Container,并产生 MRAppmaster。
(8)Container 从 HDFS 上拷贝资源到本地。
(9)MRAppmaster 向 RM 申请运行 maptask 资源。
(10)RM 将运行 maptask 任务分配给另外两个 NodeManager,另两个 NodeManager 分
别领取任务并创建容器。
(11)MR 向两个接收到任务的 NodeManager 发送程序启动脚本,这两个 NodeManager
分别启动 maptask,maptask 对数据分区排序。
(12)MrAppMaster 等待所有 maptask 运行完毕后,向 RM 申请容器,运行 reduce task。
(13)reduce task 向 maptask 获取相应分区的数据。
(14)程序运行完毕后,MR 会向 RM 申请注销自己。
优化
推测执行
当某一个map或者reduce运行的时候可能出现了卡死的现象, 推测执行就会重新开启一个任务, 和之前的任务进行比较, 哪一个任务先执行完就以把一个为准
mapreduce执行的慢的原因
- 硬件的问题: 虽然集群的配置都是一样的, 但是仍然会有硬件不一样的问题, 比如硬件使用时间的不同会造成硬件性能的不一样, 所以硬件的不同会造成mapreduce执行的慢
- 数据倾斜: 当多个map执行的结果集中到了一个reduce上, 造成了数据的不平衡, 这样整个mapreduce任务就会以最慢的那个reduce为准, 也会是mapreduce执行的慢
- 磁盘上溢写次数: 磁盘上溢写次数过多也会造成mapreduce变慢
zookeeper
Nh为了能够实时同步Active和Standby两个NameNode的元数据信息(实际上editlog),需提供一个共享存储系统,可以是NFS、QJM(Quorum Journal Manager)或者Bookeeper,Active Namenode将数据写入共享存储系统,而Standby监听该系统,一旦发现有新数据写入,则读取这些数据,并加载到自己内存中,以保证自己内存状态与Active NameNode保持基本一致,如此这般,在紧急情况下standby便可快速切为active namenode。
- zookeeper是Apache的一个开源项目, 提供分布式应用协调服务的
- zookeeper存在的角色
- 领导者–leader—更新系统的状态, 发起投票和选举
- 跟随者–follower—接收客户端的请求, 并返回结果给客户端, 参与投票
- 选举机制: 节点半数以上才能提供服务
- 搭建zookeeper原则, 2n + 1
- 数据结构: 与Linux非常像, 可以把数据的结构的整体看做一棵树, 每一个节点(目录)都称为znode, 每一个znode 默认存储的数据为1MB
zookeeper的安装与下载
- 下载, 官方网址: https://blog.csdn.net/forever428/article/details/83793206
- 修改文件权限,
sudo chown -R hadoop:hadoop zookeeper-3.4.10.tar.gz
- 解压, 命令 tar -zxvf zookeeper… -C [zookeeper]
- 修改配置文件
mv zoo_sample.cfg zoo.cfg
单机版安装
- 创建tmp目录. 并修改dataDir=/tmp/zookeeper 默认的属性 保存在tmp下
- 启动
bin/zkServer.sh start 启动
bin/zkServer.sh status 查看状态
bin/zkCli.sh 进入客户端命令
配置文件的含义
tickTime=2000 服务器的心跳时间 毫秒为单位
initLimit=10 leader 与follower 初始通信时长
syncLimit=5 leader 与follower 同步通信时长
dataDir 数据的文件目录,持久化保存的数据保存在该目录下
clientPort=2181 客户端的连接端口
节点类型
- 短暂节点 : 客户端与服务器端断开,创建的节点 删除
- 持久节点 客户端与服务器端断开,创建的节点不删除
分布式安装
一. HA集群规划(3台)
PC01 | PC02 | PC03 |
---|---|---|
NameNode | NameNode | ResourceManager |
ZKFC | ZKFC | ZooKeeper |
DataNode | DataNode | DataNode |
JournalNode | JournalNode | JournalNode |
NodeManager | NodeManager | NodeManager |
ZooKeeper | ZooKeeper |
二 . 环境准备
1.主机名(3台PC)
2.hosts文件
3.网络配置
4.防火墙
5.设置SSH免登陆
6.时间同步
三. 安装部署
- 安装JDK(3台PC都要安装JDK)
配置环境变量 - 安装zk集群
1)安装zk
2)配置zoo.cfg文件
dataDir=/opt/modules/zookeeper-3.4.5/zkData
server.1=hh1:2888:3888
server.2=hh2:2888:3888
server.3=hh3:2888:3888
3)创建zkData目录,在zkData目录下创建myid文件,编辑myid文件,内容
就是此台server的zk的id号
4)启动三台zkServer
$ bin/zkServer.sh start ##启动服务
$ bin/zkServer.sh status ##查看状态
- 配置hadoop集群
1)安装hadoop
2)配置环境文件
hadoop-env.sh
mapred-env.sh
yarn-env.sh
export JAVA_HOME=/opt/modules/jdk1.7.0_67
3)配置文件
=======core-site.xml文件
<!-- 指定hdfs的nameservice为ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/modules/hadoop-2.5.0/data</value>
</property>
=============hdfs-site.xml文件
<!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>hh1:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>hh1:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>hh2:8020</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>hh2:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://[hostname-1]:8485;[hostname-2]:8485;[hostname-3]:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/modules/hadoop-2.5.0/journal</value>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行
sshfence:当Active出问题后,standby切换成Active,此时,原Active又没有停止服务,这种情况下会被强制杀死进程。
shell(/bin/true):NN Active和它的ZKFC一起挂了,没有人通知ZK,ZK长期没有接到通知,standby要切换,此时,standby调一个shell(脚本内容),这个脚本返回true则切换成功。
-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/[hadoop]/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
==========mapred-site.xml文件
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
==========yarn-site.xml
<!-- 指定resourcemanager地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hh3</value>
</property>
<!-- 指定nodemanager启动时加载server的方式为shuffle server -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
==================slaves文件
hh1
hh2
hh3
```
4)分发配置文件到其他两台机器
```
scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml hh2:/opt/modules/hadoop-2.5.0/etc/hadoop
scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml hh3:/opt/modules/hadoop-2.5.0/etc/hadoop
- 启动hadoop集群
- 注意:每一个步骤都严格按照以下步骤执行
1)如果有,删除hadoop中的tmp目录和journal目录(PC01)
$ rm -rf data/
$ rm -rf logs/
2)启动zk(三台PC)
$ bin/zkServer.sh start
3)启动journalnode(三台PC)
$ sbin/hadoop-daemon.sh start journalnode
4)格式化hdfs(PC01)
$ bin/hdfs namenode -format ##格式化
$ sbin/hadoop-daemon.sh start namenode ##启动namenode
5)同步nn1的元数据信息(PC02)
$ bin/hdfs namenode -bootstrapStandby ##同步数据
$ sbin/hadoop-daemon.sh start namenode ##启动namenode
6)查看web
http://hh1:50070/ ##standby
http://hh2:50070/ ##standby
7)手动切换namenode状态
$ bin/hdfs haadmin -transitionToActive nn1 ##切换成active
$ bin/hdfs haadmin -transitionToStandby nn1 ##切换成standby
- 开启故障自动转移
1)配置hdfs-site.xml文件
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
2)配置core-site.xml文件
<property>
<name>ha.zookeeper.quorum</name>
<value>hh1:2181,hh2:2181,hh3:2181</value>
</property>
3)分发配置文件到其他两台机器
scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml hh2:/opt/modules/hadoop-2.5.0/etc/hadoop
scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml hh3:/opt/modules/hadoop-2.5.0/etc/hadoop
4)启动服务
首先停止hdfs和zk
$ sbin/stop-dfs.sh
$ bin/zkServer.sh stop ##关闭zk(3台服务器)
重启
$ bin/zkServer.sh start ##启动zk(3台服务器)
5)初始化zkfc[PC1也就是nn1]
$ bin/hdfs zkfc -formatZK
6)启动
$ sbin/start-dfs.sh ##启动hdfs
bin/hdfs haadmin -getServiceState nn1 #查看nn1状态
bin/hdfs haadmin -getServiceState nn2 #查看nn2状态
【PC1】
[hadoop@hadoop hadoop-2.5.0]$ jps
11006 JournalNode
10821 DataNode
11690 Jps
9386 QuorumPeerMain
10723 NameNode
11185 DFSZKFailoverController
【PC2】
[hadoop@hadoop hadoop-2.5.0]$ jps
7263 NameNode
7544 DFSZKFailoverController
7184 QuorumPeerMain
7624 Jps
7417 JournalNode
7326 DataNode
【PC3】
[hadoop@hadoop hadoop-2.5.0]$ jps
5678 Jps
5449 QuorumPeerMain
5618 JournalNode
5530 DataNode