文章目录
- 一、 HDFS工作机制
- 二、yarn资源管理器配置
- 1. 编辑配置文件
- 2. 命令行启动
- 三、Hadoop+zookeeper高可用
- 1. 开启第五台虚拟机
- 2. server1、2、3、4上初始操作
- 3. 搭建zookeeper集群
- 4. Hadoop配置
- 4. 启动 hdfs 集群(按顺序启动)
- 5. 访问测试与故障切换
- 6. 高可用平台中加入ResourceManger服务实现yarn的高可用
一、 HDFS工作机制
- 首先客户端创建任务,然后由资源管理器会把请求发往nn节点(namenode),之后nn将会进行分配,比如说分配多少个block、复制几份等,然后nn将会把block分配的节点的地址回传给客户端,之后客户端会以数据包(流)的形式从第一个block往后面的数据节点上开始发送,开始存,同时也会把这个数据列表发往datanode节点,datanode节点将会把这个数据列表传递给其它的datanode,值得一提的是hadoop具备机架感应技术,能够自动感知哪些datanode位于同一机架中,这为数据最终的存储提供了一定的依据。
总结来说,nn上其实维护了两个列表:有关dn的列表、有关block的列表 - HDFS属于Master与Slave结构。一个集群中只有一个NameNode,可以有多个DataNode。
- HDFS存储机制保存了多个副本,当写入1T文件时,我们需要3T的存储,3T的网络流量带宽;系统提供容错机制,副本丢失或宕机可自动恢复,保证系统高可用性。
- HDFS默认会将文件分割成block。然后将block按键值对存储在HDFS上,并将键值对的映射存到内存中。如果小文件太多,会导致内存的负担很重。
- HDFS采用的是一次写入多次读取的文件访问模型。一个文件经过创建、写入和关闭之后就不需要改变。这一假设简化了数据一致性问题,并且使高吞吐量的数据访问成为可能。
漫画形象解读链接:
HDFS容错机制
- 节点失败监测机制:DN每隔3秒向NN发送心跳信号,10分钟收不到,认为DN宕机。
- 通信故障监测机制:只要发送了数据,接收方就会返回确认码。
- 数据错误监测机制:在传输数据时,同时会发送总和校验码。
参考链接:
二、yarn资源管理器配置
工作原理描述:客户端运行一个任务、应用,将请求发送给rm,之后rm会到nm上,nm会把节点上拥有的资源汇报给rm,之后会在am上运行一个应用管理器,这个应用管理器会监控整个job的运行状态,之后会向rm注册一个地址,之后客户端可以直接连接am来获取整个job的进度。am应用管理器中是用java编写的代码,它会根据Job的具体情况来决定以怎样的方式来运行job,或者说要申请哪些资源来运行job。am与nm之间不可以直接进行交互,所有的资源调度都要来自于rm。当申请的应用挂掉之后,nm可以实现job的启停,当整个job完成之后,nm会向rm申请注销资源。
1. 编辑配置文件
[hadoop@server1 hadoop]$ cd etc/hadoop/
[hadoop@server1 hadoop]$ vim hadoop-env.sh ##为mapred添加环境变量
etc/hadoop/mapred-site.xml:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
</property>
</configuration>
etc/hadoop/yarn-site.xml:
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
2. 命令行启动
[hadoop@server1 hadoop]$ cd ..
[hadoop@server1 etc]$ cd ..
[hadoop@server1 hadoop]$ sbin/start-yarn.sh ##启动yarn
Starting resourcemanager
Starting nodemanagers
server4: Warning: Permanently added 'server4,192.168.0.4' (ECDSA) to the list of known hosts.
[hadoop@server1 hadoop]$ jps
8788 SecondaryNameNode
8568 NameNode
9944 Jps
9643 ResourceManager
[hadoop@server2 ~]$ jps
14418 NodeManager
14507 Jps
14063 DataNode
yarn开启后datanode节点上会开启nodemanger进程
三、Hadoop+zookeeper高可用
1. 开启第五台虚拟机
server5
useradd hadoop
yum install -y nfs-utils
mount 192.168.0.1:/home/hadoop/ /home/hadoop/
su - hadoop
数据同步
2. server1、2、3、4上初始操作
server1 停掉yarn和dfs
[hadoop@server1 hadoop]$ sbin/stop-yarn.sh
[hadoop@server1 hadoop]$ sbin/stop-dfs.sh
[hadoop@server1 hadoop]$ rm -fr /tmp/* 删除临时文件在每个节点中都要操作
3. 搭建zookeeper集群
[hadoop@server1 ~]$ tar zxf zookeeper-3.4.9.tar.gz ##安装 zookeeper
[hadoop@server1 ~]$ cd zookeeper-3.4.9/
[hadoop@server1 zookeeper-3.4.9]$ cd conf/
[hadoop@server1 conf]$ ls
configuration.xsl log4j.properties zoo_sample.cfg
[hadoop@server1 conf]$ cp zoo_sample.cfg zoo.cfg
[hadoop@server1 conf]$ vim zoo.cfg ##编辑 zoo.cfg 文件
server.1=192.168.0.2:2888:3888
server.2=192.168.0.3:2888:3888
server.3=192.168.0.4:2888:3888
server 2 3 4
bin/hdfs --daemon start journalnode
mkdir /tmp/zookeeper
echo 1 > /tmp/zookeeper/myid ##server2 3 4数字不同
cd zookeeper-3.4.9/
bin/zkServer.sh start ##各节点启动服务
bin/zkServer.sh status
4. Hadoop配置
编辑 core-site.xml 文件:
[hadoop@server1 hadoop]$ vim core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://masters:9000</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>192.168.0.2:2181,192.168.0.3:2181,192.168.0.4:2181</value>
</property>
</configuration>
17
[hadoop@server1 hadoop]$ vim hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>masters</value>
</property>
<property>
<name>dfs.ha.namenodes.masters</name>
<value>h1,h2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.masters.h1</name>
<value>192.168.0.1:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.masters.h1</name>
<value>192.168.0.1:9870</value>
</property>
<property>
<name>dfs.namenode.rpc-address.masters.h2</name>
<value>192.168.0.5:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.masters.h2</name>
<value>192.168.0.5:9870</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://192.168.0.2:8485;192.168.0.3:8485;192.168.0.4:8485/masters</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/tmp/journaldata</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.masters</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
4. 启动 hdfs 集群(按顺序启动)
1)在三个 DN 上依次启动 zookeeper 集群
$ bin/zkServer.sh start
2)在三个 DN 上依次启动 journalnode(第一次启动 hdfs 必须先启动 journalnode)
3)格式化 HDFS 集群,格式化 zookeeper (只需在 server1 上执行即可)
[hadoop@server1 hadoop]$ bin/hdfs namenode -format ##重新初始化
[hadoop@server1 hadoop]$ ls /tmp/ ##初始化完成后/tmp目录中产生临时文件
hadoop-hadoop hadoop-hadoop-namenode.pid hsperfdata_hadoop
[hadoop@server1 hadoop]$ scp -r /tmp/hadoop-hadoop 192.168.0.5:/tmp ##复制初始化后产生的文件到server5相关目录中保存server1和server5具有相同的配置
[hadoop@server1 hadoop]$ bin/hdfs zkfc -formatZK
4)启动 hdfs 集群 $ sbin/start-dfs.sh
[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server1 hadoop]$ ssh server5
[hadoop@server1 hadoop]$ jps
10895 Jps
[hadoop@server1 hadoop]$ sbin/start-dfs.sh
5) 查看各节点状态
[hadoop@server1 hadoop]$ jps
11457 Jps
11059 NameNode
11407 DFSZKFailoverController
[hadoop@server5 ~]$ jps
14112 Jps
13955 NameNode
14023 DFSZKFailoverController
[hadoop@server2 zookeeper-3.4.9]$ jps
15856 Jps
15732 DataNode
15578 JournalNode
[hadoop@server3 zookeeper-3.4.9]$ jps
15543 JournalNode
15816 Jps
15691 DataNode
[hadoop@server4 zookeeper-3.4.9]$ jps
15637 Jps
15366 JournalNode
15514 DataNode
上传数据
[hadoop@server1 hadoop]$ cd etc/hadoop/
[hadoop@server1 hadoop]$ vim core-site.xml
[hadoop@server1 hadoop]$ cd ..
[hadoop@server1 etc]$ cd ..
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir /user
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir /user/hadoop
[hadoop@server1 hadoop]$ bin/hdfs dfs -put demo
5. 访问测试与故障切换
server1往hdfs中上传数据时:
故障切换:
[hadoop@server1 hadoop]$ jps
13188 Jps
12805 DFSZKFailoverController
12456 NameNode
[hadoop@server1 hadoop]$ kill 12456
[hadoop@server1 hadoop]$ jps
12805 DFSZKFailoverController
13205 Jps
[hadoop@server1 hadoop]$ bin/hdfs dfs -ls
Found 1 items
-rw-r--r-- 3 hadoop supergroup 209715200 2021-05-15 22:22 demo
[hadoop@server1 hadoop]$ bin/hdfs --daemon start namenode
[hadoop@server1 hadoop]$ jps
12805 DFSZKFailoverController
13401 Jps
13327 NameNode
6. 高可用平台中加入ResourceManger服务实现yarn的高可用
[hadoop@server1 hadoop]$ cd etc/hadoop/
[hadoop@server1 hadoop]$ vim yarn-site.xml
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>RM_CLUSTER</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>192.168.0.1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>192.168.0.5</value>
</property>
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>192.168.0.2:2181,192.168.0.3:2181,192.168.0.4:2181</value>
</property>