hadoop3.0的全分布式搭建折腾了好久,因为网上基本上都是2.x的搭建教程,期间有好几个坑比较难弄,不过最后还是都解决了,下面简要记录笔者的搭建过程,以及遇到的坑。

搭建环境:CentOS7+hadoop3.0.3+jdk8
集群配置:1台主节点+3台子节点
主节点:hadoop1
子节点:hadoop2 hadoop3 hadoop4

前提准备

  1. 安装scp服务
  2. 安装配置jdk
  3. 配置静态ip地址
  4. 修改主机名
  5. 配置主机名和ip地址映射
  6. 关闭防火墙,设置开机不自启动
    注:以上操作在笔者之前的Linux相关笔记中均有介绍

正式搭建集群

  1. 在所有机器添加统一用户hadoop
    useradd hadoop
    passwd hadoop
  2. 配置sudo免密
    在root用户下
    vi /etc/sudoers

    root ALL=(ALL) ALL
    下面添加
    hadoop ALL=(ALL) ALL
    注:修改完退出root用户,回到hadoop用户
  3. 创建hadoop相关目录
    mkdir -p /home/hadoop/apps/dfs/data
    mkdir /home/hadoop/apps/dfs/name
    mkdir /home/hadoop/apps/tmp
  4. 上传并解压hadoop-3.0.3.tar.gz到apps目录下
    sftp上传
    tar -zxvf hadoop-3.0.3.tar.gz -C /home/hadoop/apps/
  5. 配置hadoop-env.sh
    vi /home/hadoop/apps/hadoop-3.0.3/etc/hadoop/hadoop-env.sh
    找到#export JAVA_HOME
    在下面添加
    export JAVA_HOME=/usr/local/jdk
  6. 修改核心配置文件core-site.xml
    vi core-site.xml
    在configuration标签中添加属性

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <configuration>
    <property>
    <name>fs.defaultFS</name> #默认
    <value>hdfs://hadoop1:9000</value> #hdfs的api接口
    </property>
    <property>
    <name>hadoop.tmp.dir</name> #hadoop运行时产生临时数据的存储目录
    <value>/home/hadoop/apps/tmp</value> #该目录的地址
    </property>
    </configuration>
  7. 配置hadoop的底层存储hdfs-site.xml
    vi hdfs-site.xml
    在configuration标签中添加属性

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <configuration>
    <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>hadoop1:50090</value>
    </property>
    <property>
    <name>dfs.replication</name> #设置副本个数
    <value>3</value>
    </property>
    <property>
    <name>dfs.namenode.name.dir</name> #设置namende数据存放点
    <value>file:/home/hadoop/apps/dfs/name</value>
    </property>
    <property>
    <name>dfs.datanode.data.dir</name> #设置datanode数据存放点
    <value>file:/home/hadoop/apps/dfs/data</value>
    </property>
    </configuration>
  8. 复制并重命名mapred-site.xml.template
    cp mapred-site.xml.template mapred-site.xml
  9. 修改配置文件mapred-site.xml
    vi mapred-site.xml
    在configuration标签中添加属性

    1
    2
    3
    4
    5
    6
    <configuration>
    <property>
    <name>mapreduce.framwork.name</name> #设置mapreduce的运行平台的名称
    <value>yarn</value> #设置mapreduce的运行平台为yarn
    </property>
    </configuration>
  10. 修改配置文件yarn-site.xml
    vi yarn-site.xml
    在configuration标签中添加属性

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <configuration>
    <property>
    <name>yarn.resourcemanager.hostname</name> #指定yarn的老大的地址
    <value>hadoop1</value>
    </property>
    <property>
    <name>yarn.nodemanager.aux-services</name> #reducer获取数据的方式
    <value>mapreduce_shuffle</value>
    </property>
    </configuration>
  11. 修改workers文件
    注:这个文件是填写从节点的主机名称
    添加
    hadoop2
    hadoop3
    hadoop4
  12. 将apps文件夹分发到其他机器
    scp -r /home/hadoop/apps hadoop2:/home/hadoop/
    scp -r /home/hadoop/apps hadoop3:/home/hadoop/
    scp -r /home/hadoop/apps hadoop4:/home/hadoop/
  13. 配置hadoop的环境变量
    sudo vi ~/.bash_profile
    添加
    HADOOP_HOME=/home/hadoop/apps/hadoop-3.0.3
    PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
    export HADOOP_HOME PATH
    重新加载
    source ~/.bash_profile
  14. 在其他机器同样配置hadoop的环境变量
  15. 格式化hdfs(没事不要用这个命令,蛋疼)
    hdfs namenode -format
  16. 配置hadoop用户免密登录
    ssh-keygen
    ssh-copy-id hadoop1
    ssh-copy-id hadoop2
    ssh-copy-id hadoop3
    ssh-copy-id hadoop4
  17. 启动hdfs集群
    start-dfs.sh
    停止hdfs
    stop-dfs.sh
  18. 启动yarn集群
    start-yarn.sh
    停止yarn
    stop-yarn.sh
  19. 启动所有服务(不推荐)
    start-all.sh
    相当于start-dfs.sh+start-yarn.sh
  20. 停止所有服务
    stop-all.sh
  21. 在浏览器查看
    hadoop1:9870
    hadoop1:8088
  22. 查看该dfs -ls /
  23. 创建自己的家目录
    hdfs 集群根目录
    hdfs dfs -mkdir /user/xujie
  24. 测试实例
    cd /home/hadoop/apps/hadoop-3.0.3/share/hadoop/mapreduce/
    调用jar包计算pi的值,计算100次
    hadoop jar hadoop-mapreduce-examples-3.0.3.jar pi 3 100

问题汇总

  1. 没有配置文件salves
    解决方案:因为3.0以后slaves更改名称为workers了
  2. 启动所有服务,datanode却没有启动
    一般是hdfs格式化以后运行了程序,然后又格式化了,好了gg,datanode无法启动,因为name的clusterID和data的clusterID不一致了。
    解决方案:

    • 方案一(推荐-慎用):删除所有机器的/home/hadoop/apps/dfs/data目录,重新再hdfs格式化一遍,不过数据也会全部gg。
    • 方案二:把/home/hadoop/apps/dfs/name/current/VERSION中的clusterID复制替换/home/hadoop/apps/dfs/data/current/VERSION中的clusterID
  3. 启动从节点报错
    解决方案:不要在格式化hdfs以后产生了相关数据以后才scp整个hadoop到其他机器,会产生冲突。

最后更新: 2019年01月09日 16:19

原始链接: https://www.lousenjay.top/2018/08/21/hadoop3.0全分布式集群搭建/