文章目录
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)useradd hadoop
设密码passwd hadoop
命令usermod -g hadoop hadoop
2)vi /root/sudo
添加一行
hadoop ALL=(ALL) NOPASSWD:ALL
chmod u+w /etc/sudoers
1) 编辑/etc/sudoers文件
#也就是输入命令:
vi /etc/sudoers
#进入编辑模式,找到这一行:
root ALL=(ALL) ALL
#在它的下面添加:
hadoop ALL=(ALL) NOPASSWD:ALL
#这里的hadoop是你的用户名,然后保存退出。
2) 撤销文件的写权限
#也就是输入命令:
chmod u-w /etc/sudoers
编辑/etc/profile文件
vim /etc/profile
输入以下配置,如代码3.1所示:
【代码3.1】 环境变量
export JAVA_HOME=/home/hadoop/software/jdk1.8.0_121export SPARK_HOME=/home/hadoop/software/spark21export SCALA_HOME=/home/hadoop/software/scala-2.11.8export SQOOP_HOME=/home/hadoop/software/sqoopexport HADOOP_HOME=/home/hadoop/software/hadoop2export PATH=$PATH:$HADOOP_HOME/binexport PATH=$PATH:$HADOOP_HOME/sbinexport HADOOP_MAPARED_HOME=${HADOOP_HOME}export HADOOP_COMMON_HOME=${HADOOP_HOME}export HADOOP_HDFS_HOME=${HADOOP_HOME}export YARN_HOME=${HADOOP_HOME}export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoopexport HIVE_HOME=/home/hadoop/software/hadoop2/hiveexport PATH=$JAVA_HOME/bin:$HIVE_HOME/bin:$SQOOP_HOME/bin:$PATHexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROLexport FLUME_HOME=/home/hadoop/software/flumeexport PATH=$PATH:$FLUME_HOME/binexport HBASE_HOME=/home/hadoop/software/hbase-0.98.8-hadoop2export PATH=$PATH:$HBASE_HOME/binexport SOLR_HOME=/home/hadoop/software/solrcloud/solr-6.4.2export PATH=$PATH:$SOLR_HOME/binexport M2_HOME=/home/hadoop/software/apache-maven-3.3.9export PATH=$PATH:$M2_HOME/binexport PATH=$PATH:/home/hadoop/software/apache-storm-1.1.0/binexport OOZIE_HOME=/home/hadoop/software/oozie-4.3.0export SQOOP_HOME=/home/hadoop/software/sqoop-1.4.6-cdh5.5.2export PATH=$PATH:$SQOOP_HOME/bin
#按:wq保存,保存后环境变量还没有生效,执行以下命令才会生效。
source /etc/profile
#然后修改下Hadoop的安装目录为Hadoop用户所有。
chown -R hadoop:hadoop /data1/software/hadoop
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*
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
使用Hadoop用户:
每台机器先本地无秘钥部署一遍。然后因为我们搭建的是双NameNode节点,需要从这两个服务器上把authorized_keys文件复制到其它机器上,主要目的是NameNode节点需要直接访问DataNode节点。
把双namenode HA的authorized_keys复制到slave上。
从namenode1节点上复制:
scp authorized_keys hadoop@data2:~/.ssh/authorized_keys_from_data1scp authorized_keys hadoop@data3:~/.ssh/authorized_keys_from_data1scp authorized_keys hadoop@data4:~/.ssh/authorized_keys_from_data1scp authorized_keys hadoop@data5:~/.ssh/authorized_keys_from_data1然后从namenode2节点上复制:scp authorized_keys hadoop@data1:~/.ssh/authorized_keys_from_data2scp authorized_keys hadoop@data3:~/.ssh/authorized_keys_from_data2scp authorized_keys hadoop@data4:~/.ssh/authorized_keys_from_data2scp authorized_keys hadoop@data5:~/.ssh/authorized_keys_from_data2
#关闭防火墙
sudo /etc/init.d/iptables stop
#关闭开机启动
sudo chkconfig iptables off
因为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
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
1)编辑core-site.xml文件
core-site.xml文件用于定义系统级别的参数,如HDFS URL 、Hadoop的临时目录等。这个文件主要是修改fs.defaultFS节点,改成hdfs://ai,ai是双NameNodeHA的虚拟域名,再就是hadoop.tmp.dir这个节点也非常重要,如果不配置,Hadoop重启后可能会有问题。
然后就是配置zookeeper的地址ha.zookeeper.quorum。
<configuration><property><name>fs.defaultFS</name><value>hdfs://ai</value></property><property><name>ha.zookeeper.quorum</name><value>data1:2181,data2:2181,data3:2181,data4:2181,data5:2181</value></property><property><name>dfs.cluster.administrators</name><value>hadoop</value></property><property><name>io.file.buffer.size</name><value>131072</value></property><property><name>hadoop.tmp.dir</name><value>/home/hadoop/software/hadoop/tmp</value><description>Abaseforother temporary directories.</description></property><property><name>hadoop.proxyuser.hduser.hosts</name><value>*</value></property><property><name>hadoop.proxyuser.hduser.groups</name><value>*</value></property></configuration>
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<configuration><property><name>dfs.nameservices</name><value>ai</value></property><property><name>dfs.ha.namenodes.ai</name><value>nn1,nn2</value></property><property><name>dfs.namenode.rpc-address.ai.nn1</name><value>data1:9000</value></property><property><name>dfs.namenode.rpc-address.ai.nn2</name><value>data2:9000</value></property><property><name>dfs.namenode.http-address.ai.nn1</name><value>data1:50070</value></property><property><name>dfs.namenode.http-address.ai.nn2</name><value>data2:50070</value></property><property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://data1:8485;data2:8485;data3:8485;data4:8485;data5:8485/aicluster</value></property><property><name>dfs.client.failover.proxy.provider.ai</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property><property><name>dfs.ha.fencing.methods</name><value>sshfence</value></property><property><name>dfs.ha.fencing.ssh.private-key-files</name><value>/home/hadoop/.ssh/id_rsa</value></property><property><name>dfs.journalnode.edits.dir</name><value>/home/hadoop/software/hadoop/journal/data</value></property><property><name>dfs.ha.automatic-failover.enabled</name><value>true</value></property><property><name>dfs.namenode.name.dir</name><value>file:/home/hadoop/software/hadoop/dfs/name</value></property><property><name>dfs.datanode.data.dir</name><value>file:/home/hadoop/software/hadoop/dfs/data</value></property><property><name>dfs.replication</name><value>3</value></property><property><name>dfs.webhdfs.enabled</name><value>true</value></property><property><name>dfs.permissions</name><value>true</value></property><property><name>dfs.client.block.write.replace-datanode-on-failure.enable</name><value>true</value></property><property><name>dfs.client.block.write.replace-datanode-on-failure.policy</name><value>NEVER</value></property><property><name>dfs.datanode.max.xcievers</name><value>4096</value></property><property><name>dfs.datanode.balance.bandwidthPerSec</name><value>104857600</value></property><property><name>dfs.qjournal.write-txns.timeout.ms</name><value>120000</value></property></configuration>
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<configuration><property><name>mapreduce.framework.name</name><value>yarn</value></property><property><name>mapreduce.jobhistory.address</name><value>data1:10020</value></property><property><name>mapred.child.env</name><value>LD_LIBRARY_PATH=/usr/lib64</value></property><property><name>mapreduce.jobhistory.webapp.address</name><value>data1:19888</value></property><property><name>mapred.child.java.opts</name><value>-Xmx3072m</value></property><property><name>mapreduce.task.io.sort.mb</name><value>1000</value></property><property><name>mapreduce.jobtracker.expire.trackers.interval</name><value>1600000</value></property><property><name>mapreduce.tasktracker.healthchecker.script.timeout</name><value>1500000</value></property><property><name>mapreduce.task.timeout</name><value>88800000</value></property><property><name>mapreduce.map.memory.mb</name><value>8192</value></property><property><name>mapreduce.reduce.memory.mb</name><value>8192</value></property><property><name>mapreduce.reduce.java.opts</name><value>-Xmx6144m</value></property></configuration>
4)编辑yarn-site.xml文件
主要是对Yarn资源调度的配置,核心配置参数如下:
yarn.resourcemanager.address
参数解释:ResourceManager 对客户端暴露的地址。客户端通过该地址向RM提交应用程序,杀死应用程序等。
默认值:${yarn.resourcemanager.hostname}:8032
yarn.resourcemanager.scheduler.address
参数解释:ResourceManager 对ApplicationMaster暴露的访问地址。ApplicationMaster通过该地址向RM申请资源、释放资源等。
默认值:${yarn.resourcemanager.hostname}:8030
yarn.resourcemanager.resource-tracker.address
参数解释:ResourceManager 对NodeManager暴露的地址.。NodeManager通过该地址向RM汇报心跳,领取任务等。
默认值:${yarn.resourcemanager.hostname}:8031
yarn.resourcemanager.admin.address
参数解释:ResourceManager 对管理员暴露的访问地址。管理员通过该地址向RM发送管理命令等。
默认值:${yarn.resourcemanager.hostname}:8033
yarn.resourcemanager.webapp.address
参数解释:ResourceManager对外web ui地址。用户可通过该地址在浏览器中查看集群各类信息。
默认值:${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>${hadoop.tmp.dir}/nodemanager/local</value></property><property><name>yarn.nodemanager.address</name><value>0.0.0.0:8034</value></property><property><name>yarn.nodemanager.remote-app-log-dir</name><value>${hadoop.tmp.dir}/nodemanager/remote</value></property><property><name>yarn.nodemanager.log-dirs</name><value>${hadoop.tmp.dir}/nodemanager/logs</value></property><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><property><name>mapred.job.queue.name</name><value>${user.name}</value></property><property><name>yarn.nodemanager.resource.memory-mb</name><value>116888</value></property><property><name>yarn.scheduler.minimum-allocation-mb</name><value>5120</value></property><property><name>yarn.scheduler.maximum-allocation-mb</name><value>36688</value></property><property><name>yarn.scheduler.maximum-allocation-vcores</name><value>8</value></property><property><name>yarn.nodemanager.resource.cpu-vcores</name><value>50</value></property><property><name>yarn.scheduler.minimum-allocation-vcores</name><value>2</value></property><property><name>yarn.nm.liveness-monitor.expiry-interval-ms</name><value>700000</value></property><property><name>yarn.nodemanager.health-checker.interval-ms</name><value>800000</value></property><property><name>yarn.nm.liveness-monitor.expiry-interval-ms</name><value>900000</value></property><property><name>yarn.resourcemanager.container.liveness-monitor.interval-ms</name><value>666000</value></property><property><name>yarn.nodemanager.localizer.cache.cleanup.interval-ms</name><value>688000</value></property></configuration>
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<configuration><property><name>yarn.scheduler.capacity.maximum-applications</name><value>10000</value></property><property><name>yarn.scheduler.capacity.maximum-am-resource-percent</name><value>0.1</value></property><property><name>yarn.scheduler.capacity.resource-calculator</name><value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value></property><property><name>yarn.scheduler.capacity.node-locality-delay</name><value>-1</value></property><property><name>yarn.scheduler.capacity.root.queues</name><value>hadoop,spark</value></property><property><name>yarn.scheduler.capacity.root.hadoop.capacity</name><value>92</value></property><property><name>yarn.scheduler.capacity.root.hadoop.user-limit-factor</name><value>1</value></property><property><name>yarn.scheduler.capacity.root.hadoop.maximum-capacity</name><value>-1</value></property><property><name>yarn.scheduler.capacity.root.hadoop.state</name><value>RUNNING</value></property><property><name>yarn.scheduler.capacity.root.hadoop.acl_submit_applications</name><value>hadoop</value></property><property><name>yarn.scheduler.capacity.root.hadoop.acl_administer_queue</name><value>hadoop hadoop</value></property><!--sparkquene--><property><name>yarn.scheduler.capacity.root.spark.capacity</name><value>8</value></property><property><name>yarn.scheduler.capacity.root.spark.user-limit-factor</name><value>1</value></property><property><name>yarn.scheduler.capacity.root.spark.maximum-capacity</name><value>-1</value></property><property><name>yarn.scheduler.capacity.root.spark.state</name><value>RUNNING</value></property><property><name>yarn.scheduler.capacity.root.spark.acl_submit_applications</name><value>hadoop</value></property><property><name>yarn.scheduler.capacity.root.spark.acl_administer_queue</name><value>hadoop hadoop</value></property><!--end--></configuration>
以上对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界面截图
NameNode的Web界面如图3.2所示:
图3.2 NameNode的Web界面截图
到此Hadoop安装部署大功告成!
此文章有对应的配套视频,除了Hadoop安装部署,其它更多精彩文章请大家下载充电了么app,可获取千万免费好课和文章,配套新书教材请看陈敬雷新书:《分布式机器学习实战》(人工智能科学与技术丛书)
其它深度学习框架也有不错的开源实现,比如MXNet,后面请大家关注充电了么app,课程,微信群,更多内容请看新书《分布式机器学习实战(人工智能科学与技术丛书)》
【新书介绍】
《分布式机器学习实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】https://item.jd.com/12743009.html
新书特色:深入浅出,逐步讲解分布式机器学习的框架及应用配套个性化推荐算法系统、人脸识别、对话机器人等实战项目
【新书介绍视频】
分布式机器学习实战(人工智能科学与技术丛书)新书【陈敬雷】https://ke.qq.com/course/3067704?flowToken=1029963
视频特色:重点对新书进行介绍,最新前沿技术热点剖析,技术职业规划建议!听完此课你对人工智能领域将有一个崭新的技术视野!职业发展也将有更加清晰的认识!
【精品课程】
《分布式机器学习实战》大数据人工智能AI专家级精品课程https://ke.qq.com/course/393750?flowToken=1028919
【免费体验视频】
人工智能百万年薪成长路线/从Python到最新热点技术https://ke.qq.com/course/package/31251?flowToken=1029962
从Python编程零基础小白入门到人工智能高级实战系列课
https://ke.qq.com/course/package/29782?flowToken=1028733
视频特色:本系列专家级精品课有对应的配套书籍《分布式机器学习实战》,精品课和书籍可以互补式学习,彼此相互补充,大大提高了学习效率。本系列课和书籍是以分布式机器学习为主线,并对其依赖的大数据技术做了详细介绍,之后对目前主流的分布式机器学习框架和算法进行重点讲解,本系列课和书籍侧重实战,最后讲几个工业级的系统实战项目给大家。课程核心内容有互联网公司大数据和人工智能那些事、大数据算法系统架构、大数据基础、Python编程、Java编程、Scala编程、Docker容器、Mahout分布式机器学习平台、Spark分布式机器学习平台、分布式深度学习框架和神经网络算法、自然语言处理算法、工业级完整系统实战(推荐算法系统实战、人脸识别实战、对话机器人实战)、就业/面试技巧/职业生涯规划/职业晋升指导等内容。
【充电了么App】
本书在充电了么App里有对应的视频课程,更多学习资源也可以通过下载充电了么App客户端,也可以从各大应用商店里搜索“充电了么”自行下载。充电了么是专注上班族职业技能提升的在线教育平台。这里有海量免费课程,在这里你可以学习牛人的实际工作经验,也能够大幅提升职业技能,提高工作效率,带来经济效益!除了陈敬雷老师的课以外,还有上千万好课免费分享。全都在充电了么App上。充电了么APP是专注上班族职业培训充电学习的在线教育平台。各大安卓商店和苹果App Store搜索“充电了么”即可下载。按照下图输入网址也可以下载哦~
充电了么官网:http://www.chongdianleme.com/
充电了么App官网下载地址:https://a.app.qq.com/o/simple.jsp?pkgname=com.charged.app
功能特色如下:
【全行业职位】 - 专注职场上班族职业技能提升
覆盖所有行业和职位,不管你是上班族,高管,还是创业都有你要学习的视频和文章。其中大数据智能AI、区块链、深度学习是互联网一线工业级的实战经验。
除了专业技能学习,还有通用职场技能,比如企业管理、股权激励和设计、职业生涯规划、社交礼仪、沟通技巧、演讲技巧、开会技巧、发邮件技巧、工作压力如何放松、人脉关系等等,全方位提高你的专业水平和整体素质。
【牛人课堂】 - 学习牛人的工作经验
1.智能个性化引擎:
海量视频课程,覆盖所有行业、所有职位,通过不同行业职位的技能词偏好挖掘分析,智能匹配你目前职位最感兴趣的技能学习课程。
2.听课全网搜索
输入关键词搜索海量视频课程,应有尽有,总有适合你的课程。
3.听课播放详情
视频播放详情,除了播放当前视频,更有相关视频课程和文章阅读,对某个技能知识点强化,让你轻松成为某个领域的资深专家。
【精品阅读】 - 技能文章兴趣阅读
1.个性化阅读引擎:
千万级文章阅读,覆盖所有行业、所有职位,通过不同行业职位的技能词偏好挖掘分析,智能匹配你目前职位最感兴趣的技能学习文章。
2.阅读全网搜索
输入关键词搜索海量文章阅读,应有尽有,总有你感兴趣的技能学习文章。
【机器人老师】 - 个人提升趣味学习
基于搜索引擎和智能深度学习训练,为您打造更懂你的机器人老师,用自然语言和机器人老师聊天学习,寓教于乐,高效学习,快乐人生。
【精短课程】 - 高效学习知识
海量精短牛人课程,满足你的时间碎片化学习,快速提高某个技能知识点。