强烈建议再搭建hadoop集群之前体验一下单机模式和伪分布式模式的搭建过程,可以参考以下链接:
本次集群搭建所依赖的软件环境如下:
先了解一个概念:
Hadoop YARN: YARN是一个在所有节点上执行数据处理任务的作业调度框架。
然后执行以下初始步骤:
/usr/local/src
目录下(其他目录也可,放在用户目录下会更好,省掉权限问题),更改/usr/local/src
目录的属主和属组为hadoop,可以使用chown hadoop:hadoop /usr/local/src
命令更改。hadoop@node2:~$ cd /bin
hadoop@node2:/bin$ sudo ln -s /usr/local/src/jdk1.8.0_162/bin/java java
如果没有添加,在执行MR程序时会报错:/bin/bash: /bin/java: No such file or directory
创建hadoop用户和安装jdk的步骤参见文章开头的单机和伪分布式搭建过程。
下面是本次集群安装的三台ECS机器的ip情况:
在配置主从节点之前,了解Hadoop集群的不同组件是非常重要的。
主节点保存有关分布式文件系统的信息,例如ext3文件系统上的inode表,并调度资源分配。 此次搭建过程中node-master即为主节点,并运行两个守护进程:
从节点存储实际数据并提供处理能力来运行作业。分别是node1和node2,并运行两个守护进程:
要想使用节点名称通信,需要编辑/etc/hosts
文件以添加三台服务器的IP地址。
120.77.239.67 node-master
119.23.145.73 node1
119.23.141.223 node2
相当于给ip取名称。
这一步骤一定要操作:以管理节点为例进行操作
sudo vim /etc/hostname
替换掉其中已有的hostname
,写入node-master
,和上述hosts文件中保持一致即可。
如果这个步骤不修改则会在后续集群中执行MapReduce程序过程中出现以下错误:
2018-05-08 19:50:46,481 ERROR org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerApplicationAttempt: Error trying to assign container token and NM token to an updated container container_1525778560515_0005_01_000001
java.lang.IllegalArgumentException: java.net.UnknownHostException: iZwz99xn3877js1s191xp9Z
at org.apache.hadoop.security.SecurityUtil.buildTokenService(SecurityUtil.java:445)
at org.apache.hadoop.yarn.event.AsyncDispatcher.dispatch(AsyncDispatcher.java:197)
at org.apache.hadoop.yarn.event.AsyncDispatcher$1.run(AsyncDispatcher.java:126)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.UnknownHostException: iZwz99xn3877js1s191xp9Z
意思是管理节点无法识别从节点的hostname,因为在管理节点的hosts文件中对应的是node2,而不是node2的真是hosname,也就是iZwz99xn3877js1s191xp9Z。因此一定要修改hostname。
参考:http://www.voidcn.com/article/p-dsepxqfl-pz.html
主节点将使用ssh协议通过密钥对认证连接到其他节点,以管理群集。
以hadoop用户身份登录到node-master,并生成一个ssh-key(如果执行已生成过ssh-key则会提示重复,是否需要重写,此时忽略即可):
ssh-keygen -b 4096
将密钥复制到其他节点。 将密钥复制到节点主机本身也是一种很好的做法,这样您可以根据需要将它用作DataNode。 输入以下命令,并在询问时输入hadoop用户的密码。 如果提示是否将密钥添加到已知主机,请输入yes:
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@node-master
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@node1
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@node2
以hadoop用户身份登录到node-master,将下载好的安装包上传并解压:
cd /usr/local/src
tar -xzvf jdk-8u162-linux-x64.tar.gz
编辑~/.profile
文件并写入以下内容:
# hadoop install env settings
HADOOP_INSTALL=/usr/local/src/hadoop-3.1.0
PATH=$HADOOP_INSTALL/bin:$HADOOP_INSTALL/sbin:$PATH
export HADOOP_INSTALL PATH
配置将在node-master上完成并复制到其他节点。
修改/usr/local/src/hadoop-3.1.0/etc/hadoop/hadoop-env.sh
文件中的JAVA_HOME
变量,改为实际的即可:
# Many of the options here are built from the perspective that users
# may want to provide OVERWRITING values on the command line.
# For example:
#
# JAVA_HOME=/usr/java/testing hdfs dfs -ls
JAVA_HOME=/usr/local/src/jdk1.8.0_162
#
# Therefore, the vast majority (BUT NOT ALL!) of these defaults
# are configured for substitution and not append. If append
# is preferable, modify this file accordingly.
在master主机上配置hdfs地址,注意和伪分布式的略微不同,需要直接指定master节点所在的地址。在/usr/local/src/hadoop-3.1.0/etc/hadoop/core-site.xml
文件中写入以下内容:
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/src/hadoop-3.1.0/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://node-master:9000</value>
</property>
</configuration>
配置副本的个数及数据的存放路径,在/usr/local/src/hadoop-3.1.0/etc/hadoop/hdfs-site.xml
文件中写入:
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/src/hadoop-3.1.0/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/src/hadoop-3.1.0/tmp/dfs/data</value>
</property>
</configuration>
其中:
dfs.replication
表示数据块的副本数量,指示数据在集群中的复制次数。 您可以设置2以将所有数据复制到两个节点上。 不要设置高于实际节点数量的值。dfs.namenode.name.dir
元数据存放路径dfs.datanode.data.dir
数据节点存放路径设置YARN为作业调度器,也就是默认的MapReduce框架,在/usr/local/src/hadoop-3.1.0/etc/hadoop/mapred-site.xml
文件中写入:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
在/usr/local/src/hadoop-3.1.0/etc/hadoop/yarn-site.xml
文件中写入:
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.address</name>
<value>node-master:18040</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>node-master:18030</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>node-master:18088</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>node-master:18025</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>node-master:18141</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>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/src/hadoop-3.1.0</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/src/hadoop-3.1.0</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/src/hadoop-3.1.0</value>
</property
</configuration>
注意修改的各个value
需要和/etc/hosts
中的名称保持一致。
这三项配置一定要有:yarn.app.mapreduce.am.env
mapreduce.map.env
mapreduce.reduce.env
否则在执行MR程序时会直接报错(hadoop3.1中已验证)。
具体错误参考:https://stackoverflow.com/questions/47599789/hadoop-pagerank-error-when-running
列出所有workers的主机名。在/usr/local/src/hadoop-3.1.0/etc/hadoop/workers
文件中写入:
node-master
node1
node2
注意:
此外,如果想在Hadoop集群中动态增加和删除节点,则更改此文件即可。
内存分配在低RAM节点上可能会很棘手,因为默认值不适用于RAM少于8GB的节点,因此在使用sqoop等命令时调用的MapReduce程序会有如下类似的报错:
Application is added to the scheduler and is not yet activated. Queue's AM resource limit exceeded. Details : AM Partition = <DEFAULT_PARTITION>; AM Resource Request = <memory:2048, vCores:1>; Queue Resource Limit for AM = <memory:3072, vCores:1>; User AM Resource Limit of the queue = <memory:3072, vCores:1>; Queue AM Resource Usage = <memory:2048, vCores:1>;
这里将重点介绍如何为MapReduce作业分配内存,因为此次使用的ECS机器是4GB内存,因此为4GB RAM节点提供示例配置。
YARN作业执行需要使用以下两种资源:
两者都在从节点的容器中运行。 每个从节点都运行一个NodeManager守护进程,负责在节点上创建容器。 整个集群由一个ResourceManager管理,它根据容量要求和当前使用情况调度所有所有从节点上的容器分配。
需要正确配置四种类型的资源分配才能使群集正常工作。分别是:
这个值在
yarn-site.xml
中配置yarn.nodemanager.resource.memory-mb
属性
这些值在
yarn-site.xml
中配置yarn.scheduler.maximum-allocation-mb
和yarn.scheduler.minimum-allocation-mb
属性。
这个值在
mapred-site.xml
中配置yarn.app.mapreduce.am.resource.mb
属性。
这是在
mapred-site.xml
中配置的,其属性为mapreduce.map.memory.mb
和mapreduce.reduce.memory.mb
。
具体配置参数可以参见:https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/ClusterSetup.html
下载内存计算脚本:
wget https://raw.githubusercontent.com/mahadevkonar/ambari-yarn-utils/master/yarn-utils/yarn-utils.py
使用方法:
python yarn-utils.py -c 16 -m 64 -d 4 -k True
其中:Core的数量可以通过
nproc
命令计算;内存大小可以通过free -m
命令来计算需要换算为G;磁盘的数量可以通过lsblk -s
或sudo fdisk -l
命令来查看。
计算完成之后,最后的脚本执行命令为:
hadoop@node-master:~$ python yarn-utils.py -c 2 -m 8 -d 1 -k False
Using cores=2 memory=8GB disks=1 hbase=False
Profile: cores=2 memory=6144MB reserved=2GB usableMem=6GB disks=1
Num Container=3
Container Ram=2048MB
Used Ram=6GB
Unused Ram=2GB
yarn.scheduler.minimum-allocation-mb=2048
yarn.scheduler.maximum-allocation-mb=6144
yarn.nodemanager.resource.memory-mb=6144
mapreduce.map.memory.mb=1024
mapreduce.map.java.opts=-Xmx819m
mapreduce.reduce.memory.mb=2048
mapreduce.reduce.java.opts=-Xmx1638m
yarn.app.mapreduce.am.resource.mb=1024
yarn.app.mapreduce.am.command-opts=-Xmx819m
mapreduce.task.io.sort.mb=409
属性 | 值 |
---|---|
yarn.nodemanager.resource.memory-mb | 6144 |
yarn.scheduler.maximum-allocation-mb | 6144 |
yarn.scheduler.minimum-allocation-mb | 2048 |
yarn.app.mapreduce.am.resource.mb | 1024 |
mapreduce.map.memory.mb | 1024 |
mapreduce.reduce.memory.mb | 2048 |
编辑 /usr/local/src/hadoop-3.1.0/etc/hadoop/yarn-site.xml
文件,并增加以下行:
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>6144</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>6144</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
编辑/usr/local/src/hadoop-3.1.0/etc/hadoop/mapred-site.xml
文件,并增加以下行:
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>1024</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>1024</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>2048</value>
</property>
复制hadoop的压缩包到所有从节点(也可以使用ftp手动上传):
scp hadoop-3.1.0.tar.gz hadoop@node1:/usr/local/src/
scp hadoop-3.1.0.tar.gz hadoop@node2:/usr/local/src/
使用hadoop用户连接到所有的从节点,解压安装包:
cd /usr/local/src
tar -xzvf jdk-8u162-linux-x64.tar.gz
复制主节点的所有hadoop配置文件到各从节点中:
scp /usr/local/src/hadoop-3.1.0/etc/hadoop/* hadoop@node1:/usr/local/src/hadoop-3.1.0/etc/hadoop/
scp /usr/local/src/hadoop-3.1.0/etc/hadoop/* hadoop@node2:/usr/local/src/hadoop-3.1.0/etc/hadoop/
HDFS需要像任何传统文件系统一样格式化。 在node-master上,运行以下命令:
hdfs namenode -format
通过从node-master运行以下脚本启动HDFS:
start-dfs.sh
这个命令会启动node-master上的NameNode和SecondaryNameNode,并且根据node1和node2上的配置文件分别启动node1和node2的DataNode。
使用jps命令检查每个节点上的进程是否启动:
24053 SecondaryNameNode
23721 NameNode
23850 DataNode
24205 Jps
(如果node-master上也启动了一个DataNode那么在node-master上也能看到NodeManager)
在node1上jps结果如下:
27387 Jps
27311 DataNode
在node2上jps结果如下:
1314 Jps
1227 DataNode
要停止主节点和从节点上的HDFS,请从node-master运行以下命令:
stop-dfs.sh
在hdfs启动之后,各种hdfs命令就都可以直接在集群上使用。
关于hdfs安全模式的解除:重启机器等操作时会导致hdfs处于安全模式,因此需要用命令解除:
hdfs dfsadmin -safemode leave
HDFS是一个分布式存储系统,它不提供任何服务来运行和调度集群中的任务。 这是YARN框架的作用。 以下部分是关于启动,监控和向YARN提交作业。
运行以下脚本启动:
start-yarn.sh
使用jps命令检查各节点上正在运行的进程。除了前面的HDFS守护进程之外,还应该在node-master上看到ResourceManager,并在node1和node2上看到NodeManager。
要停止YARN,请在node-master上运行以下命令:
stop-yarn.sh
yarn命令提供实用的命令套件程序来管理YARN集群。 还可以使用以下命令打印正在运行的节点的报告:
yarn node -list
如果运行错误,需要检查YARN的配置文件hadoop/yarn-site.xml
是否配置错误。
可以使用以下命令获取正在运行的应用程序的列表:
yarn application -list
要获得yarn命令的所有可用参数,请参阅Apache YARN文档
与HDFS一样,YARN提供了一个友好的Web UI,默认端口为8088。 具体端口可通过yarn-site.xml文件里面的yarn.resourcemanager.webapp.address配置。示例地址如下:
http://120.77.239.67:18088/cluster
YARN作业被打包成jar文件,并提交给YARN用命令yarn jar
执行。
参考: