Hadoop 集群搭建

搭建前的准备

本次搭建Hadoop版本是hadoop2.7.6-release,点击下载安装包

伪分布式集群搭建参考,官方文档

搭建过程

新建hadoop用户

useradd hadoop
# 为hadoop用户分配sudo权限
visudo
# 添加如下内容
hadoop ALL=(ALL)       NOPASSWD: ALL
# 设置hadoop密码
passwd hadoop

将下载好的hadoop-2.7.6.tar.gz包解压到/home/hadoop/

su - hadoop 
tar -zxvf hadoop-2.7.6.tar.gz -C /home/hadoop/

配置环境变量。

vim ~/.bash_profile
export HADOOP_HOME=/home/hadoop/hadoop-2.7.6
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.6/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.6/namenode</value>
    </property>
     <!-- 设置 datanode 数据的存放路径 -->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/home/hadoop/hadoop-2.7.6/datanode</value>
    </property>
    <!-- 设置 hdfs 副本数量 -->
    <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.6/tmp /home/hadoop/hadoop-2.7.6/namenode /home/hadoop/hadoop-2.7.6/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.6 [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 就无法找到真实数据的存放地址,这和删掉所有数据没什么区别。如果你处于生产环境,千万不要使用该命令!

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,一毛也是爱

打开支付宝扫一扫,即可进行扫码打赏哦