分类:hadoop| 发布时间:2018-05-20 18:30:00
本文主要讲述了如何使用 3 台机器来创建一个最简单的 Hadoop Cluster。
假设有 3 台机器:
% sudo useradd --home-dir /home/hadoop -m --shell /bin/bash hadoop
% sudo passwd hadoop
hadoop ALL=(ALL:ALL) ALL
切换到 hadoop 用户,以下操作均在 hadoop 用户进行操作
参考: Hadoop 编译以及安装 一文安装 Hadoop。
修改 /etc/hosts 文件,添加以下 3 行(需要分别在 3 个节点进行配置):
192.168.1.10 node-master
192.168.1.11 node1
192.168.1.12 node2
% ssh-keygen -b 4096
% ssh-copy-id -i $HOME/.ssh/id_rsa.pub hadoop@node-master
% ssh-copy-id -i $HOME/.ssh/id_rsa.pub hadoop@node1
% ssh-copy-id -i $HOME/.ssh/id_rsa.pub hadoop@node2
以下配置文件若无特别说明均位于 $HADOOP_INSTALL_DIR/etc/hadoop 目录下。
% update-alternatives --display java
java - 手动模式
链接目前指向 /usr/lib/jvm/java-8-oracle/jre/bin/java
/usr/lib/jvm/java-8-oracle/jre/bin/java - 优先级 1081
slave java.1.gz:/usr/lib/jvm/java-8-oracle/man/man1/java.1.gz
目前“最佳”的版本为 /usr/lib/jvm/java-8-oracle/jre/bin/java。
在 $HADOOP_INSTALL_DIR/etc/hadoop/hadoop-env.sh 这个文件添加以下内容:
export JAVA_HOME=/usr/lib/jvm/java-8-oracle/jre
export HADOOP_LOG_DIR=/var/log/hadoop
创建日志目录,并且将其所有者修改为 hadoop 用户
% sudo mkdir -p /var/log/hadoop
% sudo chown hadoop:hadoop /var/log/hadoop
修改 $HADOOP_INSTALL_DIR/etc/hadoop/core-site.xml 为如下内容:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://node-master:9000</value>
</property>
</configuration>
修改 $HADOOP_INSTALL_DIR/etc/hadoop/hdfs-site.xml 为如下内容:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/hdfs/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/hdfs/dataNode</value>
</property>
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>/home/hadoop/hdfs/namesecondary</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
其中 dfs.replication 为 HDFS 中的数据保存多少份,由于我们这里只有两个 datanode 因此将其设置为 1。 当然也可以将其设置为 2,这样每个 datanode 都有相同的数据,这里的值不能大于 datanode 的个数。
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
以上配置将 mapreduce 作业的调度器设置为 YARN
<?xml version="1.0"?>
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node-master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.application.classpath</name>
<value>hadoop classpath output</value>
</property>
</configuration>
其中 yarn.application.classpath 的值需要配置为命令 hadoop classpath 得到的值。
需要在 workers 文件添加所有的数据节点
node1
node2
对于内存不足 8G 的主机来说,内存分配比较麻烦。
如果你的 node1 和 node2 的内存大于等于 8G,则可以跳过这部分内容。 这部分内容会介绍 MapReduce 作业的内存如何分配,以及假设我们只有 2G 内存将如何进行配置使得集群可以正常运行。
一个 YARN 作业是由以下两种资源构成的:
所有这些都运行在 workers 节点。每个 worker 节点会有一个用于创建 container 的 NodeManager 守护进程。 ResouceManager 用于调度整个 cluster 中的 container 到各个 workers 节点。
我们需要配置以下 4 中资源分配属性:
这些属性的关系为:
对于一个只有 2G 内存的节点可以配置如下:
属性 | 值 |
---|---|
yarn.nodemanager.resource.memory-mb | 1536 |
yarn.scheduler.maximum-allocation-mb | 1536 |
yarn.scheduler.minimum-allocation-mb | 128 |
yarn.app.mapreduce.am.resource.mb | 512 |
mapreduce.map.memory.mb | 256 |
mapreduce.reduce.memory.mb | 256 |
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>1536</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>1536</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>128</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
最后一个属性取消虚拟内存的使用限制。
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>512</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>256</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>256</value>
</property>
假设上面的配置已经在 node-master 进行配置,现在需要将其复制到 node1 和 node2。 假设 hadoop 都安装在 /home/hadoop/hadoop-3.1.0 目录下,使用如下命令:
% cd /home/hadoop/hadoop-3.1.0/etc/hadoop
% scp -r * node1:~/hadoop-3.1.0/etc/hadoop
% scp -r * node2:~/hadoop-3.1.0/etc/hadoop
在使用 HDFS 之前需要先将其格式化,在 node-master 节点使用如下命令进行格式化:
% hdfs namenode -format
格式化后需要先运行 namenode 和 datanode 的守护进程才能操作 HDFS。
% start-dfs.sh
% jps
3169 Jps
2137 NameNode
2383 SecondaryNameNode
% jps
2386 Jps
1978 DataNode
% hdfs dfsadmin -report
% stop-dfs.sh
启动后就可以使用 hdfs dfs 命令来操作 HDFS 了。
% start-yarn.sh
% jps
2641 ResourceManager
3682 Jps
2137 NameNode
2383 SecondaryNameNode
% jps
2537 Jps
2105 NodeManager
1978 DataNode
% stop-yarn.sh
可以通过以下命令查看正在运行的 YARN 节点
% yarn node -list
通过以下命令查看正在运行的 application
% yarn application -list
我们以 Hadoop Book Example Code 的 MaxTemperature 为例,测试下搭建的cluster 能否正常运行 mapreduce 作业
% cd hadoop-book
% hdfs dfs -mkdir -p .
% hdfs dfs -put input/ncdc/sample.txt
% hadoop jar hadoop-examples.jar MaxTemperature sample.txt output
× 查看结果
% hdfs dfs -cat output/part-r-00000
1949 111
1950 22