Hadoop高可用、Yarn的资源分配

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32297447/article/details/84453865

hadoop概述:Hadoop实现了一个分布式文件系统(HadoopDistributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。

Hadoop框架最核心的设计就是:HDFS和MapReduce,HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。

命名空间

分布式存储:分布式文件系统管理的是一个服务器集群。在这个集群中,数据存储在集群的节点(即集群中的服务器)中,但是该文件系统把服务器的差异屏蔽了。那么,我们就可以像使用普通的文件系统一样使用,但是数据却分散在不同的服务器中。

Namespace:在分布式存储系统中,分散在不同节点中的数据可能属于同一个文件,为了组织众多的文件,把文件可以放到不同的文件夹中,文件夹可以一级一级的包含。我们把这种组织形式称为命名空间Namespace;命名空间管理着整个服务器集群中的所有文件,命名空间的职责与存储真实数据的职责是不一样的,负责命名空间职责的节点称为主节点master node,负责存储真实数据职责的节点称为从节点slave node。

主、从节点:主节点负责管理文件系统的文件结构,从节点负责存储真实的数据,合称为主从式结构master-slaves,用户操作时,也应该先和主节点打交道,查询数据在哪些从节点上存储,然后再从从节点读取。在主节点上,为了加快用户访问的速度,会把整个命名空间信息都放在内存中,当存储的文件越多时,那么主节点就需要越多的内存空间。

块(block):在从节点存储数据时,有的原始数据文件可能很大,有的可能很小,大小不一的文件不容易管理,那么可以抽象出一个独立的存储文件单位,称为块(block)。

容灾

容灾:数据存放在集群中,可能因为网络原因或者服务器硬件原因造成访问失败,最好采用副本(replication)机制,把数据同时备份到多台服务器中,这样数据就安全了,数据丢失或者访问失败的概率就小了。

分布式计算角色:

主节点称为作业节点(jobtracker)

从节点称为任务节点(tasktracker)

在任务节点中,运行第一阶段的代码称为 map 任务(map task),运行第二阶段的代码称为 reduce任务(reduce task)。

名词解释

Hadoop:Apache 开源的分布式框架。

HDFS:Hadoop 的分布式文件系统。 

NameNode:Hadoop HDFS 元数据主节点服务器,负责保存 DataNode 文件存储元数据信息,这个服务器是单点的。 

JobTracker:Hadoop 的 Map/Reduce 调度器,负责与TaskTracker 通信分配计算任务并跟踪任务迚度,这个服务器也是单点的。

DataNode:Hadoop 数据节点,负责存储数据。

TaskTracker:Hadoop 调度程序,负责 Map,Reduce 任务的启动和执行。

Zkfc:DFS故障转移控制器

RM:资源管理程序,负责集群中所有资源的统一管理和分配

注:Namenode 记录着每个文件中各个块(block)所在的数据节点的位置信息。

hadoop ha安装配置

(先把/app/hadoop2.7/etc/hadoop目录下的mapred-site.xml.template 进行重命名方便后续查找。命令# mv mapred-site.xml.template mapred-site.xml)

注意:bigdata241是主机,bigdata242是备份,bigdata243/244/245是计算节点配置zk

配置如下文件

core-site.xml Hadoop核心配置文件

<configuration>
 <property>
        <name>fs.defaultFS</name>
        <value>hdfs://cluster</value>
 <description>hadoop ha 部署方式下namenode访问地址,cluster是名字可自定义,后面hdfs-site.xml会用到</description>
 </property>
 <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop/app/hadoop2.7/tmp</value>
        <description>指定hadoop临时目录</description>
  </property>
<property>
        <name>ha.zookeeper.quorum</name>
        <value>bigdata243:2181,bigdata244:2181,bigdata245:2181</value>
        <description>指定zookeeper地址</description>
 </property>
<property>
        <name>ha.zookeeper.session-timeout.ms</name>
        <value>300000</value>
        <description>zk的超时时间,单位为毫秒,默认为5000,这个值比较小。建议设置得大一些,zk过于敏感,避免因为网路抖动等原因引起NameNode进行无所谓的>主备切换</description>
     </property>
<property>
        <name>fs.trash.interval</name>
        <value>1440</value>
        <description>开启垃圾回收站功能,防止误删除文件,HDFS文件删除后先放入回收站,单位为分,垃圾回收站最长保留数据时间为1天,超过一天后删除</description>
</property>
<property>
        <name>io.file.buffer.size</name>
        <value>131072</value>
        <description>设置SequenceFile中用到的读/写缓存大小,合理设置缓存大>小有利于提高数据传输效率,单位为byte,默认为4KB,这里设置为128KB</description>
</property>
</configuration>

hdfs-site.xml 分布式文件系统HDFS的配置文件

<configuration>
<property>  
        <name>dfs.nameservices</name>  
        <value>cluster</value>
        <description>指定hdfs的nameservice为cluster,需要和core-site.xml文件中的保持一致</description>
    </property>  
    <property>  
        <name>dfs.ha.namenodes.cluster</name>  
        <value>bigdata241,bigdata242</value>
        <description>cluster下有两个NameNode,分别为bigdata241和bigdata242</description>
    </property>
    <property>  
        <name>dfs.namenode.rpc-address.cluster.bigdata241</name>  
        <value>bigdata241:9000</value>
        <description>NameNode1的RPC通信地址,端口要和core-site.xml中fs.defaultFS的一致</description>
    </property>  
    <property>  
        <name>dfs.namenode.http-address.cluster.bigdata241</name>  
        <value>bigdata241:50070</value>
        <description>NameNode1的HTTP通信地址</description>
    </property>  
    <property>  
        <name>dfs.namenode.rpc-address.cluster.bigdata242</name>  
        <value>bigdata242:9000</value>
        <description>NameNode2的RPC通信地址,端口要和core-site.xml中fs.defaultFS的一致</description>
    </property>  
    <property>  
        <name>dfs.namenode.http-address.cluster.bigdata242</name>  
        <value>bigdata242:50070</value>
        <description>NameNode2的HTTP通信地址</description>
    </property>  
    <property>  
        <name>dfs.namenode.shared.edits.dir</name>  
        <value>qjournal://bigdata243:8485;bigdata244:8485;bigdata245:8485/cluster</value>
        <description>指定NameNode的元数据在JournalNode上的存放位置</description>
    </property>  
    <property>  
        <name>dfs.journalnode.edits.dir</name>  
        <value>/home/hadoop/app/hadoop2.7/journaldata</value>
        <description>指定NameNode的元数据在JournalNode上的存放位置</description>
    </property>  
    <property>  
        <name>dfs.ha.automatic-failover.enabled</name>  
        <value>true</value>
        <description>指定支持高可用自动切换机制</description>
    </property>  
    <property>  
        <name>dfs.client.failover.proxy.provider.cluster</name>  
   <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        <description>配置失败自动切换实现方式</description>
    </property>  
    <property>  
        <name>dfs.ha.fencing.methods</name>  
        <value>  
            sshfence  
            shell(/bin/true)  
        </value>
        <description>配置隔离机制,主要用于远程管理监听其他机器相关服务</description>
    </property>  
    <property>  
        <name>dfs.ha.fencing.ssh.private-key-files</name>  
        <value>/home/hadoop/.ssh/id_rsa</value>
        <description>使用隔离机制时需要ssh免密码登陆,/home/hadoop/为用户目录</description>
    </property>  
    <property>  
        <name>dfs.ha.fencing.ssh.connect-timeout</name>  
        <value>30000</value>
        <description>使用隔离机制时需要ssh免密码登陆时的超时时间,单位为毫秒</description>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/home/hadoop/app/hadoop2.7/tmp/name</value>
        <description>NameNode结点存储hadoop文件系统信息的本地系统路径</description>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/home/hadoop/app/hadoop2.7/tmp/data</value>
        <description>DataNode结点被指定要存储数据的本地文件系统路径,这个值只对NameNode有效,DataNode并不需要使用到它</description>
    </property>
    <property>   
        <name>dfs.webhdfs.enabled</name>   
        <value>true</value>
        <description>指定可以通过web访问hdfs目录</description>
    </property>
<property>
		<name>dfs.permissions.enabled</name>
		<value>false</value>
		<description>设置不启用 HDFS 文件系统的权限检查</description>
	</property>
</configuration>

mapred-site.xml 分布式计算框架MapReduce的配置文件

<configuration>
     <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
 	 <description>配置MapReduce运行于yarn中</description>
     </property>
<property> 
<name>mapreduce.jobhistory.address</name> 
<value>bigdata241:10020</value> 
</property>
 
<property> 
<name>mapreduce.jobhistory.webapp.address</name> 
<value>bigdata241:19888</value> 
</property> 

<property>
<name>mapreduce.jobhistory.address</name>
<value>bigdata242:10020</value>                  
</property>

<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>bigdata242:19888</value>                  
</property>

 <property>
  <name>yarn.app.mapreduce.am.staging-dir</name>
  <value>/tmp/yarn/MR-History</value>
<description>配置ApplicationMaster的jobhistory在hdfs存储路径</description>
 </property>
<property>
    <name>mapreduce.jobhistory.done-dir</name>
    <value>${yarn.app.mapreduce.am.staging-dir}/history/done</value>
</property>

<property>
    <name>mapreduce.jobhistory.intermediate-done-dir</name>
    <value>${yarn.app.mapreduce.am.staging-ir}/history/done_intermediate</value>
</property>
</configuration>

yarn-site.xml 分布式资源管理系统YARN的配置文件

Hadoop 2.4之前的版本,Yarn的ResourceManager是单点的。在Hadoop 2.4版本中,引入了ResourceManager HA。

  • ResourceManager是主备模式。
  • 可以一个主用RM、一个备用RM。也可以是一个主用RM,多个备用RM。
  • 客户端可以看到多个RM。客户端连接时,需要轮循各个RM,直到找到主用RM。

主备模式切换有两种模式:

  1. 自动切换
  2. 手工切换

对于手工切换模式:

yarn rmadmin -transitionToActive rm1 yarn rmadmin -transitionToStandby rm1

对于自动切换模式,可以强制手工切换:

yarn rmadmin -transitionToActive rm1 --forcemanual

yarn rmadmin -transitionToStandby rm1 --forcemanual

<property>
  <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
  <value>true</value>
</property>

<property> 
   <name>yarn.resourcemanager.connect.retry-interval.ms</name> 
   <value>2000</value>
</property>

<property>
  <name>yarn.resourcemanager.recovery.enabled</name> 
  <value>true</value> 
</property>

<property> 
  <name>yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms</name> 
  <value>5000</value> 
</property> 

<property> 
  <name>yarn.client.failover-proxy-provider</name> 
  <value>org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider</value> 
</property> 

<property>
    <name>yarn.resourcemanager.ha.automatic-failover.zk-base-path</name>
    <value>/yarn-leader-election</value>
</property>
 <!-- 资源调度模型  -->
<property> 
  <name>yarn.nodemanager.aux-services</name> 
  <value>mapreduce_shuffle,spark_shuffle</value> 
</property> 

<property> 
  <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> 
  <value>org.apache.hadoop.mapred.ShuffleHandler</value> 
</property> 

 <!-- spark on yarn 动态资源分配调度模型类  -->
<property> 
  <name>yarn.nodemanager.aux-services.spark_shuffle.class</name> 
  <value>org.apache.spark.network.yarn.YarnShuffleService</value> 
</property> 
 <!-- spark on yarn 动态资源分配服务接口  -->
<property> 
  <name>spark.shuffle.service.port</name> 
  <value>7337</value> 
</property> 

<property> 
  <name>yarn.nodemanager.local-dirs</name> 
  <value>/home/hadoop/app/hadoop/tmp</value> 
</property> 

<property> 
  <name>yarn.nodemanager.log-dirs</name> 
  <value>/home/hadoop/app/hadoop/logs</value> 
</property>   
<!-- 一个container可申请的最小内存  -->
<property>
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>512</value>
</property>

 <!-- 一个container可以申请的最大内存  -->
<property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>4096</value>
</property>

 <!-- nodemanager可使用内存资源大小  -->
<property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>16384</value>
</property>
 <!--  虚拟内存倍数  -->
<property>
    <name>yarn.nodemanager.vmem-pmem-ratio</name>
    <value>4.2</value>
    <description>允许的虚拟内存倍数</description>
</property>

 <!-- nodemanager可使用的最大cpu个数
      是个虚数并不一定需要跟物理cpu个数匹配可以更多  -->
<property>
    <name>yarn.nodemanager.resource.cpu-vcores</name>
    <value>8</value>
</property>
 <!-- 开启mapreduce中间过程压缩  -->
<property>
  <name>mapreduce.map.output.compress</name>  
  <value>true</value>
</property>

<property>
  <name>mapreduce.map.output.compress.codec</name>  
  <value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>

<property>
    <name>mapreduce.output.fileoutputformat.compress</name>
    <value>true</value>
 </property>

  <property>
    <name>mapreduce.output.fileoutputformat.compress.codec</name>
    <value>org.apache.hadoop.io.compress.SnappyCodec</value>
    <description>数据的压缩类型,这里使用Snappy压缩</description>
  </property>

  <property>
    <name>mapreduce.output.fileoutputformat.compress.type</name>
    <value>BLOCK</value>
    <description>数据的压缩级别,这里设置按数据块压缩</description>
  </property>
<property>
    <name>yarn.log.server.url</name>
    <value>http://bigdata241:19888/jobhistory/logs</value>
    <description>历史日志对应路径</description>
  </property>

  <!-- 开启容量调度模式 -->
  <property>
    <name>yarn.resourcemanager.scheduler.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
    <description>
    配置yarn启用容量调度模式(默认即是容量调度),配置文件为capacity-scheduler.xml
    </description>
  </property>
<configuration>
    <!-- 日志聚合功能yarn.log  start --> 
    <property>   
        <name>yarn.log-aggregation-enable</name>   
        <value>true</value>   
        <description>开启日志聚合功能,默认为false</description>
    </property>         
    <property>   
        <name>yarn.log-aggregation.retain-seconds</name>   
        <value>259200</value>   
        <description>在HDFS上聚合的日志最长保留多少秒,这里配置为3天</description>
    </property> 
 <property>
    <name>一天yarn.log-aggregation.retain-check-interval-seconds</name>
    <value>86400</value>
    <description>清理过期聚合日志程序的执行间隔时间一天</description>
  </property>
<property>
    <name>yarn.nodemanager.remote-app-log-dir</name>
    <value>/tmp/logs</value>
    <description>聚合日志在hdfs上的目录</description>
  </property> 
<!-- 日志聚合功能yarn.log  end --> 

    <!-- 配置resourcemanager  start
                           在YARN中,ResourceManager负责集群中所有资源的统一管理和分配,它接收来自各个节点(NodeManager)的资源汇报信息,并把这些信息按照一定的策略分配给各个应用程序(实际上是ApplicationManager)-->
    <property>  
       <name>yarn.resourcemanager.ha.enabled</name>  
       <value>true</value>  
       <description>开启resourcemanager ha,默认为false</description>
    </property>  
    <property>  
       <name>yarn.resourcemanager.cluster-id</name>  
       <value>yrc</value>  
       <description></description>
    </property>  
    <property>  
       <name>yarn.resourcemanager.ha.rm-ids</name>  
       <value>rm1,rm2</value>  
       <description></description>
    </property>  
    <property>  
       <name>yarn.resourcemanager.hostname.rm1</name>  
       <value>bigdata241</value>  
       <description>node1</description>
    </property>     
    <property>  
       <name>yarn.resourcemanager.hostname.rm2</name>  
       <value>bigdata242</value>  
       <description>node2</description>
    </property>  
    <property>  
       <name>yarn.resourcemanager.zk-address</name>  
       <value>bigdata243:2181,bigdata244:2181,bigdata245:2181</value> 
    </property>  
    <!-- 配置resourcemanager  end -->

    <!-- 配置nodemanager  start
                           NodeManager是运行在单个节点上的代理,它管理Hadoop集群中单个计算节点 -->
    <property>  
       <name>yarn.nodemanager.aux-services</name>  
       <value>mapreduce_shuffle</value>  
    </property> 
    <property>    
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>    
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>    
    </property>
    <!-- 配置nodemanager  end -->
<property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>51200</value>
    <descrition>集群中机器都有100/200GB的RAM。部分RAM应保留用于操作系统。在每个节点上,我们将为YARN分配50GB RAM。以下属性设置YARN可在节点上使用的最大内存</descrition>
</property>
<property>
    <name>yarn.nodemanager.vmem-pmem-ratio</name>
    <value>2.1</value>
</property>
<property>
    <name>yarn.resourcemanager.webapp.address.rm1</name>
    <value>bigdata241:8088</value>
</property>
<property>
    <name>yarn.resourcemanager.webapp.address.rm2</name>
    <value>bigdata242:8088</value>
</property>
</configuration>

slaves(子机名对应子机个数)

bigdata243
bigdata244
bigdata245

启动Hadoop集群准备 :root用户下,可以省略,阿里云服务器默认关闭防火墙

关闭防火墙(子机照做)

# systemctl disable firewalld

# systemctl stop firewalld

进程守护(子机照做)

# setenforce 0

# vi /etc/selinux/config 设置SELINUX=disabled

Yarn的资源分配

配置
配置FairScheduler一般需要配置两个文件。首先调度器相关的选项可以在yarn-site.xml文件中配置。其次,大多数情况下用户希望创建一个分配文件来列出哪些队列用来分配以及对应的权重和容量。这个分配文件会每10秒钟重新加载一次,从而支持运行时配置变更。
yarn-site.xml中的配置属性
yarn.scheduler.fair.allocation.file
分配文件的路径地址。分配文件是一个XML文件来描述队列和队列的属性以及特定的策略。这个文件必须是一个XML格式的文件。如果配置一个相对路径,那么该文件会在classpath中被搜索到。默认是fair-scheduler.xml。
yarn.scheduler.fair.user-as-default-queue
是否使用用户名关联分配的默认队列名称,如果是false或者未设置,所有的作业都有一个共享的默认队列,叫做default。默认是true。如果队列分配策略在分配文件中配置过,那么这个属性会被忽略。
yarn.scheduler.fair.preemption
是否抢占。默认false。
yarn.scheduler.fair.preemption.cluster-utilization-threshold
当抢占式配置后,配置使用阈值。该阈值计算是按照所有资源的容量使用量的最大比例来算的。默认是0.8f。
yarn.scheduler.fair.sizebasedweight
是否分配资源给独立的作业,基于作业的size而不是均等的分配所有的资源。设置为true时,应用的权重通过1+请求资源内存大小的自然对数来计算。默认是false。
yarn.scheduler.fair.assignmultiple
是否允许在一次心跳中进行多次容器分配。默认是false。
yarn.scheduler.fair.max.assign
如果上个属性设置为true,这个属性明确一次心跳中能分配的最大的容器数。默认是-1,表示没有限制。
yarn.scheduler.fair.locality.threshold.node
对于特定node上请求容器的应用作业,该属性代表了自从上次容器分配等待调度到其他节点node上的机会的次数。表示为0到1之间的一个浮点数,该数字表达了集群规模的比例,代表了向上传递的调度机会数。默认值是-1.0,代表不传递任何调度机会。
yarn.scheduler.fair.locality.threshold.rack
对于特定rack上请求容器的作业,该属性代表了自从上次容器分配等待调度到其他rack上的机会的次数。表示为0到1之间的一个浮点数,该数字表达了集群规模的比例,代表了向上传递的调度机会数。默认值是-1.0,代表不传递任何调度机会。
yarn.scheduler.fair.allow-undeclared-pools
如果为true,新的队列可以在作业提交时创建,无论是提交者指定的应用作业的队列还是default的队列。如果为false,应用作业在任何时间都会被分配到一个没有在分配文件张声明过的队列中,相反就只会分配到default队列。该属性默认是true。如果队列分配策略在分配文件中设置过,那么这个属性失效。
yarn.scheduler.fair.update-interval-ms
锁定调度器和重新计算资源分配和需求,检查是否有抢占的时间间隔属性。默认是500ms。

猜你喜欢

转载自blog.csdn.net/qq_32297447/article/details/84453865