hadoop10--zookeeper安装和配置,job提交流程及优化

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执行的慢的原因
  1. 硬件的问题: 虽然集群的配置都是一样的, 但是仍然会有硬件不一样的问题, 比如硬件使用时间的不同会造成硬件性能的不一样, 所以硬件的不同会造成mapreduce执行的慢
  2. 数据倾斜: 当多个map执行的结果集中到了一个reduce上, 造成了数据的不平衡, 这样整个mapreduce任务就会以最慢的那个reduce为准, 也会是mapreduce执行的慢
  3. 磁盘上溢写次数: 磁盘上溢写次数过多也会造成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的安装与下载
  1. 下载, 官方网址: https://blog.csdn.net/forever428/article/details/83793206
  2. 修改文件权限,
sudo chown -R hadoop:hadoop zookeeper-3.4.10.tar.gz
  1. 解压, 命令 tar -zxvf zookeeper… -C [zookeeper]
  2. 修改配置文件
mv zoo_sample.cfg zoo.cfg
单机版安装
  1. 创建tmp目录. 并修改dataDir=/tmp/zookeeper 默认的属性 保存在tmp下
  2. 启动
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台)
PC01PC02PC03
NameNodeNameNodeResourceManager
ZKFCZKFCZooKeeper
DataNodeDataNodeDataNode
JournalNodeJournalNodeJournalNode
NodeManagerNodeManagerNodeManager
ZooKeeperZooKeeper
二 . 环境准备

1.主机名(3台PC)
2.hosts文件
3.网络配置
4.防火墙
5.设置SSH免登陆
6.时间同步

三. 安装部署
  1. 安装JDK(3台PC都要安装JDK)
    配置环境变量
  2. 安装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		##查看状态	
  1. 配置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
  1. 启动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. 开启故障自动转移
    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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值