文章目录

  • 一、 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申请注销资源。

hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_zookeeper

1. 编辑配置文件
[hadoop@server1 hadoop]$ cd etc/hadoop/
[hadoop@server1 hadoop]$ vim hadoop-env.sh ##为mapred添加环境变量

hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_zookeeper_02

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>

hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_hadoop_03

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>

hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_zookeeper_04

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

hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_zookeeper_05


yarn开启后datanode节点上会开启nodemanger进程

hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_zookeeper_06

三、Hadoop+zookeeper高可用

1. 开启第五台虚拟机
server5
useradd hadoop
yum install -y nfs-utils
mount 192.168.0.1:/home/hadoop/ /home/hadoop/
su - hadoop

hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_hdfs_07


数据同步

hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_hdfs_08

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/*  删除临时文件在每个节点中都要操作

hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_hadoop_09

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

hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_hadoop_10


hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_hdfs_11

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

hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_hadoop_12


hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_hdfs_13


hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_zookeeper_14

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>

hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_hadoop_15


hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_zookeeper_16


hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_hadoop_17

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

hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_hdfs_18


hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_hadoop_19

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

hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_hdfs_20

hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_zookeeper_21

5. 访问测试与故障切换

server1往hdfs中上传数据时:

hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_hdfs_22

故障切换:

[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 yarn中容器如何实现资源隔离 新的hadoop资源管理器_zookeeper_23


hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_hadoop_24


hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_zookeeper_25

[hadoop@server1 hadoop]$ bin/hdfs --daemon start namenode
[hadoop@server1 hadoop]$ jps
12805 DFSZKFailoverController
13401 Jps
13327 NameNode

hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_hadoop_26


hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_zookeeper_27

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>

hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_hdfs_28


hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_hadoop_29


hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_hdfs_30


hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_hadoop_31


hadoop yarn中容器如何实现资源隔离 新的hadoop资源管理器_hdfs_32