搭建一个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
-
配置ssh权限时要有耐心,这直接决定了你的集群能不能互相通讯。用AWS的时候最好用私有ip配置,否则重启后公有ip会改变,又要重新配置一遍。
-
重要的配置文件(在
$HADOOP_HOME/etc/hadoop/
下):
core-site.xml
yarn-site.xml
mapred-site.xml
hdfs-site.xml
hadoop-env.sh
-
Hadoop3.0后web端端口改成了9870,不是原来的50070!!!!!!不要被网上老的教程误导!
-
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
-
ERROR:无法创建 java.io.IOException: Cannot create directory /usr/local/hadoop/data/hdfs/namenode/current 解决方法:改权限 sudo chmod -R a+w /usr/local/hadoop/
-
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
- 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集群。