集群规模大概260多台,TSC10机型,机型参数以下:java
> 1个8核CPU(E5-2620v4) > 64G内存 > HBA,12*4T SATA,1*240G SSD, > 2*10G网口
HBase和Hadoop的主结点共用,子结点也共用。node
角色 | 机型 | 数量 |
---|---|---|
HBase Master&Hadoop Namenode | B6 | 2 |
HBase RegionServer&Hadoop Datanode | TSC10 | 265 |
ZooKeeper | B6 | 5 |
ResourceManager(MR) | B6 | 1 |
HistoryServer(MR) | B6 | 1 |
NodeManager(MR) | TSC10 | 265 |
角色 | 版本 |
---|---|
HBase | 1.2.5 |
Hadoop | 2.7.2 |
Zookeeper | 3.4.6 |
配置参数主要是内存方面,对于主结点来讲,机型为B6,给主结点分配的内存是50G。数据结点方面,RegionServer分配了24G内存,DataNode分配2G内存。这样,对于混布的MR来讲,主要是NodeManager,也还有24G内存, MR的ResourceManager单独部署在B6,内存分配24G。linux
1 HBase内存配置web
HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -Xms10g -Xmx10g -Xmn4g" HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -Xms24g -Xmx24g -Xmn4g"
2 Hadoop内存参数docker
HADOOP_NAMENODE_OPTS="-Dcom.sun.management.jmxremote -server -Xmx50g -Xms50g -Xmn4g HADOOP_DATANODE_OPTS="-Dcom.sun.management.jmxremote -server -Xmx3g -Xmn1g
3 Yarn内存参数apache
YARN_RESOURCEMANAGER_OPTS="-Dcom.sun.management.jmxremote -server -Xmx24g -Xmn16g YARN_NODEMANAGER_OPTS="-Dcom.sun.management.jmxremote -Xmx24g
涉及swap方面,主要以下:bash
vm.swappiness=1 vm.dirty_background_ratio=1 vm.dirty_ratio=4
这里面采过一个坑,因为咱们老集群机器内在只有32G,内存的限制,因此咱们配置是打开swap内存。但tlinux不一样版本这个参数的含义是不同的,对于tlinux1.2版本,vm.swappinesss=0
表示开启swap内存,但在tlinux2.2版本,这个参数若是设置为0则表示禁用swap内存,设置为1才表示开启swap内存。因此对于不少新tlinux版本的机器一开始这个参数被设置成了0,在运行一段时间发现,结点极不稳定,GC频繁,机器负载也较高,regionserver容易掉,阻塞集群读写,影响仍是比较大的。后面将vm.swappiness
设置成1后,集群才比较稳定。app
混布MR的主要目的是在未接入业务的前期过程当中,利用集群空闲资源经过MR方式将老集群数据同步至新集群。对于HBase而言,集群间数据拷贝若是想高效率,有两种方式可考虑,一类就是直接文件拷贝方式,经过distcp
将HFile进行拷贝,拷贝完后再经过bulkload
方式将数据Load到新集群HBase表中;另外一类是snapshot
快照方式,先在老集群建立表快照,经过ExportSnapshot
将快照数据拷贝到新集群临时目录,快照数据在新集群上线也能够用bulkload方式将临时目录下的hfile文件load到线上,也可经过restore_snapshot
的方式将快照表恢复到线上正式表,不过还须要做major_compact
才算正式完成load。 这两种方式都须要借用MR才能完成数据拷贝,同时又没有额外的机器资源来单独部署MR,因此须要在现有集群上混布MR。框架
MR的配置主要涉及2个以下:webapp
mapred-site.xml yarn-site.xml
在引言中提到,在部署过程当中遇到最多的问题出如今配置Cgroup中出现。至于什么是Cgroup,简单讲是用于做资源隔离的,具体是基于物理资源Linux 内核提供的一种能够限制、记录、隔离进程组 (process groups) 所使用的物理资源 (如 cpu memory i/o 等等) 的机制。网上有不少关于Cgroup的介绍,是目前像docker,虚拟化等技术的基石,你们能够网上自行查找相关资料。
Yarn也是支持Cgroup隔离的,因此重点说下关于这部分的配置。
关于这个配置的配置项说明以下:
配置项 | 说明 |
---|---|
mapreduce.framework.name | 指定MR所使用的调度框架,通常为yarn |
fs.defaultFS | 指定hadoop的文件系统名称,与dfs.nameservices的要保持一致 |
dfs.nameservices | HDFS NN的逻辑名称 |
mapreduce.jobhistory.webapp.address | 历史做业web页面查询地址端口 |
mapreduce.jobhistory.address | 历史做业启动地址 |
mapreduce.jobhistory.uselocaldir | 历史做业本地存储目录 |
上面大部分是关于historyserver的配置项,那做业日志生成过程是怎么样的呢,主要涉及以下步骤:
- 1 yarn的资源调度器resourcemanager会启动一个MRAppMaster的进程,这个进程存在于具体执行做业的结点机器上;
- 2 MRAppMaster这个进程会将做业运行日志存储到
yarn.app.mapreduce.am.staging-dir
所配置的目录下,这个目录的默认值是/tmp/hadoop-yarn/staging/[username]/.staging
;- 3 做业运行完后,会将上述目录下相应做业的日志拷贝到
mapreduce.jobhistory.intermediate-done-dir
配置的目录中, 并按期启动扫描线程去将此目录下日志再拷贝到/history/done-dir
目录下,并把原目录相应日志删除;- 4 MRAppMaster进程将staging目录相应做业目录移除。
对于NodeManager来讲,其执行过程当中所产生的日志是保存在本地磁盘的,保存目录由yarn.nodemanager.local-dirs
参数来控制。完整的mapred-site.xml配置以下。
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>fs.defaultFS</name> <value>hdfs://hbase-hdfs-yarn</value> </property> <property> <name>dfs.nameservices</name> <value>hbase-hdfs-yarn</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>mr-master-host:19888</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>mr-master-host:10020</value> </property> <property> <name>mapreduce.jobhistory.uselocaldir</name> <value>false</value> </property> <property> <name>mapreduce.jobhistory.intermediate-done-dir</name> <value>/history/intermediate-done-dir</value> </property> <property> <name>mapreduce.jobhistory.done-dir</name> <value>/history/done-dir</value> </property>
这个配置项比较关键,涉及不少,这里将几个主要的配置项进行说明。
指定资源调度器相关地址。
<property> <name>yarn.resourcemanager.address</name> <value>mr-historyserver-host:8090</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>mr-historyserver-host:8091</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>mr-historyserver-host:8093</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>mr-historyserver-host:8088</value> </property> <property> <name>yarn.nodemanager.address</name> <value>0.0.0.0:8041</value> </property>
指定调度器相关资源使用限制
<property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>128</value> </property> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>51200</value> </property> <property> <name>yarn.scheduler.increment-allocation-mb</name> <value>128</value> </property> <property> <name>yarn.scheduler.minimum-allocation-vcores</name> <value>1</value> </property> <property> <name>yarn.scheduler.maximum-allocation-vcores</name> <value>8</value> </property> <property> <name>yarn.scheduler.increment-allocation-vcores</name> <value>1</value> </property>
这部分由于配置采用的是LinuxContainerExecutor方式。涉及的配置比较复杂,须要配置不少额外的东西。配置步骤以下:
- 1 建立cgroup目录,根据
yarn.nodemanager.linux-container-executor.cgroups.mount-path
配置的目录先建立好,如/cgroup
,这里主要是指定MR所使用的隔离组,若是不指定,默认是用/sys/fs/cgroup中的隔离参数。- 2 将系统cgroup中的cpu和memory mount到自定义的/cgroup目录,以下命令所示:
mount -t cgroup -o memory cgroup /cgroup/memory mount -t cgroup -o cpu cgroup /cgroup/cpu
- 3 mount以后,会在/cgroup下生成两个目录,cpu,memory,以下所示:
root@node1:/cgroup#ll total 0 drwxrwx--x 3 hdfsadmin users 0 Jun 14 16:13 cpu drwxrwx--x 3 hdfsadmin users 0 Jun 14 16:13 memory
- 4 建立子目录,目录名由参数
yarn.nodemanager.linux-container-executor.cgroups.hierarchy
指定,这里是hadoop-yarn, 并指定771权限和MR运行用户属主,如MR相关进程是运行在hdfsadmin
用户下,须要把相关目录赋予hdfsadmin 属主;
mkdir -p /cgroup/cpu/hadoop-yarn mkdir -p /cgroup/memory/hadoop-yarn chmod -R 771 /cgroup/cpu/hadoop-yarn chmod -R 771 /cgroup/memory/hadoop-yarn chown -R hdfsadmin.users /cgroup/cpu chown -R hdfsadmin.users /cgroup/memory
- 5 将users组的MR运行用户hdfsadmin的属组增长root属性, 这个主要是由于cgroup必须在root组用户下才能运行,修改以下:
usermod -G users,root hdfsadmin
- 6 建立资源调度相关目录,这个主要是由参数`
yarn.nodemanager.local-dirs
确认,本集群中配置是的/data1/yarnenv/local,/data2/yarnenv/local,......,/data12/yarnenv/local
; 同时还须要在这些目录下建立三个子目录,分别为filecache,usercache和nmPrivate
,并对filecache和usercache目录权限设置为755,对nmPrivate目录权限设置为700,这里的权限很关键,否则做业是执行不成功的。
mkdir -p /data1/yarnenv/local/filecache ....... /data12/yarnenv/local/filecache mkdir -p /data1/yarnenv/local/usercache ........ /data12/yarnenv/local/usercache mkdir -p /data1/yarnenv/local/nmPrivate ........ /data12/yarnenv/local/nmPrivate chown -R hdfsadmin.users /data1/yarnenv/local....../data12/yarnenv/local chmod -R 755 /data1/yarnenv/local/filecache....../data12/yarnenv/local/filecache chmod -R 755 /data1/yarnenv/local/usercache....../data12/yarnenv/local/usercache chmod -R 700 /data1/yarnenv/local/nmPrivate....../data12/yarnenv/local/nmPrivate
关于Cgroup os层面的部署步骤就以下所未,下面介绍关于Cgroup 集群层面的配置。
其中,yarn-env.xml
中的关于cgroup的配置项以下:
<property> <name>yarn.nodemanager.emc.enable</name> <value>true</value> </property> <property> <name>yarn.nodemanager.container-executor.class</name> <value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value> </property> <property> <name>yarn.nodemanager.linux-container-executor.resources-handler.class</name> <value>org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler</value> </property> <property> <name>yarn.nodemanager.linux-container-executor.cgroups.delete-timeout-ms</name> <value>30000</value> </property> <property> <name>yarn.nodemanager.linux-container-executor.cgroups.memory-control.enabled</name> <value>true</value> </property> <property> <name>yarn.nodemanager.linux-container-executor.cgroups.oom.policy</name> <value>true</value> </property> <property> <name>yarn.nodemanager.linux-container-executor.cgroups.hierarchy</name> <value>/hadoop-yarn</value> </property> <property> <name>yarn.nodemanager.linux-container-executor.cgroups.mount</name> <value>true</value> </property> <property> <name>yarn.nodemanager.resource.cpu.enabled</name> <value>true</value> </property> <property> <name>yarn.nodemanager.resource.memory.enabled</name> <value>true</value> </property> <property> <name>yarn.nodemanager.linux-container-executor.cgroups.mount-path</name> <value>/cgroup</value> </property> <property> <name>yarn.nodemanager.linux-container-executor.nonsecure-mode.limit-users</name> <value>false</value> </property> <property> <name>yarn.nodemanager.linux-container-executor.nonsecure-mode.local-user</name> <value>yarn</value> </property> <property> <name>yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage</name> <value>false</value> </property> <property> <name>yarn.nodemanager.linux-container-executor.group</name> <value>users</value> </property>
若是用LinuxContainerExecutor做为容器隔离方式的话,还须要配置另外一个文件:container-executor.cfg
。主要 配置项以下:
yarn.nodemanager.linux-container-executor.group=users banned.users=root min.user.id=1000 allowed.system.users=hdfsadmin,hbaseadmin,yarn
这个配置文件在配置过程当中也遇到一些问题,主要是解析格式问题,须要把原来的配置后面带#号的注释删除,否则会提示没法找到group。
关于配置部分就说到这,剩下的就是启动nodemanager进程和resourcemanager进程和historyserver进程。启动方式以下:
登陆datanode结点机器,执行以下命令:
su - hdfsadmin #切换至mr运行用户 cd [hadoop-home]/sbin ./yarn-daemon.sh start nodemanager
登陆MR资源管理调度机器,执行以下命令:
su - hdfsadmin cd [hadoop-home]/sbin ./yarn-daemon.sh start resourcemanager ./mr-jobhistory-daemon.sh start historyserver
到此,MR部署层面已经介绍完了,固然 这里面还涉及好比DNS配置,策略申请等,这些也是须要提早准备的。部署过程当中,问题也是很多的,下面分别介绍下。
cgroup 目录挂载错了,经过mount命令发现,默认挂载到了/sys/fs/cgroup/systemd,以下图所示。
因咱们集群参数配置的是cgroup挂载到/cgroup
目录,挂载异常致使hdfs没法识别到/cgroup目录,天然会提示目录文件不存在。上面截图只是提示/cgroup/memory这个下的目录不存在,在实际过程当中一开始也遇到了/cgroup/cpu目录不存在,因此要一并处理,同时注意目录属主和权限,否则也会有问题。
mount -t cgroup -o memory cgroup /cgroup/memory mount -t cgroup -o cpu cgroup /cgroup/cpu mkdir -p /cgroup/cpu/hadoop-yarn /cgroup/memory/hadoop-yarn; chown hdfsadmin.users /cgroup/cpu/hadoop-yarn /cgroup/memory/hadoop-yarn; chmod -R 771 /cgroup/cpu /cgroup/memory
在做业运行过程当中,出现找不到filecache,usercache,nmPrivate子目录的错误,这个子目录是在由参数yarn.nodemanager.local-dirs
配置的/data1/yarnenv/local相似这种目录,分别存储在12块盘中。
上述问题主要是因在做业启动以前,集群全部结点机器没有预先建立好/data1/yarnenv/local/目录下的filecache, usercache, nmPrivate目录。
提早建立好这些子目录就行,同时权限这块也要设置ok,不然会提示permission denied问题。对于filecache,usercache
,目录权限为755
,而对于nmPrivate
子目录,权限则要为700
, 即只容许hdfsadmin用户往里写数据。
在启动做业过程当中,提示fs异常,以下图所示。做业报错日志:
这个运行日志看不出啥,具体还要看container日志,这个日志路径是在yarn.nodemanager.log-dirs
配置的目录下。不一样application日志放在以application命名的目录下。具体以下:
container日志会更详细,从截图中可看出,提示的是wrong Fs错误,这个错误已经把提示的wrong fs的路径出来了。
最终分析是jobhistory的相关配置参数有问题,mapreduce.jobhistory.userlocaldir
这个参数一开始配置是True,表示用的是本地目录,也建了相关的本地目录,但一直提示wrong fs问题。这个问题和配置的jobhistory的目录有关,若是用本地目录,然而实际仍是去获取的Hdfs路径 ,根源在运行做业时,没法识别到fs.defaultFS配置的路径。
修改mapred-site.xml,将mapreduce.jobhistory.uselocaldir设置为false。
<property> <name>mapreduce.jobhistory.uselocaldir</name> <value>false</value> </property>
在执行快照导出过程当中,出现以下错误。
主要是Export过程当中,内存配置太少,用的默认值 ,致使出现内存不足现象,致使没法支持做业完成。
在ExportSnapshot过程当中,增长一个参数,以下:
-Dmapred.child.java.opts=-Xmx3072M
上面从MR集群部署方面展开介绍,并对MR任务执行过程当中出现的一些问题进行分析。但愿能对你们有所帮助。