搭建前的准备
本次搭建 Hadoop 版本是 hadoop2.7.7-release,点击下载安装包。
伪分布式集群搭建参考,官方文档
搭建过程
新建hadoop用户
useradd hadoop
# 为hadoop用户分配sudo权限
visudo
# 添加如下内容
hadoop ALL=(ALL) NOPASSWD: ALL
# 设置hadoop密码
passwd hadoop
将下载好的hadoop-2.7.7.tar.gz包解压到/home/hadoop/
。
su - hadoop
tar -zxvf hadoop-2.7.7.tar.gz -C /home/hadoop/
配置环境变量。
vim ~/.bash_profile
export HADOOP_HOME=/home/hadoop/hadoop-2.7.7
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
source ~/.bash_profile
# 配置Hadoop环境变量
vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_111/
修改 core-site.xml
vim $HADOOP_HOME/etc/hadoop/core-site.xml
<configuration>
<!-- 指定主节点通信地址和端口 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://192.168.10.145:9000</value>
</property>
<!-- 指定hadoop运行时产生的临时文件的存放路径 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop-2.7.7/tmp</value>
</property>
</configuration>
修改 hdfs-site.xml
vim $HADOOP_HOME/etc/hadoop/hdfs-site.xml
<configuration>
<!-- 设置 NameNode 的 http 通讯地址 -->
<property>
<name>dfs.namenode.http-address</name>
<value>192.168.10.145:50070</value>
</property>
<!-- 设置 secondaryNameNode 的 http 通讯地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>192.168.10.146:50070</value>
</property>
<!-- 设置 NameNode 元数据的存放路径 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/hadoop-2.7.7/namenode</value>
</property>
<!-- 设置 datanode 数据的存放路径 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/hadoop-2.7.7/datanode</value>
</property>
<!-- 设置 hdfs 副本数量,如果是但节点的伪集群记得改成 1,不然会报错 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
</configuration>
修改 mapred-site.xml
首先需要执行cp mapred-site.xml.template mapred-site.xml
,然后修改mapred-site.xml
<configuration>
<!-- 通知框架 MR 使用 YARN -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
修改 yarn-site.xml
<configuration>
<!-- 设置 ResourceManager 所在节点 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>192.168.10.145</value>
</property>
<!-- 设置 reducer 取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定 shuffle 处理类 -->
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<!-- 配置环境变量白名单 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
配置 Secondary NameNode
# 新建 masters 文件,将 Secondary NameNode 填写进去
vim masters
192.168.10.146
配置 DataNode
vim slaves
192.168.10.146
192.168.10.147
创建刚才配置文件中提到的文件夹
mkdir /home/hadoop/hadoop-2.7.7/tmp /home/hadoop/hadoop-2.7.7/namenode /home/hadoop/hadoop-2.7.7/datanode
配置到各个节点的 ssh。
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
ssh-copy-id 192.168.10.145
ssh-copy-id 192.168.10.146
ssh-copy-id 192.168.10.147
# 测试
ssh 192.168.10.146
将 Hadoop 发送到各个节点
# 首先需要将环境变量文件发送给各个节点
scp ~/.bash_profile [email protected]:~
# 记得到节点上刷新配置文件
source ~/.bash_profile
# 发送将配置完的Hadoop文件发送到各个节点
scp -rp /home/hadoop/hadoop-2.7.7 [email protected]:~
格式化 FileSystem 并启动
Hadoop守护进程日志输出地址配置在$HADOOP_LOG_DIR
,默认是$HADOOP_HOME/logs
。
# 第一次启动需要格式化
hdfs namenode -format
# 启动hdfs
start-dfs.sh
# 在浏览器查看NameNode启动情况
http://localhost:9870/
# jps查看进程启动情况
18284 NameNode
18362 DataNode
18460 SecondaryNameNode
启动yarn
# 启动
sbin/start-yarn.sh
# 浏览器查看ResourceManager启动情况
http://localhost:8088/
# jps 查看进程
14481 NodeManager
安装中出现的问题
在更换版本时 Incompatible clusterIDs
java.io.IOException: Incompatible clusterIDs in /tmp/hadoop-hadoop/dfs/data: NameNode clusterID = CID-2814bb5f-3867-4f19-bc67-d0f3c3ca784e; datanode clusterID = CID-1bded296-4e6e-473c-91b6-6d3174f98926
很明显意思是 NameNode 的 clusterID 和 DataNode 的 clusterID 不一致导致的。可能是格式化 NameNode 之后master 上的 CLUSTERID 变了,没有同步到 DataNode 上。
# 关掉dfs
stop-dfs.sh
# 查看 NameNode clusterId
cat /tmp/hadoop-hadoop/dfs/namenode/current/VERSION
# 修改 datanode clusterId
vim /tmp/hadoop-hadoop/dfs/data/current/VERSION
# 启动hdfs
start-dfs.sh
Unable to load native-hadoop …
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform...
using builtin-java classes where applicable
参考这篇博客
InconsistentFSStateException
org.apache.hadoop.hdfs.server.common.InconsistentFSStateException:
Directory /private/tmp/hadoop-despacito/dfs/name is in an inconsistent state:
storage directory does not exist or is not accessible.
在启动Hadoop的时候会在${hadoop.tmp.dir}
文件夹生成一堆文件,${hadoop.tmp.dir}
属性配置在conf/core-site.xml
中,默认是下面的样子。
<property>
<name>hadoop.tmp.dir</name>
<value>/private/tmp/hadoop-${user.name}</value>
<description>A base for other temporary directories.</description>
</property>
如果tmp文件夹中的内容被清理,Hadoop启动的时候不会恢复${hadoop.tmp.dir}/dfs/name
这个文件夹,因此需要执行hdfs NameNode -format
重新生成这个文件夹就可以了。
WARNING: hdfs NameNode -format 会重置 NameNode 保存的所有元数据,这意味着,即便你的数据存储在 datanode 中,如果没有 NameNode 中的元数据信息,hdfs 就无法找到真实数据的存放地址,这和删掉所有数据没什么区别。如果你处于生产环境,千万不要使用该命令!