Back

搭建真分布式Hadoop集群指南

搭建一个Hadoop环境是学习大数据技术的第一步,这个环境可以是单机的,也可以是伪集群的,但最贴近实际生产环境的还是真集群的版本。本文提供一个基于AWS搭建Hadoop的简要指南,基于AWS EC2 Ubuntu 20。如果你也用的是AWS的免费套餐,几个注意的地方:

  • 小心流量使用情况,免费的仅包括了15G,请设置使用提醒。
  • 选择机器配置的时候注意选择免费套餐内的,否则也会扣费。
  • 免费套餐包括EC2每个月750h/台的使用时间,开多台实例的话注意不要超时,可以随用随开,不用就关。
  • 关闭后再启动公有IP会变,注意配置问题。

初始化通用环境

先启动一个实例,安装通用的Java和Hadoop,然后利用AWS的映像功能克隆出其他的集群成员。

sudo apt-get update -y
sudo apt-get upgrade -y
sudo apt install default-jre #可以先java看一下提示,换成最新版
wget https://apache.mirror.digionline.de/hadoop/common/hadoop-3.2.2/hadoop-3.2.2.tar.gz #改成最新版
sudo tar zxvf hadoop-* -C /usr/local
sudo mv /usr/local/hadoop-* /usr/local/hadoop​

添加环境变量sudo vim ~/.bashrc​:

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop​

更新环境变量source ~/.bashrc,测试能否用java和hadoop。

上面的搞定后,克隆两个实例。

配置SSH

在每个实例上创建key:

ssh-keygen -f ~/.ssh/id_rsa -t rsa -P ""
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys​

在NameNode上的~/.ssh/config写入:

Host namenode
	HostName <private IP or public DNS of namenode instance>
	User ubuntu
Host datanode1 
	HostName <private IP or public DNS of datanode1 instance> 
	User ubuntu
Host datanode2 
	HostName <private IP or public DNS of datanode2 instance> 
	User ubuntu

把datanode的公钥拷贝到namenode的~/.ssh/authorized_keys里,换行粘贴就行。

配置Hadoop

在NameNode和DataNode上执行:

cd $HADOOP_CONF_DIR

core-site.xml中插入,并确认9000端口开放:

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://[namenode public dns name or private IP]:9000</value>
  </property>
</configuration>

yarn-site.xml中插入:

<configuration>

<!-- Site specific YARN configuration properties -->

  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>[namenode public dns name or private IP]</value>
  </property>
</configuration>

mapred-site.xml中插入,并确认54311端口开放:

<configuration>
  <property>
    <name>mapreduce.jobtracker.address</name>
    <value>[namenode public dns name or private IP]:54311</value>
  </property>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
</configuration>

hdoop-env.sh中将将语句export JAVA_HOME=$JAVA_HOME修改为export JAVA_HOME=/usr/java/jdk1.8.0_101

仅在NameNode上执行:

修改/etc/hosts,加入:

<namenode ip> <namenode_hostname>
<datanode1 ip> <datanode1_hostname>
<datanode2 ip> <datanode2_hostname>
127.0.0.1 localhost

hdfs-site.xml插入:

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>3</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:///usr/local/hadoop/data/hdfs/namenode</value>
  </property>
</configuration>

新建文件路径:sudo mkdir -p $HADOOP_HOME/data/hdfs/namenode​

HADOOP_CONF_DIR创建一个名称为masters的文件,写入

<namenode_hostname>

创建一个名称为workers的文件,写入

<datanode1_hostname>
<datanode2_hostname>

修改权限:sudo chown -R ubuntu $HADOOP_HOME​

仅在DataNode上执行:

$HADOOP_CONF_DIR/hdfs-site.xml中插入:

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>3</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///usr/local/hadoop/data/hdfs/datanode</value>
  </property>
</configuration>

执行

sudo mkdir -p $HADOOP_HOME/data/hdfs/datanode
sudo chown -R ubuntu $HADOOP_HOME

初始化Hadoop集群

在NameNode上执行:

hdfs namenode -format # 格式化文件系统
$HADOOP_HOME/sbin/start-dfs.sh​ # 启动dfs

没问题后初始化yarn:

$HADOOP_HOME/sbin/start-yarn.sh​

执行完后运行jps查看运行情况,确认服务都起来了。

一切顺利的话之后都可以通过$HADOOP_HOME/sbin/start-all.sh​$HADOOP_HOME/sbin/start-all.sh​一键启停集群。

获取集群slave的状态报告:

hdfs dfsadmin -report

刷新集群节点:

hdfs dfsadmin -refreshNodes​

成功后可以访问<namenode public DNS or public IP>:9870 来使用hadoop的web UI,但要确认9870端口是开放的。

优化

对于AWS免费的1G RAM的机器,在yarn-site.xml中加入:

<property>
	<name>yarn.nodemanager.resource.memory-mb</name>
	<value>768</value>
</property>
<property>
	<name>yarn.scheduler.maximum-allocation-mb</name>
	<value>768</value>
</property>
<property>
	<name>yarn.scheduler.minimum-allocation-mb</name>
	<value>64</value>
</property>
<property>
	<name>yarn.nodemanager.vmem-check-enabled</name>
	<value>false</value>
</property>

mapred-site.xml中配置:

<property>
	<name>yarn.app.mapreduce.am.resource.mb</name>
	<value>256</value>
</property>
<property>
	<name>mapreduce.map.memory.mb</name>
	<value>128</value>
</property>
<property>
	<name>mapreduce.reduce.memory.mb</name>
	<value>128</value>
</property>

持续更新–要点和troubleshooting

  1. 配置ssh权限时要有耐心,这直接决定了你的集群能不能互相通讯。用AWS的时候最好用私有ip配置,否则重启后公有ip会改变,又要重新配置一遍。

  2. 重要的配置文件(在$HADOOP_HOME/etc/hadoop/下):

  • core-site.xml
  • yarn-site.xml
  • mapred-site.xml
  • hdfs-site.xml
  • hadoop-env.sh
  1. Hadoop3.0后web端端口改成了9870,不是原来的50070!!!!!!不要被网上老的教程误导!

  2. cluster ID 冲突

$HADOOP_HOME/sbin/stop-all.sh
sudo rm -rf /tmp/hadoop-ubuntu
sudo rm -rf $HADOOP_HOMEdata/hdfs/namenode   # directory mentioned in hdfs-site.xml for namenode
sudo mkdir -p $HADOOP_HOME/data/hdfs/namenode
sudo chown -R ubuntu $HADOOP_HOME
hdfs namenode -format -force
$HADOOP_HOME/sbin/start-all.sh
  1. ERROR:无法创建 java.io.IOException: Cannot create directory /usr/local/hadoop/data/hdfs/namenode/current 解决方法:改权限 sudo chmod -R a+w /usr/local/hadoop/

  2. ERROR: JAVA_HOME is not set and could not be found. 针对这个错误,网上好多都说了java的路径设置有问题,但没有指出具体的修改方法,其实是hadoop里面hadoop-env.sh文件里面的java路径设置不对,hadoop-env.sh在hadoop/etc/hadoop目录下,具体的修改办法如下:

sudo vim hadoop/etc/hadoop/hdoop-env.sh

将语句      export JAVA_HOME=$JAVA_HOME 修改为      export JAVA_HOME=/usr/java/jdk1.8.0_101

  1. ERROR: 找不到或无法加载主类org.apache.hadoop.mapreduce.v2.app.MRAppMaster 在命令行下输入hadoop classpath,并将返回的地址复制。 编辑yarn-site.xml, 添加如下内容
<configuration>
    <property>
        <name>yarn.application.classpath</name>
        <value>输入刚才返回的Hadoop classpath路径</value>
    </property>
</configuration>

在所有的Master和Slave节点进行如上设置,设置完毕后重启Hadoop集群。

Built with Hugo
Theme Stack designed by Jimmy