注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】

前言

分布式机器学习为什么需求大数据呢?随着海量用户数据的积累,单机运算已经不能满足需求。基于海量数据,机器学习训练之前需要做数据预处理、特征工程等,需要在大数据平台上来进行。另一个就是机器学习训练过程的中间结果集可能会数据膨胀,依然需要大数据平台来承载。也就是说为了高性能的数据处理、分布式计算等,分布式机器学习是以大数据平台为基础的。所以下面我们来讲一下热门常用的大数据技术。

Hadoop大数据平台搭建

Hadoop是一种分析和处理大数据的软件平台,是一个用 Java 语言实现的 Apache 的开源软件框架,在大量计算机组成的集群中实现了对海量数据的分布式计算。Hadoop是大数据平台的标配,不管哪个公司的大数据部门,基本都是以Hadoop为核心。下面我们详细讲解下Hadoop原理和常用的一些操作命令。

一.Hadoop原理和功能介绍

Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Hadoop的框架最核心的设计有三大块:HDFS分布式存储、MapReduce计算引擎、YARN资源调度和管理,针对Hadoop这三大块核心,我们详细来讲一下。
1.HDFS架构原理
HDFS 全称 Hadoop 分布式文件系统,其最主要的作用是作为 Hadoop 生态中各系统的存储服务。HDFS为海量的数据提供了存储,可以认为它是个分布式数据库,用来存储。HDFS 主要包含了6个服务:
1)NameNode
负责管理文件系统的Namespace以及客户端对文件的访问,NameNode在Hadoop2可以有多个,Hadoop1只能有一个,存在单点故障。HDFS中的NameNode被称为元数据节点,DataNode称为数据节点。NameNode维护了文件与数据块的映射表以及数据块与数据节点的映射表,而真正的数据是存储在DataNode上。 NameNode的功能如下:
(1)它是维护和管理 DataNode 的主守护进程;
(2)它记录存储在集群中的所有文件的元数据,例如Block 的位置、文件大小、权限、层次结构等。有两个文件与元数据关联;
(3)FsImage:它包含自 NameNode 开始以来文件的 namespace 的完整状态;
(4)EditLogs:它包含最近对文件系统进行的与最新 FsImage 相关的所有修改。它记录了发生在文件系统元数据上的每个更改。例如,如果一个文件在 HDFS 中被删除,NameNode会立即在EditLog中记录这个操作;
(5)它定期从集群中的所有 DataNode 接收心跳信息和Block 报告,以确保 DataNode 处于活动状态;
(6)它保留了HDFS中所有Block的记录以及这些Block所在的节点;
(7)它负责管理所有Block的复制;
(8)在 DataNode 失败的情况下,NameNode会为副本选择新的 DataNode,平衡磁盘使用并管理到DataNode的通信流量;
(9)DataNode 则是 HDFS 中的从节点,与 NameNode 不同的是,DataNode 是一种商品硬件,它并不具有高质量或高可用性。DataNode 是一个将数据存储在本地文件 ext3 或 ext4 中的Block服务器。
2)DataNode
用于管理它所在节点上的数据存储:
(1)这些是丛属守护进行或在每台从属机器上运行的进程;
(2)实际的数据存储在DataNode上;
(3)执行文件系统客户端底层的读写请求;
(4)定期向NameNode发送心跳报告HDFS的整体健康状况,默认频率为3秒;
(5)数据块(Block):通常,在任何文件系统中,都将数据存储为Block 的集合。Block 是硬盘上存储数据的最不连续的位置。在Hadoop 集群中,每个Block 的默认大小为 128M(此处指 Hadoop 2.x 版本,Hadoop 1.x 版本为 64M),您也可以通过如下配置配置Block的大小:dfs.block.size或 dfs.blocksize =64M
(6)数据复制:HDFS 提供了一种将大数据作为数据块存储在分布式环境中的可靠方法,即将这些Block复制以容错。默认的复制因子是3,您也可以通过如下配置配置复制因子:
fs.replication = 3每个Block 被复制3次存储在不同的 DataNode 中。
3)FailoverController
故障切换控制器,负责监控与切换 NameNode 服务。
4)JournalNode
用于存储 EditLog;记录文件和数映射关系,操作记录,恢复操作。
5)Balancer
用于平衡集群之间各节点的磁盘利用率。
6)HttpFS
提供 HTTP 方式访问 HDFS 的功能。总的看来NameNode 和 DataNode 是 HDFS 的核心,也是客户端操作数据需要依赖的两个服务。
2.MapReduce计算引擎
MapReduce计算引擎经历了两个版本,Hadoop1的时候叫MRv1,Hadoop2的时候叫MRv2。MapReduce则为海量的数据提供了计算引擎,拿里面的数据做运算,跑的快。一声令下,多台机器团结合作,每台机器分自己一部分任务,同时并行跑。等所有机器小任务跑完,汇总报道,总任务全部完成。
1)MapReduce1架构原理
在Hadoop1.X的时代,其核心是JobTracker。
JobTracker:
主要负责资源监控管理和作业调度
(1)监控所有TaskTracker与Job的健康状况,一旦发现失败,就将相应的任务转移到其他节点;
(2)同时JobTracker会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器,而调度器会在资源出现空闲时,选择合适的任务使用这些资源。
TaskTracker:
TaskTracker是JobTracker与Task之前的桥梁。
(1)从JobTracker接收并执行各种命令:运行任务、提交任务、Kill任务、重新初始化任务;
(2)周期性地通过心跳机制,将节点健康情况和资源使用情况、各个任务的进度和状态等汇报给JobTracker。
MapReduce1框架的主要局限:
(1)JobTracker 是 MapReduce 的集中处理点,存在单点故障,可靠性差;
(2)JobTracker 完成了太多的任务,造成了过多的资源消耗,当MapReduce Job非常多的时候,会造成很大的内存开销,潜在来说,也增加了JobTracker 失效的风险,这也是业界普遍总结出老Hadoop的MapReduce只能支持4000节点主机的上限,扩展性能差;
(3)可预测的延迟:这是用户非常关心的。小作业应该尽可能快得被调度,而当前基于TaskTracker->JobTracker ping(heartbeat)的通信方式代价和延迟过大,比较好的方式是JobTracker->TaskTracker ping,这样JobTracker可以主动扫描有作业运行的TaskTracker。
2)MapReduce2架构原理
Hadoop2之后有Yarn,Hadoop1的时候还没有。MapReduce2(又名MRv2),用Yarn来管理,下面我们来讲一下Yarn资源调度。
3.Yarn资源调度和管理
1)ResourceManager(RM)
ResourceManager就是资源调度器,包含两个主要的组件:定时调用器(Scheduler)以及应用管理器(ApplicationManager)。
(1)调度器(Scheduler):根据容量,队列等限制条件,将系统中的资源分配给各个正在运行的应用。这里的调度器是一个“纯调度器”,因为它不再负责监控或者跟踪应用的执行状态等,此外,他也不负责重新启动因应用执行失败或者硬件故障而产生的失败任务。调度器仅根据各个应用的资源需求进行调度,这是通过抽象概念“资源容器”完成的,资源容器(Resource Container)将内存,CPU,磁盘,网络等资源封装在一起,从而限定每个任务使用的资源量。总而言之,定时调度器负责向应用程序分配资源,它不做监控以及应用程序的状态跟踪,并且它不保证会重启由于应用程序本身或硬件出错而执行失败的应用程序。
(2)应用管理器(ApplicationsManager,ASM):ASM主要负责接收作业,协商获取第一个容器用于执行AM和提供重启失败AM container的服务。
2)NodeManager
NodeManager简称NM,是每个节点上的框架代理,主要负责启动应用所需的容器,监控资源(内存,CPU,磁盘,网络等)的使用情况并将之汇报给调度器(Scheduler)。
3)ApplicationMaster
每个应用程序的ApplicationMaster负责从Scheduler申请资源,以及跟踪这些资源的使用情况以及任务进度的监控。
4)Container
是Yarn中资源的抽象,它将内存、CPU、磁盘、网络等资源封装在一起。当AM向RM申请资源时,RM为AM返回的资源便是用Container表示的。
了解了Hadoop的原理和核心组件,我们看下如何安装部署搭建分布式集群。

二.Hadoop安装部署

Hadoop有Apache社区版和第三方发行版CDH,Apache社区版优点是完全开源免费 社区活跃 文档、资料详实。缺点是版本管理比较混乱,各种版本层出不穷,很难选择,选择生态组件时需要大量考虑兼容性问题、版本匹配问题、组件冲突问题、编译问题等。集群的部署安装配置复杂,需要编写大量配置文件,分发到每台节点,容易出错,效率低。集群运维复杂,需要安装第三方软件辅助。CDH是第三方公司Cloudera公司基于社区版本的基础上做了一些优化和改进,稳定性更强一些。CDH分免费版和商业版。CDH安装可以使用CM通过管理界面的方式来安装,非常简单。Cloudera Manager(简称CM)是Cloudera公司开发的一款大数据集群安装部署利器,这款利器具有集群自动化安装、中心化管理、集群监控、报警等功能,使得安装集群从几天的时间缩短在几小时以内,运维人员从数十人降低到几人以内,极大的提高集群管理的效率。
不管是CDH还是Apache社区版,我们都是使用tar包手动来部署,所有的环境需要我们一步步来操作,Hadoop的每个配置文件也需要我们手工配置,这种方式安装的优势比较灵活,集群服务器也不需要连外网,但这种方式对开发人员的要求比较高,对各种开发环境和配置文件都需要了解清楚。不过这种方式更方便我们了解Hadoop的各个模块和工作原理。下面我们使用这种方式来手动的安装分布式集群,我们的例子是部署5台服务器,两个NameNode节点做HA,5个DataNode节点,两个NameNode节点也同时作为DataNode。一般当服务器不多的时候,为了尽量的充分利用服务器的资源,NameNode节点可以同时是DataNode。
安装步骤如下:
1.创建Hadoop用户
1)useradd hadoop
设密码passwd hadoop
命令usermod -g hadoop hadoop
2)vi /root/sudo
添加一行
hadoop ALL=(ALL) NOPASSWD:ALL
chmod u+w /etc/sudoers
3)编辑/etc/sudoers文件
#也就是输入命令:
vi /etc/sudoers
#进入编辑模式,找到这一行:
root ALL=(ALL) ALL
#在它的下面添加:
hadoop ALL=(ALL) NOPASSWD:ALL
#这里的hadoop是你的用户名,然后保存退出。
4)撤销文件的写权限
#也就是输入命令:
chmod u-w /etc/sudoers
2.设置环境变量
编辑/etc/profile文件
vim /etc/profile
输入以下配置,如代码3.1所示:
【代码3.1】 环境变量
export JAVA_HOME=/home/hadoop/software/jdk1.8.0_121
export SPARK_HOME=/home/hadoop/software/spark21
export SCALA_HOME=/home/hadoop/software/scala-2.11.8
export SQOOP_HOME=/home/hadoop/software/sqoop
export HADOOP_HOME=/home/hadoop/software/hadoop2
export PATH= P A T H : PATH: PATH:HADOOP_HOME/bin
export PATH= P A T H : PATH: PATH:HADOOP_HOME/sbin
export HADOOP_MAPARED_HOME= H A D O O P H O M E e x p o r t H A D O O P C O M M O N H O M E = {HADOOP_HOME} export HADOOP_COMMON_HOME= HADOOPHOMEexportHADOOPCOMMONHOME={HADOOP_HOME}
export HADOOP_HDFS_HOME= H A D O O P H O M E e x p o r t Y A R N H O M E = {HADOOP_HOME} export YARN_HOME= HADOOPHOMEexportYARNHOME={HADOOP_HOME}
export HADOOP_CONF_DIR= H A D O O P H O M E / e t c / h a d o o p e x p o r t H I V E H O M E = / h o m e / h a d o o p / s o f t w a r e / h a d o o p 2 / h i v e e x p o r t P A T H = {HADOOP_HOME}/etc/hadoop export HIVE_HOME=/home/hadoop/software/hadoop2/hive export PATH= HADOOPHOME/etc/hadoopexportHIVEHOME=/home/hadoop/software/hadoop2/hiveexportPATH=JAVA_HOME/bin: H I V E H O M E / b i n : HIVE_HOME/bin: HIVEHOME/bin:SQOOP_HOME/bin: P A T H e x p o r t C L A S S P A T H = . : PATH export CLASSPATH=.: PATHexportCLASSPATH=.:JAVA_HOME/lib/dt.jar: J A V A H O M E / l i b / t o o l s . j a r e x p o r t P A T H U S E R L O G N A M E M A I L H O S T N A M E H I S T S I Z E H I S T C O N T R O L e x p o r t F L U M E H O M E = / h o m e / h a d o o p / s o f t w a r e / f l u m e e x p o r t P A T H = JAVA_HOME/lib/tools.jar export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL export FLUME_HOME=/home/hadoop/software/flume export PATH= JAVAHOME/lib/tools.jarexportPATHUSERLOGNAMEMAILHOSTNAMEHISTSIZEHISTCONTROLexportFLUMEHOME=/home/hadoop/software/flumeexportPATH=PATH: F L U M E H O M E / b i n e x p o r t H B A S E H O M E = / h o m e / h a d o o p / s o f t w a r e / h b a s e − 0.98.8 − h a d o o p 2 e x p o r t P A T H = FLUME_HOME/bin export HBASE_HOME=/home/hadoop/software/hbase-0.98.8-hadoop2 export PATH= FLUMEHOME/binexportHBASEHOME=/home/hadoop/software/hbase0.98.8hadoop2exportPATH=PATH: H B A S E H O M E / b i n e x p o r t S O L R H O M E = / h o m e / h a d o o p / s o f t w a r e / s o l r c l o u d / s o l r − 6.4.2 e x p o r t P A T H = HBASE_HOME/bin export SOLR_HOME=/home/hadoop/software/solrcloud/solr-6.4.2 export PATH= HBASEHOME/binexportSOLRHOME=/home/hadoop/software/solrcloud/solr6.4.2exportPATH=PATH: S O L R H O M E / b i n e x p o r t M 2 H O M E = / h o m e / h a d o o p / s o f t w a r e / a p a c h e − m a v e n − 3.3.9 e x p o r t P A T H = SOLR_HOME/bin export M2_HOME=/home/hadoop/software/apache-maven-3.3.9 export PATH= SOLRHOME/binexportM2HOME=/home/hadoop/software/apachemaven3.3.9exportPATH=PATH: M 2 H O M E / b i n e x p o r t P A T H = M2_HOME/bin export PATH= M2HOME/binexportPATH=PATH:/home/hadoop/software/apache-storm-1.1.0/bin
export OOZIE_HOME=/home/hadoop/software/oozie-4.3.0
export SQOOP_HOME=/home/hadoop/software/sqoop-1.4.6-cdh5.5.2
export PATH= P A T H : PATH: PATH:SQOOP_HOME/bin
#按:wq保存,保存后环境变量还没有生效,执行以下命令才会生效。
source /etc/profile
#然后修改下Hadoop的安装目录为Hadoop用户所有。
chown -R hadoop:hadoop /data1/software/hadoop
3.设置local无密码登陆
su - hadoop
cd ~/.ssh 如果没有.shh 则mkdir ~/.ssh
ssh-keygen -t rsa
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
sudo chmod 644 ~/.ssh/authorized_keys
sudo chmod 700 ~/.ssh
然后重启sshd服务:
sudo /etc/rc.d/init.d/sshd restart
有些情况下会遇到这个报错,可以这么来解决。
常见错误:
ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa):
Could not create directory ‘/home/hadoop/.ssh’.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
open /home/hadoop/.ssh/id_rsa failed: Permission denied.
Saving the key failed: /home/hadoop/.ssh/id_rsa.
解决办法:
在root用户下操作yum remove selinux*
4.修改/etc/hosts主机名和IP地址的映射文件
sudo vim /etc/hosts
增加:
172.172.0.11 data1
172.172.0.12 data2
172.172.0.13 data3
172.172.0.14 data4
172.172.0.15 data5
5.设置远程无密码登陆
使用Hadoop用户:
每台机器先本地无秘钥部署一遍。然后因为我们搭建的是双NameNode节点,需要从这两个服务器上把authorized_keys文件复制到其它机器上,主要目的是NameNode节点需要直接访问DataNode节点。
把双namenode HA的authorized_keys复制到slave上。
从namenode1节点上复制:
scp authorized_keys hadoop@data2:~/.ssh/authorized_keys_from_data1
scp authorized_keys hadoop@data3:~/.ssh/authorized_keys_from_data1
scp authorized_keys hadoop@data4:~/.ssh/authorized_keys_from_data1
scp authorized_keys hadoop@data5:~/.ssh/authorized_keys_from_data1
然后从namenode2节点上复制:
scp authorized_keys hadoop@data1:~/.ssh/authorized_keys_from_data2
scp authorized_keys hadoop@data3:~/.ssh/authorized_keys_from_data2
scp authorized_keys hadoop@data4:~/.ssh/authorized_keys_from_data2
scp authorized_keys hadoop@data5:~/.ssh/authorized_keys_from_data2
6.每台都关闭机器的防火墙
#关闭防火墙
sudo /etc/init.d/iptables stop
#关闭开机启动
sudo chkconfig iptables off
7.jdk安装
因为Hadoop是基于Java开发,所以我们需要安装jdk环境:
cd /home/hadoop/software/
上传rz jdk1.8.0_121.gz
tar xvzf jdk1.8.0_121.gz
然后修改下环境变量指定到这个jdk目录就算安装好了:
vim /etc/profile
export JAVA_HOME=/home/hadoop/software/jdk1.8.0_121
source /etc/profile
8.Hadoop安装
Hadoop就是一个tar包放上去解压缩后再进行各个文件的配置。
上传hadoop-2.6.0-cdh5.tar.gz到/home/hadoop/software/
tar xvzf hadoop-2.6.0-cdh5.tar.gz
mv hadoop-2.6.0-cdh5 hadoop2
cd /home/hadoop/software/hadoop2/etc/hadoop

vi hadoop-env.sh
修改JAVA_HOME值(export JAVA_HOME=/home/hadoop/software/jdk1.8.0_121)
vi yarn-env.sh
修改JAVA_HOME值(export JAVA_HOME=/home/hadoop/software/jdk1.8.0_121)
然后修改Hadoop的主从节点文件,slaves是从节点,masters是主节点。需要说明的是一个主节点也可以同时从节点。也就是说这个节点可以同时是NameNode节点和DataNode节点。
vim slaves
添加这5台机器的节点:
data1
data2
data3
data4
data5
vim masters
添加两个NameNode节点:
data1
data2
下面来修改Hadoop的配置文件:
1)编辑core-site.xml文件
core-site.xml文件用于定义系统级别的参数,如HDFS URL 、Hadoop的临时目录等。这个文件主要是修改fs.defaultFS节点,改成hdfs://ai,ai是双NameNodeHA的虚拟域名,再就是hadoop.tmp.dir这个节点也非常重要,如果不配置,Hadoop重启后可能会有问题。
然后就是配置zookeeper的地址ha.zookeeper.quorum。


fs.defaultFS
hdfs://ai


ha.zookeeper.quorum
data1:2181,data2:2181,data3:2181,data4:2181,data5:2181


dfs.cluster.administrators
hadoop


io.file.buffer.size
131072


hadoop.tmp.dir
/home/hadoop/software/hadoop/tmp
Abase for other temporary directories.


hadoop.proxyuser.hduser.hosts



hadoop.proxyuser.hduser.groups



2)编辑hdfs-site.xml文件
hdfs-site.xml文件用来配置名称节点和数据节点的存放位置、文件副本的个数、文件的读取权限等。
dfs.nameservices设置双NameNodeHA的虚拟域名。
dfs.ha.namenodes.ai指定两个节点名称。
dfs.namenode.rpc-address.ai.nn1指定HDFS访问节点1。
dfs.namenode.rpc-address.ai.nn2指定HDFS访问节点2。
dfs.namenode.http-address.ai.nn1指定HDFS的Web访问节点1。
dfs.namenode.http-address.ai.nn2指定HDFS的Web访问节点2。
dfs.namenode.name.dir定义DFS的名称节点在本地文件系统的位置。
dfs.datanode.data.dir定义DFS数据节点存储数据块时存储在本地文件系统的位置。
dfs.replication缺省的块复制数量。
dfs.webhdfs.enabled是否通过http协议读取hdfs文件,如果选是,则集群安全性较差。
vim hdfs-site.xml


dfs.nameservices
ai


dfs.ha.namenodes.ai
nn1,nn2


dfs.namenode.rpc-address.ai.nn1
data1:9000


dfs.namenode.rpc-address.ai.nn2
data2:9000


dfs.namenode.http-address.ai.nn1
data1:50070


dfs.namenode.http-address.ai.nn2
data2:50070


dfs.namenode.shared.edits.dir
qjournal://data1:8485;data2:8485;data3:8485;data4:8485;data5:8485/aicluster


dfs.client.failover.proxy.provider.ai
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider


dfs.ha.fencing.methods
sshfence


dfs.ha.fencing.ssh.private-key-files
/home/hadoop/.ssh/id_rsa


dfs.journalnode.edits.dir
/home/hadoop/software/hadoop/journal/data


dfs.ha.automatic-failover.enabled
true


dfs.namenode.name.dir
file:/home/hadoop/software/hadoop/dfs/name


dfs.datanode.data.dir
file:/home/hadoop/software/hadoop/dfs/data


dfs.replication
3


dfs.webhdfs.enabled
true


dfs.permissions
true


dfs.client.block.write.replace-datanode-on-failure.enable
true


dfs.client.block.write.replace-datanode-on-failure.policy
NEVER


dfs.datanode.max.xcievers
4096


dfs.datanode.balance.bandwidthPerSec
104857600


dfs.qjournal.write-txns.timeout.ms
120000


3)编辑mapred-site.xml文件
主要是修改mapreduce.jobhistory.address和mapreduce.jobhistory.webapp.address两个节点,主要是配置历史服务器地址,通过历史服务器查看已经运行完的Mapreduce作业记录,比如用了多少个Map、用了多少个Reduce、作业提交时间、作业启动时间、作业完成时间等信息。默认情况下,Hadoop历史服务器是没有启动的,我们可以通过下面的命令来启动Hadoop历史服务器:
$ sbin/mr-jobhistory-daemon.sh start historyserver
这样我们就可以在相应机器的19888端口上打开历史服务器的WEB UI界面。可以查看已经运行完的作业情况。历史服务器可以单独在一台机器上启动,参数配置如下:
vim mapred-site.xml


mapreduce.framework.name
yarn


mapreduce.jobhistory.address
data1:10020


mapred.child.env
LD_LIBRARY_PATH=/usr/lib64


mapreduce.jobhistory.webapp.address
data1:19888


mapred.child.java.opts
-Xmx3072m


mapreduce.task.io.sort.mb
1000


mapreduce.jobtracker.expire.trackers.interval
1600000


mapreduce.tasktracker.healthchecker.script.timeout
1500000


mapreduce.task.timeout
88800000


mapreduce.map.memory.mb
8192


mapreduce.reduce.memory.mb
8192


mapreduce.reduce.java.opts
-Xmx6144m


4)编辑yarn-site.xml文件
主要是对Yarn资源调度的配置,核心配置参数如下:
yarn.resourcemanager.address
参数解释:ResourceManager 对客户端暴露的地址。客户端通过该地址向RM提交应用程序,杀死应用程序等。
默认值: y a r n . r e s o u r c e m a n a g e r . h o s t n a m e : 8032 y a r n . r e s o u r c e m a n a g e r . s c h e d u l e r . a d d r e s s 参数解释: R e s o u r c e M a n a g e r 对 A p p l i c a t i o n M a s t e r 暴露的访问地址。 A p p l i c a t i o n M a s t e r 通过该地址向 R M 申请资源、释放资源等。默认值: {yarn.resourcemanager.hostname}:8032 yarn.resourcemanager.scheduler.address 参数解释:ResourceManager 对ApplicationMaster暴露的访问地址。ApplicationMaster通过该地址向RM申请资源、释放资源等。 默认值: yarn.resourcemanager.hostname:8032yarn.resourcemanager.scheduler.address参数解释:ResourceManagerApplicationMaster暴露的访问地址。ApplicationMaster通过该地址向RM申请资源、释放资源等。默认值:{yarn.resourcemanager.hostname}:8030
yarn.resourcemanager.resource-tracker.address
参数解释:ResourceManager 对NodeManager暴露的地址.。NodeManager通过该地址向RM汇报心跳,领取任务等。
默认值: y a r n . r e s o u r c e m a n a g e r . h o s t n a m e : 8031 y a r n . r e s o u r c e m a n a g e r . a d m i n . a d d r e s s 参数解释: R e s o u r c e M a n a g e r 对管理员暴露的访问地址。管理员通过该地址向 R M 发送管理命令等。默认值: {yarn.resourcemanager.hostname}:8031 yarn.resourcemanager.admin.address 参数解释:ResourceManager 对管理员暴露的访问地址。管理员通过该地址向RM发送管理命令等。 默认值: yarn.resourcemanager.hostname:8031yarn.resourcemanager.admin.address参数解释:ResourceManager对管理员暴露的访问地址。管理员通过该地址向RM发送管理命令等。默认值:{yarn.resourcemanager.hostname}:8033
yarn.resourcemanager.webapp.address
参数解释:ResourceManager对外web ui地址。用户可通过该地址在浏览器中查看集群各类信息。
默认值: y a r n . r e s o u r c e m a n a g e r . h o s t n a m e : 8088 y a r n . r e s o u r c e m a n a g e r . s c h e d u l e r . c l a s s 参数解释:启用的资源调度器主类。目前可用的有 F I F O 、 C a p a c i t y S c h e d u l e r 和 F a i r S c h e d u l e r 。默认值: o r g . a p a c h e . h a d o o p . y a r n . s e r v e r . r e s o u r c e m a n a g e r . s c h e d u l e r . c a p a c i t y . C a p a c i t y S c h e d u l e r y a r n . r e s o u r c e m a n a g e r . r e s o u r c e − t r a c k e r . c l i e n t . t h r e a d − c o u n t 参数解释:处理来自 N o d e M a n a g e r 的 R P C 请求的 H a n d l e r 数目。默认值: 50 y a r n . r e s o u r c e m a n a g e r . s c h e d u l e r . c l i e n t . t h r e a d − c o u n t 参数解释:处理来自 A p p l i c a t i o n M a s t e r 的 R P C 请求的 H a n d l e r 数目。默认值: 50 y a r n . s c h e d u l e r . m i n i m u m − a l l o c a t i o n − m b / y a r n . s c h e d u l e r . m a x i m u m − a l l o c a t i o n − m b 参数解释:单个可申请的最小 / 最大内存资源量。比如设置为 1024 和 3072 ,则运行 M a p R e d c e 作业时,每个 T a s k 最少可申请 1024 M B 内存,最多可申请 3072 M B 内存。默认值: 1024 / 8192 y a r n . s c h e d u l e r . m i n i m u m − a l l o c a t i o n − v c o r e s / y a r n . s c h e d u l e r . m a x i m u m − a l l o c a t i o n − v c o r e s 参数解释:单个可申请的最小 / 最大虚拟 C P U 个数。比如设置为 1 和 4 ,则运行 M a p R e d u c e 作业时,每个 T a s k 最少可申请 1 个虚拟 C P U ,最多可申请 4 个虚拟 C P U 。什么是虚拟 C P U ,可阅读我的这篇文章:“ Y A R N 资源调度器剖析”。默认值: 1 / 32 y a r n . r e s o u r c e m a n a g e r . n o d e s . i n c l u d e − p a t h / y a r n . r e s o u r c e m a n a g e r . n o d e s . e x c l u d e − p a t h 参数解释: N o d e M a n a g e r 黑白名单。如果发现若干个 N o d e M a n a g e r 存在问题,比如故障率很高,任务运行失败率高,则可以将之加入黑名单中。注意,这两个配置参数可以动态生效。(调用一个 r e f r e s h 命令即可)默认值:“” y a r n . r e s o u r c e m a n a g e r . n o d e m a n a g e r s . h e a r t b e a t − i n t e r v a l − m s 参数解释: N o d e M a n a g e r 心跳间隔默认值: 1000 (毫秒)一般需要修改的地方在下面的配置中加粗了。这个配置文件是 Y a r n 资源调度最核心的配置,下面的是一个实例配置。有一个需要注意的配置技巧,分配的内存和 C P U 一定要配套,需要根据你的服务器的情况,计算最小分配内存,分配 C P U 等。这个如果计算不好的话,可能会造成 H a d o o p 跑任务资源分配的时候, C P U 资源用尽了,但内存还剩很多。但对于 H a d o o p 来讲,只要 C P U 或内存有一个占满了,后面的任务就不能分配了,所以设置不好会造成 C P U 和内存资源的浪费。另外一个需要注意的地方 y a r n . n o d e m a n a g e r . w e b a p p . a d d r e s s 节点复制到每台 H a d o o p 服务器上记得把节点值的 I P 地址改成本机。这个地方忘了改,可能会出现 N o d e M a n a g e r 启动不了的问题。 v i m y a r n − s i t e . x m l < c o n f i g u r a t i o n > < p r o p e r t y > < n a m e > y a r n . n o d e m a n a g e r . w e b a p p . a d d r e s s < / n a m e > < v a l u e > 172.172.0.11 : 8042 < / v a l u e > < / p r o p e r t y > < p r o p e r t y > < n a m e > y a r n . r e s o u r c e m a n a g e r . r e s o u r c e − t r a c k e r . a d d r e s s < / n a m e > < v a l u e > d a t a 1 : 8031 < / v a l u e > < / p r o p e r t y > < p r o p e r t y > < n a m e > y a r n . r e s o u r c e m a n a g e r . s c h e d u l e r . a d d r e s s < / n a m e > < v a l u e > d a t a 1 : 8030 < / v a l u e > < / p r o p e r t y > < p r o p e r t y > < n a m e > y a r n . r e s o u r c e m a n a g e r . s c h e d u l e r . c l a s s < / n a m e > < v a l u e > o r g . a p a c h e . h a d o o p . y a r n . s e r v e r . r e s o u r c e m a n a g e r . s c h e d u l e r . c a p a c i t y . C a p a c i t y S c h e d u l e r < / v a l u e > < / p r o p e r t y > < p r o p e r t y > < n a m e > y a r n . r e s o u r c e m a n a g e r . a d d r e s s < / n a m e > < v a l u e > d a t a 1 : 8032 < / v a l u e > < / p r o p e r t y > < p r o p e r t y > < n a m e > y a r n . n o d e m a n a g e r . l o c a l − d i r s < / n a m e > < v a l u e > {yarn.resourcemanager.hostname}:8088 yarn.resourcemanager.scheduler.class 参数解释:启用的资源调度器主类。目前可用的有FIFO、Capacity Scheduler和Fair Scheduler。 默认值: org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler yarn.resourcemanager.resource-tracker.client.thread-count 参数解释:处理来自NodeManager的RPC请求的Handler数目。 默认值:50 yarn.resourcemanager.scheduler.client.thread-count 参数解释:处理来自ApplicationMaster的RPC请求的Handler数目。 默认值:50 yarn.scheduler.minimum-allocation-mb/ yarn.scheduler.maximum-allocation-mb 参数解释:单个可申请的最小/最大内存资源量。比如设置为1024和3072,则运行MapRedce作业时,每个Task最少可申请1024MB内存,最多可申请3072MB内存。 默认值:1024/8192 yarn.scheduler.minimum-allocation-vcores/yarn.scheduler.maximum-allocation-vcores 参数解释:单个可申请的最小/最大虚拟CPU个数。比如设置为1和4,则运行MapReduce作业时,每个Task最少可申请1个虚拟CPU,最多可申请4个虚拟CPU。什么是虚拟CPU,可阅读我的这篇文章:“YARN 资源调度器剖析”。 默认值:1/32 yarn.resourcemanager.nodes.include-path/yarn.resourcemanager.nodes.exclude-path 参数解释:NodeManager黑白名单。如果发现若干个NodeManager存在问题,比如故障率很高,任务运行失败率高,则可以将之加入黑名单中。注意,这两个配置参数可以动态生效。(调用一个refresh命令即可) 默认值:“” yarn.resourcemanager.nodemanagers.heartbeat-interval-ms 参数解释:NodeManager心跳间隔 默认值:1000(毫秒) 一般需要修改的地方在下面的配置中加粗了。这个配置文件是Yarn资源调度最核心的配置,下面的是一个实例配置。有一个需要注意的配置技巧,分配的内存和CPU一定要配套,需要根据你的服务器的情况,计算最小分配内存,分配CPU等。这个如果计算不好的话,可能会造成Hadoop跑任务资源分配的时候,CPU资源用尽了,但内存还剩很多。但对于Hadoop来讲,只要CPU或内存有一个占满了,后面的任务就不能分配了,所以设置不好会造成CPU和内存资源的浪费。 另外一个需要注意的地方yarn.nodemanager.webapp.address节点复制到每台Hadoop服务器上记得把节点值的IP地址改成本机。这个地方忘了改,可能会出现NodeManager启动不了的问题。 vim yarn-site.xml <configuration> <property> <name>yarn.nodemanager.webapp.address</name> <value>172.172.0.11:8042</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>data1:8031</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>data1:8030</value> </property> <property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>data1:8032</value> </property> <property> <name>yarn.nodemanager.local-dirs</name> <value> yarn.resourcemanager.hostname:8088yarn.resourcemanager.scheduler.class参数解释:启用的资源调度器主类。目前可用的有FIFOCapacitySchedulerFairScheduler。默认值:org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduleryarn.resourcemanager.resourcetracker.client.threadcount参数解释:处理来自NodeManagerRPC请求的Handler数目。默认值:50yarn.resourcemanager.scheduler.client.threadcount参数解释:处理来自ApplicationMasterRPC请求的Handler数目。默认值:50yarn.scheduler.minimumallocationmb/yarn.scheduler.maximumallocationmb参数解释:单个可申请的最小/最大内存资源量。比如设置为10243072,则运行MapRedce作业时,每个Task最少可申请1024MB内存,最多可申请3072MB内存。默认值:1024/8192yarn.scheduler.minimumallocationvcores/yarn.scheduler.maximumallocationvcores参数解释:单个可申请的最小/最大虚拟CPU个数。比如设置为14,则运行MapReduce作业时,每个Task最少可申请1个虚拟CPU,最多可申请4个虚拟CPU。什么是虚拟CPU,可阅读我的这篇文章:YARN资源调度器剖析。默认值:1/32yarn.resourcemanager.nodes.includepath/yarn.resourcemanager.nodes.excludepath参数解释:NodeManager黑白名单。如果发现若干个NodeManager存在问题,比如故障率很高,任务运行失败率高,则可以将之加入黑名单中。注意,这两个配置参数可以动态生效。(调用一个refresh命令即可)默认值:“”yarn.resourcemanager.nodemanagers.heartbeatintervalms参数解释:NodeManager心跳间隔默认值:1000(毫秒)一般需要修改的地方在下面的配置中加粗了。这个配置文件是Yarn资源调度最核心的配置,下面的是一个实例配置。有一个需要注意的配置技巧,分配的内存和CPU一定要配套,需要根据你的服务器的情况,计算最小分配内存,分配CPU等。这个如果计算不好的话,可能会造成Hadoop跑任务资源分配的时候,CPU资源用尽了,但内存还剩很多。但对于Hadoop来讲,只要CPU或内存有一个占满了,后面的任务就不能分配了,所以设置不好会造成CPU和内存资源的浪费。另外一个需要注意的地方yarn.nodemanager.webapp.address节点复制到每台Hadoop服务器上记得把节点值的IP地址改成本机。这个地方忘了改,可能会出现NodeManager启动不了的问题。vimyarnsite.xml<configuration><property><name>yarn.nodemanager.webapp.address</name><value>172.172.0.11:8042</value></property><property><name>yarn.resourcemanager.resourcetracker.address</name><value>data1:8031</value></property><property><name>yarn.resourcemanager.scheduler.address</name><value>data1:8030</value></property><property><name>yarn.resourcemanager.scheduler.class</name><value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value></property><property><name>yarn.resourcemanager.address</name><value>data1:8032</value></property><property><name>yarn.nodemanager.localdirs</name><value>{hadoop.tmp.dir}/nodemanager/local


yarn.nodemanager.address
0.0.0.0:8034


yarn.nodemanager.remote-app-log-dir
h a d o o p . t m p . d i r / n o d e m a n a g e r / r e m o t e < / v a l u e > < / p r o p e r t y > < p r o p e r t y > < n a m e > y a r n . n o d e m a n a g e r . l o g − d i r s < / n a m e > < v a l u e > {hadoop.tmp.dir}/nodemanager/remote</value> </property> <property> <name>yarn.nodemanager.log-dirs</name> <value> hadoop.tmp.dir/nodemanager/remote</value></property><property><name>yarn.nodemanager.logdirs</name><value>{hadoop.tmp.dir}/nodemanager/logs


yarn.nodemanager.aux-services
mapreduce_shuffle


yarn.nodemanager.aux-services.mapreduce.shuffle.class
org.apache.hadoop.mapred.ShuffleHandler


mapred.job.queue.name
${user.name}


yarn.nodemanager.resource.memory-mb
116888


yarn.scheduler.minimum-allocation-mb
5120


yarn.scheduler.maximum-allocation-mb
36688


yarn.scheduler.maximum-allocation-vcores
8


yarn.nodemanager.resource.cpu-vcores
50


yarn.scheduler.minimum-allocation-vcores
2


yarn.nm.liveness-monitor.expiry-interval-ms
700000


yarn.nodemanager.health-checker.interval-ms
800000


yarn.nm.liveness-monitor.expiry-interval-ms
900000


yarn.resourcemanager.container.liveness-monitor.interval-ms
666000


yarn.nodemanager.localizer.cache.cleanup.interval-ms
688000


5)编辑capacity-scheduler.xml文件
在上面讲的yarn-site.xml 配置文件中,我们配置的调度器用的是容量调度器,就是这个节点指定的配置yarn.resourcemanager.scheduler.class,容量调度器是Hadoop默认的,另外还有公平调度器,我们可以分别讲一下,看看它们有什么区别。
公平调度
公平共享调度器的核心概念是,随着时间推移平均分配工作,这样每个作业都能平均地共享到资源。结果是只需较少时间执行的作业能够访问 CPU,那些需要更长时间执行的作业中结束得迟。这样的方式可以在 Hadoop 作业之间形成交互,而且可以让 Hadoop 集群对提交的多种类型作业作出更大的响应。公平调度器是由Facebook开发出来的。
Hadoop的实现会创建一组池,将作业放在其中供调度器选择。每个池会分配一组共享以平衡池中作业的资源(更多的共享意味着作业执行所需的资源更多)。默认情况下,所有池的共享相等,但可以进行配置,根据作业类型提供更多或更少的共享。如果需要的话,还可以限制同时活动的作业数,以尽量减少拥堵,让工作及时完成。
为了保证公平,每个用户被分配一个池。在这样的方式下,如果一个用户提交很多作业,那么他分配的集群资源与其他用户一样多(与他提交的工作数无关)。无论分配到池的共享有多少,如果系统未加载,那么作业收到的共享不会被使用(在可用作业之间分配)。
调度器实现会追踪系统中每个作业的计算时间。调度器还会定期检查作业接收到的计算时间和在理想的调度器中应该收到的计算时间的差距。会使用该结果来确定任务的亏空。调度器作业接着会保证亏空最多的任务最先执行。
在 mapred-site.xml 文件中配置公平共享。该文件会定义对公平共享调度器行为的管理。一个 XML 文件(即 mapred.fairscheduler.allocation.file 属性)定义了每个池的共享的分配。为了优化作业大小,您可以设置 mapread.fairscheduler.sizebasedweight 将共享分配给作业作为其大小的函数。还有一个类似的属性可以通过调整作业的权重让更小的作业在 5 分钟之后运行得更快 (mapred.fairscheduler.weightadjuster)。您还可以用很多其他的属性来调优节点上的工作负载(例如某个 TaskTracker 能管理的 maps 和 reduces 数目)并确定是否执行抢占。
容量调度器
容量调度器的原理与公平调度器有些相似,但也有一些区别。首先,容量调度是用于大型集群,它们有多个独立用户和目标应用程序。由于这个原因,容量调度能提供更大的控制和能力,提供用户之间最小容量保证并在用户之间共享多余的容量。容量调度是由 Yahoo! 开发出来的。
在容量调度中,创建的是队列而不是池,每个队列的 map 和 reduce 插槽数都可以配置。每个队列都会分配一个保证容量(集群的总容量是每个队列容量之和)。
队列处于监控之下;如果某个队列未使用分配的容量,那么这些多余的容量会被临时分配到其他队列中。由于队列可以表示一个人或大型组织,那么所有的可用容量都可以由其他用户重新分配使用。
与公平调度另一个区别是可以调整队列中作业的优先级。一般来说,具有高优先级的作业访问资源比低优先级作业更快。Hadoop 路线图包含了对抢占的支持(临时替换出低优先级作业,让高优先级作业先执行),但该功能尚未实现。
另一个区别是对队列进行严格的访问控制(假设队列绑定到一个人或组织)。这些访问控制是按照每个队列进行定义的。对于将作业提交到队列的能力和查看修改队列中作业的能力都有严格限制。
可在多个 Hadoop 配置文件中配置容量调度器。队列是在 hadoop-site.xml 中定义,在 capacity-scheduler.xml 中配置。可以在 mapred-queue-acls.xml 中配置 ACL。单个的队列属性包括容量百分比(集群中所有的队列容量少于或等于 100)、最大容量(队列多余容量使用的限制)以及队列是否支持优先级。更重要的是,可以在运行时调整队列优先级,从而可以在集群使用过程中改变或避免中断的情况。
我们的实例用的容量调度器,我们看下配置参数:
mapred.capacity-scheduler.queue..capacity:
设置调度器中各个queue的容量,这里指的是占用的集群的slots的百分比,需要注意的是,所有queue的该配置项加起来必须小于等于100,否则会导致JobTracker启动失败。
mapred.capacity-scheduler.queue..maximum-capacity:
设置调度器中各个queue最大可以占有的容量,默认为-1表示最大可以占有集群100%的资源,和设置为100的效果是一样的。
mapred.capacity-scheduler.queue..minimum-user-limit-percent:
当queue中多个用户出现slots竞争的时候,限制每个用户的slots资源的百分比。举个例子,当minimum-user-limit-percent设置为25%时候,如果queue中有多余4个用户同时提交job,那么调度器保证每个用户占有的slots不超过queue中slots数的25%,默认为100表示不对用户作限制。
mapred.capacity-scheduler.queue..user-limit-factor:
设置queue中用户可占用queue容量的系数,默认为1表示,queue中每个用户最多只能占有queue的容量(即mapred.capacity-scheduler.queue..capacity),因此,需要注意的是,如果queue中只有一个用户提交job,且希望用户在集群不繁忙时候可扩展到mapred.capacity-scheduler.queue..maximum-capacity指定的slots数,则必须相应调大user-limit-factor这个系数。
mapred.capacity-scheduler.queue..supports-priority:
设置调度器中各个queue是否支持job优先级,不用过多解释。
mapred.capacity-scheduler.maximum-system-jobs:
设置调度器中各个queue中合起来共计可初始化后并发执行的job数,需要注意的是,各个queue会按照自己占有集群slots资源的比例(即mapred.capacity-scheduler.queue..capacity)决定每个queue最多同时并发执行的job数!举个例子,假设maximum-system-jobs为20个,而queue1占集群10%资源,那么意味着queue1最多可同时并发运行2个job,如果碰巧是运行时间比较长的job的话,将直接导致其他新提交的job被JobTracker阻塞不能进行初始化!
mapred.capacity-scheduler.queue..maximum-initialized-active-tasks:
设置queue中所有并发运行job包含的task数的上限值,如果超过此限制,则新提交到该queue中的job会被排队缓存到磁盘上。
mapred.capacity-scheduler.queue..maximum-initialized-active-tasks-per-user:
设置queue中每个特定用户并发运行job包含的task数的上限值,如果超过此限制,则该用户新提交到该queue中的job会被排队缓存到磁盘上。
mapred.capacity-scheduler.queue..init-accept-jobs-factor:
设置每个queue中可容纳接收的job总数(maximum-system-jobs * queue-capacity)的系数,举个例子,如果maximum-system-jobs为20,queue-capacity为10%,init-accept-jobs-factor为10,则当queue中job总数达到10*(20*10%)=20时,新的job将被JobTracker拒绝提交。
我们下面的配置实例是配置了hadoop和spark两个队列,hadoop队列分配了92%的资源,参见yarn.scheduler.capacity.root.hadoop.capacity配置,spark队列分配了8%的资源,参见yarn.scheduler.capacity.root.spark.capacity配置:
vim capacity-scheduler.xml


yarn.scheduler.capacity.maximum-applications
10000


yarn.scheduler.capacity.maximum-am-resource-percent
0.1


yarn.scheduler.capacity.resource-calculator
org.apache.hadoop.yarn.util.resource.DominantResourceCalculator


yarn.scheduler.capacity.node-locality-delay
-1


yarn.scheduler.capacity.root.queues
hadoop,spark


yarn.scheduler.capacity.root.hadoop.capacity
92


yarn.scheduler.capacity.root.hadoop.user-limit-factor
1

yarn.scheduler.capacity.root.hadoop.maximum-capacity
-1

yarn.scheduler.capacity.root.hadoop.state
RUNNING

yarn.scheduler.capacity.root.hadoop.acl_submit_applications
hadoop


yarn.scheduler.capacity.root.hadoop.acl_administer_queue
hadoop hadoop



yarn.scheduler.capacity.root.spark.capacity
8


yarn.scheduler.capacity.root.spark.user-limit-factor
1


yarn.scheduler.capacity.root.spark.maximum-capacity
-1


yarn.scheduler.capacity.root.spark.state
RUNNING


yarn.scheduler.capacity.root.spark.acl_submit_applications
hadoop


yarn.scheduler.capacity.root.spark.acl_administer_queue
hadoop hadoop



以上对Hadoop的配置文件都配好了,然把这台服务器Hadoop整个目录复制到其它机器上就可以了。记得有个地方需要修改下yarn-site.xml里yarn.nodemanager.webapp.address每台Hadoop服务器上把IP地址改成本机。这个地方忘了改,可能会出现NodeManager启动不了的问题。
scp -r /home/hadoop/software/hadoop2 hadoop@data2:/home/hadoop/software/
scp -r /home/hadoop/software/hadoop2 hadoop@data3:/home/hadoop/software/
scp -r /home/hadoop/software/hadoop2 hadoop@data4:/home/hadoop/software/
scp -r /home/hadoop/software/hadoop2 hadoop@data5:/home/hadoop/software/
另外还有个地方需要优化下,默认情况下Hadoop跑多个reduce可能报错:
Failed on local exception: java.io.IOException: Couldn’t set up IO streams; Host Details : local hos
解决办法:集群所有节点增加如下配置
#在文件中增加
sudo vi /etc/security/limits.conf
hadoop soft nproc 100000
hadoop hard nproc 100000
重启整个集群每个节点,重启Hadoop集群即可。
到现在环境安装一些准备就绪,下面就开始对Hadoop的HDFS分布式文件系统格式化,就像我们买了新电脑磁盘需要格式化之后才能用一样。由于我们的实例采用的NameNodeHA双节点模式,它是依靠zookeeper来实现的,所有我们实现需要先安装好zookeeper才行。每台服务器上启动zookeeper服务:
/home/hadoop/software/zookeeper-3.4.6/bin/zkServer.sh restart
在NameNode1上data1服务器上初始化zookeeper:
hdfs zkfc –formatZK
分别在5台Hadoop集群上启动journalnode服务,执行命令
hadoop-daemon.sh start journalnode
在NameNode1上data1服务器上格式化HDFS:
hdfs namenode -format
然后启动这台机器上的NameNode节点服务:
hadoop-daemon.sh start namenode
在第二个NameNode上data2执行:
hdfs namenode -bootstrapStandby
hadoop-daemon.sh start namenode
最后我们启动Hadoop集群:
start-all.sh
启动集群过程如下:
This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
Starting namenodes on [datanode1 datanode2]
datanode2: starting namenode, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-namenode-datanode2.out
datanode1: starting namenode, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-namenode-datanode1.out
datanode2: Java HotSpot™ 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and will likely be removed in a future release.
datanode2: Java HotSpot™ 64-Bit Server VM warning: CMSFullGCsBeforeCompaction is deprecated and will likely be removed in a future release.
datanode1: Java HotSpot™ 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and will likely be removed in a future release.
datanode1: Java HotSpot™ 64-Bit Server VM warning: CMSFullGCsBeforeCompaction is deprecated and will likely be removed in a future release.
172.172.0.12: starting datanode, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-datanode-datanode2.out
172.172.0.11: starting datanode, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-datanode-datanode1.out
172.172.0.14: starting datanode, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-datanode-datanode4.out
172.172.0.13: starting datanode, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-datanode-datanode3.out
172.172.0.15: starting datanode, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-datanode-datanode5.out
Starting journal nodes [172.172.0.11 172.172.0.12 172.172.0.13 172.172.0.14 172.172.0.15]
172.172.0.14: starting journalnode, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-journalnode-datanode4.out
172.172.0.11: starting journalnode, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-journalnode-datanode1.out
172.172.0.13: starting journalnode, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-journalnode-datanode3.out
172.172.0.15: starting journalnode, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-journalnode-datanode5.out
172.172.0.12: starting journalnode, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-journalnode-datanode2.out
Starting ZK Failover Controllers on NN hosts [datanode1 datanode2]
datanode1: starting zkfc, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-zkfc-datanode1.out
datanode2: starting zkfc, logging to /home/hadoop/software/hadoop2/logs/hadoop-hadoop-zkfc-datanode2.out
starting yarn daemons
starting resourcemanager, logging to /home/hadoop/software/hadoop2/logs/yarn-hadoop-resourcemanager-datanode1.out
172.172.0.15: starting nodemanager, logging to /home/hadoop/software/hadoop2/logs/yarn-hadoop-nodemanager-datanode5.out
172.172.0.14: starting nodemanager, logging to /home/hadoop/software/hadoop2/logs/yarn-hadoop-nodemanager-datanode4.out
172.172.0.12: starting nodemanager, logging to /home/hadoop/software/hadoop2/logs/yarn-hadoop-nodemanager-datanode2.out
172.172.0.13: starting nodemanager, logging to /home/hadoop/software/hadoop2/logs/yarn-hadoop-nodemanager-datanode3.out
172.172.0.11: starting nodemanager, logging to /home/hadoop/software/hadoop2/logs/yarn-hadoop-nodemanager-datanode1.out
如果是停止集群的话用这个命令stop-all.sh
停止集群过程如下:
This script is Deprecated. Instead use stop-dfs.sh and stop-yarn.sh
Stopping namenodes on [datanode1 datanode2]
datanode1: stopping namenode
datanode2: stopping namenode
172.172.0.12: stopping datanode
172.172.0.11: stopping datanode
172.172.0.15: stopping datanode
172.172.0.13: stopping datanode
172.172.0.14: stopping datanode
Stopping journal nodes [172.172.0.11 172.172.0.12 172.172.0.13 172.172.0.14 172.172.0.15]
172.172.0.11: stopping journalnode
172.172.0.13: stopping journalnode
172.172.0.12: stopping journalnode
172.172.0.15: stopping journalnode
172.172.0.14: stopping journalnode
Stopping ZK Failover Controllers on NN hosts [datanode1 datanode2]
datanode2: stopping zkfc
datanode1: stopping zkfc
stopping yarn daemons
stopping resourcemanager
172.172.0.13: stopping nodemanager
172.172.0.12: stopping nodemanager
172.172.0.15: stopping nodemanager
172.172.0.14: stopping nodemanager
172.172.0.11: stopping nodemanager
no proxyserver to stop
启动成功后每个节点上会看到对应Hadoop进程,NameNode1主节点上看到的进程如下:
5504 ResourceManager
4912 NameNode
5235 JournalNode
5028 DataNode
5415 DFSZKFailoverController
90 QuorumPeerMain
5628 NodeManager
ResourceManager就是Yarn资源调度的进程。NameNode是HDFS的NameNode主节点。
JournalNode是JournalNode节点。DataNode是HDFS的DataNode从节点和数据节点。DFSZKFailoverController是Hadoop中HDFS NameNode HA实现的中心组件,它负责整体的故障转移控制等。它是一个守护进程,通main()方法启动,继承自ZKFailoverController。QuorumPeerMain是zookeeper的进程。NodeManager是Yarn在每台服务器上的节点管理器,是运行在单个节点上的代理,它管理Hadoop集群中单个计算节点,功能包括与ResourceManager保持通信,管理Container的生命周期、监控每个Container的资源使用(内存、CPU等)情况、追踪节点健康状况、管理日志和不同应用程序用到的附属服务等。
NameNode2主节点2上的进程如下:
27232 NameNode
165 QuorumPeerMain
27526 DFSZKFailoverController
27408 JournalNode
27313 DataNode
27638 NodeManager
会少很多进程,因为做主节点的HA,也会有一个NameNode进程,如果没有,说明这个节点的NameNode挂了,我们需要重启它。并需要查看挂掉的原因。
下面是其中一台DataNode上的进程,没有NameNode进程了:
114 QuorumPeerMain
17415 JournalNode
17320 DataNode
17517 NodeManager
除了我们能看到集群每个节点的进程,并且根据进程就能判断哪个集群节点是不是有问题。但不是很方便,需要每台服务器逐个来看。Hadoop提供了Web界面,非常方便查看集群的状况。一个是Yarn的Web界面,在ResourceManager进程在的哪台机器上访问,也就是Yarn的主进程,访问地址是http://namenodeip:8088/,端口是8088,当然这个是默认端,可以通过配置文件来改,不过一般不和其它端口冲突的话,是不需要的改的。看另一个是两个NameNode的Web界面,端口是50070,能非常方便查看HDFS集群状态,总空间、使用空间、剩余空间,每台服务器节点情况一目了然。访问地址是:http://namenodeip:50070/
我们来看下这两个界面:
Yarn的Web界面如图3.1所示:
图3.1 Yarn的Web界面截图

图3.1 Yarn的Web界面截图

NameNode的Web界面如图3.2所示:
图3.2 NameNode的Web界面截图

图3.2 NameNode的Web界面截图

三.Hadoop常用操作

Hadoop操作命令主要分Hadoop集群启动维护、HDFS文件操作命令、Yarn资源调度相关命令,我们分别来讲一下。
1.Hadoop集群启动维护
#整体启动Hadoop集群:
start-all.sh
#整体停止Hadoop集群:
stop-all.sh
#单独启动namenode服务:
hadoop-daemon.sh start namenode
#单独启动datanode服务:
hadoop-daemon.sh start datanode
#在某台机器上单独启动nodemanager服务:
yarn-daemon.sh start nodemanager
#单独启动historyserver
mr-jobhistory-daemon.sh start historyserver
2.HDFS文件操作命令
操作使用hadoop dfs或者 hadoop fs都可以,建了简化操作时间,建议使用hadoop fs。
1)列出HDFS下的文件
hadoop fs -ls /
hadoop fs -ls /ods/kc/dim/ods_kc_dim_product_tab/
2) 查看文件的尾部的记录
hadoop fs -tail /ods/kc/dim/ods_kc_dim_product_tab/product.txt
3)上传本地文件到hadoop的hdfs上
hadoop fs -put product.txt /ods/kc/dim/ods_kc_dim_product_tab/
4)把hadoop上的文件下载到本地系统中
hadoop fs -get /ods/kc/dim/ods_kc_dim_product_tab/product.txt product.txt
5)删除文件和删除目录
hadoop fs -rm /ods/kc/dim/ods_kc_dim_product_tab/product.txt
hadoop fs -rmr /ods/kc/dim/ods_kc_dim_product_tab/
6)查看文件
#谨慎使用,尤其当文件内容太长的话。
hadoop fs -cat /ods/kc/dim/ods_kc_dim_product_tab/product.txt
7)建立目录
hadoop fs -mkdir /ods/kc/dim/ods_kc_dim_product_tab/(目录/目录名)
只能一级一级的建目录,建完一级才能建下一级。如果-mkdir –p价格-p参数会自动把没有文件夹都创建上。
8)本集群内复制文件
hadoop fs -cp 源路径 路径
9)跨集群对拷,适合做集群数据迁移使用
hadoop distcp hdfs://master1/ods/ hdfs://master2/ods/
10)通过Hadoop命令把多个文件的内容合并起来
#hadoop fs -getmerge 位于hdfs中的原文件(里面有多个文件) 合并后的文件名(本地)
例如:
hadoop fs -getmerge /ods/kc/dim/ods_kc_dim_product_tab/* all.txt
3.Yarn资源调度相关命令
1)application
使用语法:yarn application [options] #打印报告,申请和杀死任务
-appStates #与-list一起使用,可根据输入的逗号分隔的应用程序状态列表来过滤应用程序。有效的应用程序状态可以是以下之一:ALL,NEW,NEW_SAVING,SUBMITTED,ACCEPTED,RUNNING,FINISHED,FAILED,KILLED
-appTypes #与-list一起使用,可以根据输入的逗号分隔的应用程序类型列表来过滤应用程序。
-list #列出RM中的应用程序。支持使用-appTypes来根据应用程序类型过滤应用程序,并支持使用-appStates来根据应用程序状态过滤应用程序。
-kill #终止应用程序。
-status #打印应用程序的状态。
2)applicationattempt
使用语法:yarn applicationattempt [options] #打印应用程序尝试的报告
-help #帮助
-list #获取到应用程序尝试的列表,其返回值ApplicationAttempt-Id 等于
-status #打印应用程序尝试的状态。
3)classpath
使用语法:yarn classpath #打印需要得到Hadoop的jar和所需要的lib包路径
4)container
使用语法:yarn container [options] #打印container(s)的报告
-help #帮助
-list #应用程序尝试的Containers列表
-status #打印Container的状态
5)jar
使用语法:yarn jar [mainClass] args… #运行jar文件,用户可以将写好的YARN代码打包成jar文件,用这个命令去运行它。
6)logs
使用语法:yarn logs -applicationId [options] #转存container的日志。
-applicationId #指定应用程序ID,应用程序的ID可以在yarn.resourcemanager.webapp.address配置的路径查看(即:ID)
-appOwner #应用的所有者(如果没有指定就是当前用户)应用程序的ID可以在yarn.resourcemanager.webapp.address配置的路径查看(即:User)
-containerId #Container Id
-help #帮助
-nodeAddress #节点地址的格式:nodename:port (端口是配置文件中:yarn.nodemanager.webapp.address参数指定)
7)node
使用语法:yarn node [options] #打印节点报告
-all #所有的节点,不管是什么状态的。
-list #列出所有RUNNING状态的节点。支持-states选项过滤指定的状态,节点的状态包含:NEW,RUNNING,UNHEALTHY,DECOMMISSIONED,LOST,REBOOTED。支持–all显示所有的节点。
-states #和-list配合使用,用逗号分隔节点状态,只显示这些状态的节点信息。
-status #打印指定节点的状态。
8)queue
使用语法:yarn queue [options] #打印队列信息
-help #帮助
-status # 打印队列的状态
9)daemonlog
使用语法:
yarn daemonlog -getlevel host:httpport
yarn daemonlog -setlevel host:httpport
-getlevel host:httpport #打印运行在host:port的守护进程的日志级别。这个命令内部会连接http://host:port/logLevel?log=
-setlevel host:httpport #设置运行在host:port的守护进程的日志级别。这个命令内部会连接http://host:port/logLevel?log=
10)nodemanager
使用语法:yarn nodemanager #启动nodemanager
11)proxyserver
使用语法:yarn proxyserver #启动web proxy server
12)resourcemanager
使用语法:yarn resourcemanager [-format-state-store] #启动ResourceManager
-format-state-store # RMStateStore的格式. 如果过去的应用程序不再需要,则清理RMStateStore, RMStateStore仅仅在ResourceManager没有运行的时候,才运行RMStateStore
13)rmadmin
使用语法: #运行Resourcemanager管理客户端
yarn rmadmin [-refreshQueues]
[-refreshNodes]
[-refreshUserToGroupsMapping]
[-refreshSuperUserGroupsConfiguration]
[-refreshAdminAcls]
[-refreshServiceAcl]
[-getGroups [username]]
[-transitionToActive [–forceactive] [–forcemanual] ]
[-transitionToStandby [–forcemanual] ]
[-failover [–forcefence] [–forceactive] ]
[-getServiceState ]
[-checkHealth ]
[-help [cmd]]
-refreshQueues #重载队列的ACL,状态和调度器特定的属性,ResourceManager将重载mapred-queues配置文件
-refreshNodes #动态刷新dfs.hosts和dfs.hosts.exclude配置,无需重启NameNode。
#dfs.hosts:列出了允许连入NameNode的datanode清单(IP或者机器名)
#dfs.hosts.exclude:列出了禁止连入NameNode的datanode清单(IP或者机器名)
#重新读取hosts和exclude文件,更新允许连到Namenode的或那些需要退出或入编的Datanode的集合。
-refreshUserToGroupsMappings #刷新用户到组的映射。
-refreshSuperUserGroupsConfiguration #刷新用户组的配置
-refreshAdminAcls #刷新ResourceManager的ACL管理
-refreshServiceAcl #ResourceManager重载服务级别的授权文件。
-getGroups [username] #获取指定用户所属的组。
-transitionToActive [–forceactive] [–forcemanual] #尝试将目标服务转为 Active 状态。如果使用了–forceactive选项,不需要核对非Active节点。如果采用了自动故障转移,这个命令不能使用。虽然你可以重写–forcemanual选项,你需要谨慎。
-transitionToStandby [–forcemanual] #将服务转为 Standby 状态. 如果采用了自动故障转移,这个命令不能使用。虽然你可以重写–forcemanual选项,你需要谨慎。
-failover [–forceactive] #启动从serviceId1 到 serviceId2的故障转移。如果使用了-forceactive选项,即使服务没有准备,也会尝试故障转移到目标服务。如果采用了自动故障转移,这个命令不能使用。
-getServiceState #返回服务的状态。(注:ResourceManager不是HA的时候,时不能运行该命令的)
-checkHealth #请求服务器执行健康检查,如果检查失败,RMAdmin将用一个非零标示退出。(注:ResourceManager不是HA的时候,时不能运行该命令的)
-help [cmd] #显示指定命令的帮助,如果没有指定,则显示命令的帮助。
14)scmadmin
使用语法:yarn scmadmin [options] #运行共享缓存管理客户端
-help #查看帮助
-runCleanerTask #运行清理任务
15)sharedcachemanager
使用语法:yarn sharedcachemanager #启动共享缓存管理器
16)timelineserver
使用语法:yarn timelineserver #启动timelineserver。

总结

Hadoop平台搭建好了,里面本身是没有数据的,所以下一步的工作就是建设数据仓库,而数据库是以Hive为主流的。有关Hive的更多内容请点击下方链接阅读
Hive数据仓库实战
此文章有对应的配套视频,其它更多精彩文章请大家下载充电了么app,可获取千万免费好课和文章,配套新书教材请看陈敬雷新书:《分布式机器学习实战》(人工智能科学与技术丛书)

【新书介绍】
《分布式机器学习实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】
新书特色:深入浅出,逐步讲解分布式机器学习的框架及应用配套个性化推荐算法系统、人脸识别、对话机器人等实战项目

【新书介绍视频】
分布式机器学习实战(人工智能科学与技术丛书)新书【陈敬雷】
视频特色:重点对新书进行介绍,最新前沿技术热点剖析,技术职业规划建议!听完此课你对人工智能领域将有一个崭新的技术视野!职业发展也将有更加清晰的认识!

【精品课程】
《分布式机器学习实战》大数据人工智能AI专家级精品课程

【免费体验视频】:
人工智能百万年薪成长路线/从Python到最新热点技术

从Python编程零基础小白入门到人工智能高级实战系列课

视频特色: 本系列专家级精品课有对应的配套书籍《分布式机器学习实战》,精品课和书籍可以互补式学习,彼此相互补充,大大提高了学习效率。本系列课和书籍是以分布式机器学习为主线,并对其依赖的大数据技术做了详细介绍,之后对目前主流的分布式机器学习框架和算法进行重点讲解,本系列课和书籍侧重实战,最后讲几个工业级的系统实战项目给大家。 课程核心内容有互联网公司大数据和人工智能那些事、大数据算法系统架构、大数据基础、Python编程、Java编程、Scala编程、Docker容器、Mahout分布式机器学习平台、Spark分布式机器学习平台、分布式深度学习框架和神经网络算法、自然语言处理算法、工业级完整系统实战(推荐算法系统实战、人脸识别实战、对话机器人实战)、就业/面试技巧/职业生涯规划/职业晋升指导等内容。

【充电了么公司介绍】

充电了么App是专注上班族职业培训充电学习的在线教育平台。

专注工作职业技能提升和学习,提高工作效率,带来经济效益!今天你充电了么?

充电了么官网
http://www.chongdianleme.com/

充电了么App官网下载地址
https://a.app.qq.com/o/simple.jsp?pkgname=com.charged.app

功能特色如下:

【全行业职位】 - 专注职场上班族职业技能提升

覆盖所有行业和职位,不管你是上班族,高管,还是创业都有你要学习的视频和文章。其中大数据智能AI、区块链、深度学习是互联网一线工业级的实战经验。

除了专业技能学习,还有通用职场技能,比如企业管理、股权激励和设计、职业生涯规划、社交礼仪、沟通技巧、演讲技巧、开会技巧、发邮件技巧、工作压力如何放松、人脉关系等等,全方位提高你的专业水平和整体素质。

【牛人课堂】 - 学习牛人的工作经验

1.智能个性化引擎:

海量视频课程,覆盖所有行业、所有职位,通过不同行业职位的技能词偏好挖掘分析,智能匹配你目前职位最感兴趣的技能学习课程。

2.听课全网搜索

输入关键词搜索海量视频课程,应有尽有,总有适合你的课程。

3.听课播放详情

视频播放详情,除了播放当前视频,更有相关视频课程和文章阅读,对某个技能知识点强化,让你轻松成为某个领域的资深专家。

【精品阅读】 - 技能文章兴趣阅读

1.个性化阅读引擎:

千万级文章阅读,覆盖所有行业、所有职位,通过不同行业职位的技能词偏好挖掘分析,智能匹配你目前职位最感兴趣的技能学习文章。

2.阅读全网搜索

输入关键词搜索海量文章阅读,应有尽有,总有你感兴趣的技能学习文章。

【机器人老师】 - 个人提升趣味学习

基于搜索引擎和智能深度学习训练,为您打造更懂你的机器人老师,用自然语言和机器人老师聊天学习,寓教于乐,高效学习,快乐人生。

【精短课程】 - 高效学习知识

海量精短牛人课程,满足你的时间碎片化学习,快速提高某个技能知识点。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐