Hadoop集群各类参数配置详解
1. 参数配置说明
core-site.xml参数配置详情
core-default.xml与core-site.xml的功能是一样的,如果在core-site.xml里没有配置的属性,则会自动会获取core-default.xml里的相同属性的值
属性 | 值 | 说明 |
fs.default.name | hdfs://??? | 定义master的URI和端口 |
hadoop.tmp.dir | /??? | 临时文件夹,指定后需将使用到的所有子级文件夹都要手动创建出来,否则无法正常启动服务。 |
hdfs-site.xml参数配置详情
属性 | 值 | 说明 |
dfs.replication | ??? | hdfs数据块的复制份数,默认3,理论上份数越多跑数速度越快,但是需要的存储空间也更多。 |
dfs.namenode.name.dir | file:/usr/hadoop/hadoop-2.7.3/hdfs/??? | NN所使用的元数据保存 |
dfs.datanode.data.dir | file:/usr/hadoop/hadoop-2.7.3/hdfs/??? | 真正的datanode数据保存路径,可以写多块硬盘,逗号分隔 |
yarn-site.xml参数配置详情
属性 | 值 | 说明 |
yarn.resourcemanager.admin.address | ${yarn.resourcemanager.hostname}:18141 |
|
yarn.nodemanager.aux-services | mapreduce_shuffle | NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MapReduce程序 |
mapred-site.xml参数配置详情
属性 | 值 | 说明 |
mapreduce.framework.name | yarn | 指定MR运行框架,默认为local |
Hadoop是由Java语言编写的,在分布式服务器集群上存储海量数据并运行分布式分析应用的开源框架,其核心部件是HDFS与MapReduce。
- HDFS是一个分布式文件系统:引入存放文件元数据信息的服务器Namenode和实际存放数据的服务器Datanode,对数据进行分布式储存和读取。
- MapReduce是一个计算框架:MapReduce的核心思想是把计算任务分配给集群内的服务器里执行。通过对计算任务的拆分(Map计算/Reduce计算)再根据任务调度器(JobTracker)对任务进行分布式计算。
配置文件 | 配置对象 | 主要内容 |
hadoop-env.sh | hadoop运行环境 | 用来定义Hadoop运行环境相关的配置信息; |
core-site.xml | 集群全局参数 | 定义系统级别的参数,包括HDFS URL、Hadoop临时目录等; |
hdfs-site.xml | HDFS参数 | 定义名称节点、数据节点的存放位置、文本副本的个数、文件读取权限等; |
mapred-site.xml | MapReduce参数 | 包括JobHistory Server 和应用程序参数两部分,如reduce任务的默认个数、任务所能够使用内存的默认上下限等; |
yarn-site.xml | 集群资源管理系统参数 | 配置ResourceManager ,nodeManager的通信端口,web监控端口等; |
Hadoop的配置类是由资源指定的,资源可以由一个String或Path来指定,资源以XML形式的数据表示,由一系列的键值对组成。资源可以用String或path命名(示例如下),
- String:指示hadoop在classpath中查找该资源;
- Path:指示hadoop在本地文件系统中查找该资源。
<configuration>
<property>
<name>fs.default.name</name>
<value>????</value>
</property>
</configuration>
@Author:懒羊羊
2. 常用属性解析
1.core-site.xml参数
配置参数 | 说明 |
fs.default.name | 用于指定NameNode的地址 |
hadoop.tmp.dir | Hadoop运行时产生文件的临时存储目录 |
2.hdfs-site.xml
配置参数 | 说明 |
dfs.replication | 用于指定NameNode的地址 |
dfs.namenode.name.dir | NameNode在本地文件系统中持久存储命名空间和事务日志的路径 |
dfs.datanode.data.dir | DataNode在本地文件系统中存放块的路径 |
dfs.permissions | 集群权限系统校验 |
dfs.datanode.use.datanode.hostname | datanode之间通过域名方式通信 |
注意:外域机器通信需要用外网IP,未配置hostname访问会访问异常。可以在Java api客户端使用conf.set("fs.client.use.datanode.hostname","true");
。
3.mapreduce-site.xml
配置参数 | 说明 |
mapreduce.framework.name | 指定执行MapReduce作业的运行时框架。属性值可以是local,classic或yarn。 |
4.yarn-site.xml
配置参数 | 说明 |
yarn.resourcemanager.admin.address | 用于指定RM管理界面的地址(主机:端口) |
yarn.nodemanager.aux-services | mapreduce 获取数据的方式,指定在进行mapreduce作业时,yarn使用mapreduce_shuffle混洗技术。这个混洗技术是hadoop的一个核心技术,非常重要。 |
yarn.nodemanager.auxservices.mapreduce.shuffle.class | 用于指定混洗技术对应的字节码文件,值为org.apache.hadoop.mapred.ShuffleHandler |
@Author:懒羊羊
3. 配置文件编写
3.1 hadoop-env.sh
用于定义hadoop运行环境相关的配置信息,比如配置JAVA_HOME环境变量、为hadoop的JVM指定特定的选项、指定日志文件所在的目录路径以及master和slave文件的位置等
一般存放于二级/etc/hadoop下
# JAVA_HOME环境变量
echo export JAVA_HOME=JAVA文件存放目录 >> hadoop-env.sh
3.2 core-site.xml
用于定义系统级别的参数,指定HDFS上NN地址为master,端口9000,如HDFS URL、Hadoop的临时目录以及用于rack-aware集群中的配置文件的配置等,此中的参数定义会覆盖core-default.xml文件中的默认配置;
完全分布式
<configuration>
<!--设置全局参数,指定HDFS上NN地址为master,端口9000-->
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
<!--指定HDFS执行时的临时目录,指定NameNode、DataNode、JournalNode等存放数据的公共目录。用户也可以自己单独指定这三类节点的目录。以下的/hdfs/tmp目录与文件都是自己创建的 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/hadoop/hadoop-2.7.3/hdfs/tmp</value>
<description>A base for other tempory directories</description>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
<final>4096</final>
<description>流文件的缓冲区为4K</description>
</property>
<property>
<name>fs.checkpoint.period</name>
<value>60</value>
</property>
<property>
<name>fs.checkpoint.size</name>
<value>67108864</value>
</property>
</configuration>
HA高可用
<configuration>
<property>
<!--指定hadoop集群在zookeeper上注册的节点名时,默认的HDFS路径-->
<name>fs.defaultFS</name>
<value>hdfs://hacluster</value>
</property>
<!--指定HDFS执行时的临时目录,指定NameNode、DataNode、JournalNode等存放数据的临时目录。用户也可以自己单独指定这三类节点的目录。以下的/tmp目录与文件都是自己创建的 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/root/hadoopData/tmp</value>
</property>
<property>
<!--流文件的缓冲区大小,默认4kb-->
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<property>
<!--指定zookeeper的存放地址:端口,注意:数量一定是奇数,且不少于三个节点 -->
<name>ha.zookeeper.quorum</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
</configuration>
3.3 hdfs-site.xml
HDFS的相关设定,如文件副本的个数、块大小及是否使用强制权限等,此中的参数定义会覆盖hdfs-default.xml文件中的默认配置;
完全分布式
<configuration>
<!--指定hdfs参数,保存数据副本的数量,默认为3,如果是hadoop的伪分布式模式,此值必须为1-->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<!--namenode名称节点在本地文件系统数据的存放位置,可以指定多个目录实现容错,用逗号分隔-->
<name>dfs.namenode.name.dir</name>
<value>file:/usr/hadoop/hadoop-2.7.3/hdfs/name</value>
<final>true</final>
</property>
<property>
<!--datanode数据节点存储数据块时存储在本地文件系统数据的存放位置,可以指定多个目录实现"扩容",用逗号分隔-->
<name>dfs.datanode.data.dir</name>
<value>file:/usr/hadoop/hadoop-2.7.3/hdfs/data</value>
<final>true</final>
</property>
<!-- 定义HDFS对应的HTTP服务器地址和端口 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:50090</value>
</property>
<!--是否通过http协议读取hdfs文件,如果选是,则集群安全性较差-->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<!--hdfs文件操作权限,false为不验证,关闭集群权限校验,允许其他用户连接集群-->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<!--指定datanode之间通过域名进行通信-->
<property>
<name>dfs.datanode.use.datanode.hostname</name>
<value>true</value>
</property>
</configuration>
HA高可用
<configuration>
<property>
<!--指定hadoop集群在zookeeper上注册的节点名,相当于给hdfs起个名字-->
<name>dfs.nameservices</name>
<value>hacluster</value>
</property>
<property>
<!--指定DataNode存储block块默认大小128M-->
<name>dfs.block.size</name>
<value>134217728</value>
</property>
<property>
<!--副本数量,不配置的话默认为3-->
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<!--namenode节点数据(元数据)的存放位置-->
<name>dfs.namenode.name.dir</name>
<value>file:/root/hadoopData/name</value>
</property>
<property>
<!--datanode节点数据(元数据)的存放位置-->
<name>dfs.datanode.data.dir</name>
<value>file:/root/hadoopData/data</value>
</property>
<!--是否通过http协议读取hdfs文件,如果选是,则集群安全性较差-->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.datanode.max.transfer.threads</name>
<value>4096</value>
</property>
<property>
<!-- 指定NameService为hacluster时,集群下有两个namenode,分别为nn1,nn2,这里的值是逻辑名称,名字随便起,相互不重复即可 -->
<name>dfs.ha.namenodes.hacluster</name>
<value>nn1,nn2</value>
</property>
<!-- 指定nn1的RPC地址,表明nn1的rpc、servicepc和http通信 -->
<property>
<name>dfs.namenode.rpc-address.hacluster.nn1</name>
<value>master:9000</value>
</property>
<property>
<name>dfs.namenode.servicepc-address.hacluster.nn1</name>
<value>master:53310</value>
</property>
<!--指定nn1的http地址-->
<property>
<name>dfs.namenode.http-address.hacluster.nn1</name>
<value>master:50070</value>
</property>
<!-- 指定nn2的RPC地址,表明nn2的rpc、servicepc和http通信 -->
<property>
<name>dfs.namenode.rpc-address.hacluster.nn2</name>
<value>slave1:9000</value>
</property>
<property>
<name>dfs.namenode.servicepc-address.hacluster.nn2</name>
<value>slave1:53310</value>
</property>
<!--指定nn2的http地址-->
<property>
<name>dfs.namenode.http-address.hacluster.nn2</name>
<value>slave1:50070</value>
</property>
<property>
<!-- 指定hacluster上两个namenode共享edits文件目录时,使用的JournalNode的集群信息 -->
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;slave1:8485;slave1:8485/hacluster</value>
</property>
<property>
<!-- 指定JournalNode集群在对NameNode的目录进行共享时,自己存储数据的磁盘路径。dfs路径是自己创建,journalnode_data是启动journalnode自动生成在本地磁盘存放数据的位置 -->
<name>dfs.journalnode.edits.dir</name>
<value>/opt/software/hadoop-2.7.7/dfs/journalnode_data</value>
</property>
<property>
<!-- namenode操作日志的存放位置 -->
<name>dfs.namenode.edits.dir</name>
<value>/opt/software/hadoop-2.7.7/dfs/edits</value>
</property>
<property>
<!-- 开启namenode故障转移自动切换 -->
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<!-- 配置失败自动切换实现方式 -->
<name>dfs.client.failover.proxy.provider.hacluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<!-- 配置隔离机制,一旦需要NameNode切换,使用ssh方式进行操作 -->
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
<value>shell(true)</value>
</property>
<property>
<!-- 如果使用ssh进行故障切换,使用ssh通信时用的密钥存储的位置-->
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<!--hdfs文件操作权限,false为不验证-->
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<!--指定datanode之间通过域名进行通信-->
<name>dfs.datanode.use.datanode.hostname</name>
<value>true</value>
</property>
</configuration>
3.4 yarn-site.xml
完全分布式
<configuration>
<!--ResourceManager 提供给客户端访问的地址。客户端通过该地址向RM提交应用程序,杀死应用程序等-->
<property>
<name>yarn.resourcemanager.address</name>
<value>master:18040</value>
</property>
<!--ResourceManager提供给ApplicationMaster的访问地址。ApplicationMaster通过该地址向RM申请资源、释放资源等-->
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:18030</value>
</property>
<!--ResourceManager对 web 服务提供地址。用户可通过该地址在浏览器中查看集群各类信息-->
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:18088</value>
</property>
<!--ResourceManager 提供给 NodeManager的地址,NodeManager通过该地址向RM汇报心跳,领取任务等-->
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:18025</value>
</property>
<!--ResourceManager 提供给 admin 管理员的访问地址。管理员通过该地址向RM发送管理命令等。-->
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:18141</value>
</property>
<!--指定NodeManager获取数据的方式和运行的附属服务。需配置成mapreduce_shuffle,才可运行MapReduce程序-->
<property>
<name>yarn.nodemanager:aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 通过该配置项,用户可以自定义一些服务,例如Map-Reduce的shuffle功能就是采用这种方式实现的,这样就可以在NodeManager上扩展自己的服务。用于指定混洗技术对应的字节码文件,值为org.apache.hadoop.mapred.ShuffleHandler-->
<property>
<name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>
HA高可用
<configuration>
<property>
<!-- 开启Yarn高可用 -->
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<!-- 指定Yarn集群在zookeeper上注册的节点名 -->
<name>yarn.resourcemanager.cluster-id</name>
<value>hayarn</value>
</property>
<property>
<!-- 指定两个ResourceManager的名称 -->
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<!-- 指定rm1的主机 -->
<name>yarn.resourcemanager.hostname.rm1</name>
<value>slave1</value>
</property>
<property>
<!-- 指定rm2的主机 -->
<name>yarn.resourcemanager.hostname.rm2</name>
<value>slave2</value>
</property>
<property>
<!-- 配置zookeeper的地址:端口 -->
<name>yarn.resourcemanager.zk-address</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
<property>
<!-- 开启Yarn恢复机制 -->
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<property>
<!-- 配置执行ResourceManager恢复机制实现类 -->
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<property>
<!--指定主resourcemanager的地址-->
<name>yarn.resourcemanager.hostname</name>
<value>slave2</value>
</property>
<property>
<!--NodeManager获取数据的方式-->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<!--开启日志聚集功能-->
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<!--配置日志保留7天-->
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>
3.5 mapred-site.xml
HDFS的相关设定,如reduce任务的默认个数、任务所能够使用内存的默认上下限等,此中的参数定义会覆盖mapred-default.xml文件中的默认配置;
完全分布式
# 修改文件名
cp mapred-site.xml.template mapred-site.xml
<configuration>
<property>
<!--指定mapreduce运行在yarn上-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
HA高可用
<configuration>
<property>
<!--指定mapreduce运行在yarn上-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<!--配置任务历史服务器地址-->
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<!--配置任务历史服务器web-UI地址-->
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
<property>
<name>mapreduce.map.cpu.vcores</name>
<value>2</value>
<description>每个MapTask容器申请的核心数;默认1</description>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>4096</value>
<description>每个Maptask容器申请的内存大小;默认1G</description>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx3072m</value>
<description>map使用的JVM的堆大小heapsize;根据单个mapper/reducer容器内存进行调整,heapsize不能大于单个mapper/reducer容器内存值,一般设置为mapreduce.map.memory.mb的85%左右</description>
</property>
<property>
<!--开启uber模式,如果每次运行时间很短,但是运行次数很多,会重复的开启和销毁JVM,
开启Uber可以复用JVM,避免频繁的开关致使JVM资源浪费。-->
<name>mapreduce.job.ubertask.enable</name>
<value>true</value>
</property>
<!--reduce阶段的设置 -->
<property>
<name>mapreduce.reduce.cpu.vcores</name>
<value>2</value>
<description>每个ReduceTask容器申请的核心数;默认1</description>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>8192</value>
<description>Reduce task申请的内存大小</description>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx6144m</value>
<description>Reduce阶段的JVM的堆大小;同上</description>
</property>
</configuration>
3.6 master
hadoop的secondary-masters主机列表,当启动Hadoop时,其会在当前主机上启动NameNode和JobTracker,然后通过SSH连接此文件中的主机以作为备用NameNode;
echo master > master
3.7 slaves
Hadoop集群的slave主机列表,master启动时会通过SSH连接至此列表中的所有主机并为其启动DataNode和taskTracker进程;
vim slaves
slave1
slave2
......
@Author:懒羊羊
4. 更多配置信息
上述对hadoop的配置,大致可以涵盖日常工作使用,但想作为一名优秀的ha集群管理员,这些事远远不够的,推荐大家熟悉和掌握以下四个文档中十分之八九的配置信息,这样才能游刃有余的解决大数据集群系统在运行过程中遇到的各类问题。如下给出了ha集群全部配置信息方法获取:
4.1 官方文档