Hadoop-4-全分布式模式安装

Hadoop-4-全分布式模式安装

1、准备服务器

配置好如下信息:

  1. 静态IP

    /etc/udev/rules.d/70-persistent-net.rules

    /etc/sysconfig/network-scripts/ifcfg-eth0

  2. 主机名称

    /etc/sysconfig/network

  3. host

    /etc/hosts

  4. 新建用于运行Hadoop的用户

  5. Java环境

  6. Hadoop环境

2、跨服务器文件传输

【1】复制文件

 使用scp命令,主要有3种情况:

  1. 向另外一服务器传输文件

    scp -r /本地目录 用户名@服务器IP:/目标目录

  2. 从另外一服务器拉取文件

    scp 用户名@服务器IP:/目标文件路径 /本地目录

  3. 从服务器A向服务器B传输文件

    scp -r 用户名@服务器A的IP:/目录 用户名@服务器B的IP:/目录

注意冒号

【2】同步文件

 和复制文件不同的是,同步仅仅复制不同的文件,相同的文件则不会复制

 使用rsync命令,主要使用情况和scp类似

 选项 -l 表示保留软连接

 同步脚本:

#!/bin/bash
if [ $# -eq 0 ] ; then
    echo "请输入同步路径"
    exit
fi

arg1=$1
if [ -d $arg1 ] ; then
    type=1 #dir
elif [ -f $arg1 ] ; then
    type=2 #file
else
    echo $arg1"不存在!"
    exit
fi

if [ $type -eq 1 ] ; then #目录
    abpath=`cd -P $arg1; pwd`
    finalpath=$abpath
    option="-rvl"
elif [ $type -eq 2 ] ; then #文件
    filename=`basename $arg1`
    nowpath=`dirname $arg1`
    abpath=`cd -P $nowpath; pwd`
    finalpath=$abpath"/"$filename
    option="-vl"
else
    echo "出错了!"
    exit
fi

echo "待同步目录的绝对路径:"$finalpath

#待同步的主机IP前缀,注意点
basehost="192.168.20."

for (( host=202; host<=204; host++ )) ; do
    ip=$basehost$host
    echo "-------- 准备同步"$ip" --------"
    rsync $option $finalpath root@$ip:$abpath
done

3、免密登录

  1. 生成公钥和私钥

    使用命令ssh-keygen -t rsa,会提示3次,直接按回车即可

    然后到家目录下的.ssh目录中查看生成的2个文件:id_ras(私钥)和id_rsa.pub(公钥)

  2. 发送公钥给目标主机

    使用命令ssh-copy-id 用户名@目标主机IP,第一次发送,需要输入登录密码

    然后到目标主机的登录用户的家目录下的.ssh目录中查看发送过来的公钥文件:authorized_keys

  3. 验证

    使用命令ssh 用户名@目标主机IP登录免密主机

4、集群配置

【1】分配节点

因为NameNode、SecondaryNameNode、ResourceManager和JobHistoryServer都很占用资源,所以需要将这4个分开来部署到不同的节点上(也可以不配置JobHistoryServer,只需将节点D以及相应的配置去掉即可)

节点A 节点B 节点C 节点D
HDFS NameNode
DataNode
SecondaryNameNode
DataNode
DataNode DataNode
YARN NodeManager NodeManager ResourceManager
NodeManager
NodeManager
MapReduce JobHistoryServer

【2】配置节点

  1. etc/hadoop/hadoop-env.sh

    每一个节点都要配置JAVA_HOME

    # The java implementation to use.
    export JAVA_HOME=${JAVA_HOME}
    
  2. etc/hadoop/core-site.xml

    每一个节点都要配置

    <!-- 配置NameNode的服务器的IP和端口号,默认端口号为9000 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://节点A的IP:端口号</value>
    </property>
    <!-- 配置临时文件目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/指定路径</value>
    </property>
    
  3. etc/hadoop/hdfs-site.xml

    每一个节点都要配置

    <!-- 配置副本数 -->
    <property>
        <name>dfs.replication</name>
        <value>4</value>
    </property>
    <!-- 配置Secondary NameNode的服务器的IP和端口号,默认端口号为50090 -->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>节点B的IP:端口号</value>
    </property>
    
  4. etc/hadoop/yarn-env.sh

    每一个节点都要配置JAVA_HOME

    # some Java parameters
    # export JAVA_HOME=/home/y/libexec/jdk1.6.0/
    
  5. etc/hadoop/yarn-site.xml

    每一个节点都要配置

    <!-- 配置服务器列表 -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <!-- 配置ResourceManager的主机地址 -->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>节点C的IP</value>
    </property>
    <!-- 启用日志聚合。默认关闭状态(false) -->
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
    <!-- 设置日志保留时长,单位是秒。默认是-1,表示禁用 -->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>日志保留时长</value>
    </property>
    
  6. etc/hadoop/mapred-env.sh

    每一个节点都要配置JAVA_HOME

    # export JAVA_HOME=/home/y/libexec/jdk1.6.0/
    
  7. etc/hadoop/mapred-site.xml

    每一个节点都要配置

    <!-- 配置执行MapReduce作业时的框架名称 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <!-- 配置MapReduce任务历史服务器主机地址:端口,端口号默认为10020 -->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>节点D的IP:端口</value>
    </property>
    <!-- 配置MapReduce任务历史服务器Web页面主机地址:端口,端口号默认为19888 -->
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>节点D的IP:端口</value>
    </property>
    
  8. etc/hadoop/slaves

    每一个节点都要配置

    将每一个节点的主机名称或IP罗列出来,每一个IP占一行,不能有空格或空行

    这样就可以一次将命令在多个节点上执行

    节点A的IP
    节点B的IP
    节点C的IP
    节点D的IP
    

    需要注意的是,该功能必须为用于运行Hadoop的用户建立ssh信任

    需要配置NameNode服务器和ResourceManager服务器到任意一台节点的免密登录,包括它本身

【3】启动集群

  1. 格式化NameNode

    在节点A(NameNode服务器)上执行命令bin/hdfs namenode -format

  2. 启动HDFS

    在节点A(NameNode服务器)上执行命令sbin/start-dfs.sh

    使用jps命令检查是否各个节点上对应的资源已启动

  3. 启动YARN

    在节点C(ResourceManager服务器)上执行命令sbin/start-yarn.sh

    使用jps命令检查是否各个节点上对应的资源已启动

  4. 启动JobHistoryServer

    在节点D(JobHistoryServer服务器)上执行命令sbin/mr-jobhistory-daemon.sh start historyserver

    使用jps命令检查资源是否已启动

【4】测试集群

  1. 创建目录

    在节点A(NameNode服务器)上执行命令bin/hadoop fs -mkdir -p /指定目录

  2. 上传文件

    在节点A(NameNode服务器)上执行命令bin/hadoop fs -put /目标文件路径 /指定目录

  3. 查看NameNode及DataNode状态

    通过管理页面:http://节点A的IP:50070,注意需要配置host

  4. 执行MapReduce任务

    在节点C(ResourceManager服务器)上执行命令bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar MapReduce程序 /输入目录 /输出目录

  5. 查看ResourceManager状态

    通过管理页面:http://节点C的IP:8088,注意需要配置host

【5】关闭集群

  1. 关闭JobHistoryServer

    在节点D(JobHistoryServer服务器)上执行命令sbin/mr-jobhistory-daemon.sh stop historyserver

    使用jps命令检查资源是否已关闭

  2. 关闭YARN

    在节点C(ResourceManager服务器)上执行命令sbin/stop-yarn.sh

    使用jps命令检查是否各个节点上对应的资源已关闭

  3. 关闭HDFS

    在节点A(NameNode服务器)上执行命令sbin/stop-dfs.sh

    使用jps命令检查是否各个节点上对应的资源已关闭

5、注意事项

【1】防火墙问题

 如果开启防火墙,则需要注意开启以下几个端口

  1. HDFS端口,默认为9000
  2. NameNode数据传输端口,默认为50010
  3. NameNode前端管理页面端口,默认为50070(访问)和50075(下载)
  4. Secondary NameNode数据传输端口,默认为50090
  5. ResourceManager数据传输端口,默认为8032
  6. ResourceManager前端管理页面端口,默认为8088
  7. NodeManager前端管理页面端口,默认为8042
  8. MapReduce JobHistoryServer数据传输端口,默认为10020
  9. MapReduce JobHistoryServer前端管理页面端口,默认为19888
#HDFS
-A INPUT -m state --state NEW -m tcp -p tcp --dport 9000 -j ACCEPT
#NameNode
-A INPUT -m state --state NEW -m tcp -p tcp --dport 50010 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 50070 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 50075 -j ACCEPT
#Secondary NameNode
-A INPUT -m state --state NEW -m tcp -p tcp --dport 50090 -j ACCEPT
#Resource Manager
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8032 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8088 -j ACCEPT
#NodeManager
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8042 -j ACCEPT
#MapReduce JobHistoryServer
-A INPUT -m state --state NEW -m tcp -p tcp --dport 10020 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 19888 -j ACCEPT

【2】不同节点之间的时间同步问题

 可能由于节点间的时间的不同,导致MapReduce job执行的时间不一样,从而导致未知问题。所以需要配置集群时间的同步

  1. 时间服务器节点检查是否安装ntp,rpm -qa | grep ntp

  2. 时间服务器节点修改/etc/ntp.conf

    # Hosts on local network are less restricted.
    restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap #打开这一行
    
    # Use public servers from the pool.ntp.org project.
    # Please consider joining the pool (http://www.pool.ntp.org/join.html).
    #server 0.centos.pool.ntp.org iburst #注释这一行
    #server 1.centos.pool.ntp.org iburst #注释这一行
    #server 2.centos.pool.ntp.org iburst #注释这一行
    #server 3.centos.pool.ntp.org iburst #注释这一行
    
    #添加内部时钟服务器
    server 127.127.1.0
    fudge 127.127.1.0 stratum 10
    
  3. 时间服务器节点修改/etc/sysconfig/ntpd

    #硬件时间要同步系统时间
    SYNC_HWCLOCK=yes
    
  4. 时间服务器节点启动ntpd服务,service ntpd start

  5. 时间同步节点配置定时同步任务,crontab -e

    #每半小时同步一次时间
    */30 * * * * /usr/sbin/ntpdate 时间服务器IP
    

【3】未知问题

 上传jdk(jdk-8u212)目录时,出现以下异常

19/08/13 03:02:08 WARN hdfs.DataStreamer: Caught exception
java.lang.InterruptedException
	at java.lang.Object.wait(Native Method)
	at java.lang.Thread.join(Thread.java:1252)
	at java.lang.Thread.join(Thread.java:1326)
	at org.apache.hadoop.hdfs.DataStreamer.closeResponder(DataStreamer.java:980)
	at org.apache.hadoop.hdfs.DataStreamer.endBlock(DataStreamer.java:630)
	at org.apache.hadoop.hdfs.DataStreamer.run(DataStreamer.java:807)

 网上搜索,说这是Hadoop的bug!?

猜你喜欢

转载自blog.csdn.net/adsl624153/article/details/99227233
今日推荐