hadoop 3.0 集群部署,超详细-Ali0th

栏目: 编程工具 · 发布时间: 6年前

内容简介:Author : Ali0thDate : 2019-4-22经过上一篇部署单机 hadoop 之后,开始尝试部署 hadoop 集群。hadoop集群最少需要三台机,因为hdfs副本数最少为3。这里我们使用四台机子进行搭建。

Author : Ali0th

Date : 2019-4-22

经过上一篇部署单机 hadoop 之后,开始尝试部署 hadoop 集群。hadoop集群最少需要三台机,因为hdfs副本数最少为3。这里我们使用四台机子进行搭建。

本文尽求详尽,包括所有步骤与问题的解决。可见目录,有对遇到的bug的一些解决方法。可以看到我是如何踩坑过来的。

0.1. 目录

[TOC]

0.2. 环境

CentOS release 6.4
openjdk version "1.8.0_201"
复制代码

0.3. 集群设备

准备四台虚拟机,一台 master,三台 slaver。master 作为NameNode、DataNode、ResourceManager、NodeManager,slave 均作为DataNode、NodeManager。

master : 192.168.192.164
slave1 : 192.168.192.165
slave2 : 192.168.192.167
slave3 : 192.168.192.166
复制代码

0.4. hostname 配置

由于 Hadoop 集群内部有时需要通过主机名来进行相互通信,因此我们需要保证每一台机器的主机名都不相同。

vim /etc/hosts  # 四台机器都需要操作

192.168.192.164 master
192.168.192.165 slave1
192.168.192.167 slave2
192.168.192.166 slave3

reboot # 重启

hostname # 查看主机名
复制代码

/etc/hosts/etc/sysconfig/network 的区别

0.5. 环境变量配置

vim /etc/profile

#java
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.201.b09-2.el6_10.x86_64
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

#hadoop
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
复制代码

0.6. ssh 免密登录

四台机器均执行下面操作

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
复制代码

每个机子上都操作一下,把公钥拷贝到其他机器上

ssh-copy-id -i ~/.ssh/id_rsa.pub master
ssh-copy-id -i ~/.ssh/id_rsa.pub slave1
ssh-copy-id -i ~/.ssh/id_rsa.pub slave2
ssh-copy-id -i ~/.ssh/id_rsa.pub slave3
复制代码

测试配置成功

[mt@slave3 ~]$ ssh master
Last login: Tue Apr 16 17:51:47 2019 from slave2
[mt@master ~]$ ssh slave3
Last login: Tue Apr 16 17:32:12 2019 from 192.168.192.1
[mt@slave3 ~]$ ssh slave2
Last login: Tue Apr 16 17:51:42 2019 from master
[mt@slave2 ~]$ ssh slave3
Last login: Tue Apr 16 17:53:08 2019 from master
[mt@slave3 ~]$ 
复制代码

0.7. 配置时间当步

详细配置见 :hadoop集群时间同步

这里试验使用阿里云时间

ntpdate ntp1.aliyun.com
复制代码

0.8. hadoop 配置文件

共需要配置/opt/hadoop/hadoop-3.1.0/etc/hadoop/下的六个个文件,分别是

hadoop-env.sh、core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml、workers

cd $HADOOP_HOME cd etc/hadoop

0.8.1. 创建数据存储目录

  1. NameNode 数据存放目录: /usr/local/data/hadoop/name
  2. SecondaryNameNode 数据存放目录: /usr/local/data/hadoop/secondary
  3. DataNode 数据存放目录: /usr/local/data/hadoop/data
  4. 临时数据存放目录: /usr/local/data/hadoop/tmp
  5. HADOOP_MAPRED_HOME :
sudo mkdir -p /usr/local/data/hadoop/name
sudo mkdir -p /usr/local/data/hadoop/secondary
sudo mkdir -p /usr/local/data/hadoop/data
sudo mkdir -p /usr/local/data/hadoop/tmp
复制代码

0.8.2. 配置 hadoop-env.sh

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.201.b09-2.el6_10.x86_64

export HDFS_NAMENODE_USER="root"
export HDFS_DATANODE_USER="root"
export HDFS_SECONDARYNAMENODE_USER="root"
export YARN_RESOURCEMANAGER_USER="root"
export YARN_NODEMANAGER_USER="root"
复制代码

0.8.3. core-site.xml hdfs-site.xml

接着分别编辑core-site.xml以及hdfs-site.xml配置文件

vim core-site.xml   # 增加如下内容
复制代码

hadoop配置文件详解系列(一)-core-site.xml篇

需要配置的是 name,tmp.dir

<configuration>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://master:8020</value>
        <description>指定默认的访问地址以及端口号</description>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/usr/local/hadoop/data/</value>
        <description>其它临时目录的父目录,会被其它临时目录用到</description>
    </property>
    <property>
         <name>io.file.buffer.size</name>
         <value>131072</value>
        <description>在序列中使用的缓冲区大小</description>
    </property>
</configuration>
复制代码

vim hdfs-site.xml # 增加如下内容

需要配置的是 replication、namenode 、datanode 、 web.

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>4</value>
        <description>副本数,HDFS存储时的备份数量</description>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/usr/local/data/hadoop/name</value>
        <description>namenode临时文件所存放的目录</description>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/usr/local/data/hadoop/data</value>
        <description>datanode临时文件所存放的目录</description>
    </property>
    <property>
        <name>dfs.namenode.http-address</name>
        <value>master:50070</value> 
        <description>hdfs web 地址</description>
    </property>
</configuration>
复制代码

0.8.4. 编辑 yarn-site.xml 配置文件

vim yarn-site.xml # 增加如下内容

需要配置的是数据获取方式, master 地址,(配置yarn 外部可访问),关闭内存检测(虚拟机需要),容器可能会覆盖的环境变量。

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
        <description>nomenodeManager获取数据的方式是shuffle</description>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>master</value>
        <description>指定Yarn的老大(ResourceManager)的地址</description>
    </property>

    <property>
          <name>yarn.resourcemanager.webapp.address</name>
          <value>192.168.192.164:8088</value>
        <description>配置 yarn 外部可访问,(外网IP:端口)</description>
    </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_HOME,PATH,LANG,TZ</value>
        <description>容器可能会覆盖的环境变量,而不是使用NodeManager的默认值</description>
    </property>

    <property>
       <name>yarn.nodemanager.vmem-check-enabled</name>
       <value>false</value>
        <description>关闭内存检测,虚拟机需要,不配会报错</description>
    </property>

</configuration>
复制代码

0.8.5. 拷贝并编辑 MapReduce 的配置文件

cp mapred-site.xml.template mapred-site.xml vim mapred-site.xml # 增加如下内容

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
        <description>告诉hadoop以后MR(Map/Reduce)运行在YARN上</description>
    </property>
    
   <property>
        <name>mapreduce.admin.user.env</name>
        <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
        <description>可以设置AM【AppMaster】端的环境变量,如果上面缺少配置,
        可能会造成mapreduce失败</description>
   </property>

   <property>
        <name>yarn.app.mapreduce.am.env</name>
        <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
        <description>可以设置AM【AppMaster】端的环境变量,如果上面缺少配置,
        可能会造成mapreduce失败</description>
   </property>
</configuration>
复制代码

0.8.6. 配置从节点主机名

最后是配置从节点的主机名,如果没有配置主机名的情况下就使用IP:

vim workers # hadoop3.0以后slaves更名为workers
slave1
slave2
slave3
复制代码

0.8.7. 配置分发

分发 hadoop 及其配置:

rsync -av /usr/local/hadoop slave1:/usr/local/hadoop
rsync -av /usr/local/hadoop slave2:/usr/local/hadoop
rsync -av /usr/local/hadoop slave3:/usr/local/hadoop
rsync -av ~/.bash_profile slave1:~/.bash_profile
rsync -av ~/.bash_profile slave2:~/.bash_profile
rsync -av ~/.bash_profile slave3:~/.bash_profile
复制代码

这里我每个机子都装了相同的 hadoop ,所以只要分发配置文件即可:

rsync -av /usr/local/hadoop/etc/hadoop/* slave1:/usr/local/hadoop/etc/hadoop
rsync -av /usr/local/hadoop/etc/hadoop/* slave2:/usr/local/hadoop/etc/hadoop
rsync -av /usr/local/hadoop/etc/hadoop/* slave3:/usr/local/hadoop/etc/hadoop
rsync -av ~/.bash_profile slave1:~/.bash_profile
rsync -av ~/.bash_profile slave2:~/.bash_profile
rsync -av ~/.bash_profile slave3:~/.bash_profile
复制代码

在从节点执行:

source ~/.bash_profile
复制代码

0.9. 对NameNode做格式化

只需要在 master 执行即可。

hdfs namenode -format
复制代码

0.10. 启动集群

# 一次性启动
start-all.sh

# 逐个组件启动
start-dfs.sh
start-yarn.sh
复制代码
hadoop 3.0 集群部署,超详细-Ali0th

尝试上传文件,成功。

hadoop 3.0 集群部署,超详细-Ali0th

0.11. 查看进程与端口

查看进程

[hadoop@master hadoop]$ jps
13794 NodeManager
13667 ResourceManager
14100 Jps
13143 NameNode
复制代码
[hadoop@master hadoop]$ ps -ef|grep java
hadoop    13143      1  7 02:10 ?        00:00:03 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.201.b09-2.el6_10.x86_64/bin/java -Dproc_namenode -Djava.library.path=/lib -Dhdfs.audit.logger=INFO,NullAppender -Dhadoop.security.logger=INFO,RFAS -Dyarn.log.dir=/usr/local/hadoop/logs -Dyarn.log.file=hadoop-hadoop-namenode-master.log -Dyarn.home.dir=/usr/local/hadoop -Dyarn.root.logger=INFO,console -Dhadoop.log.dir=/usr/local/hadoop/logs -Dhadoop.log.file=hadoop-hadoop-namenode-master.log -Dhadoop.home.dir=/usr/local/hadoop -Dhadoop.id.str=hadoop -Dhadoop.root.logger=INFO,RFA -Dhadoop.policy.file=hadoop-policy.xml org.apache.hadoop.hdfs.server.namenode.NameNode
hadoop    13667      1 18 02:10 pts/0    00:00:05 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.201.b09-2.el6_10.x86_64/bin/java -Dproc_resourcemanager -Djava.library.path=/usr/local/hadoop/lib -Dservice.libdir=/usr/local/hadoop/share/hadoop/yarn,/usr/local/hadoop/share/hadoop/yarn/lib,/usr/local/hadoop/share/hadoop/hdfs,/usr/local/hadoop/share/hadoop/hdfs/lib,/usr/local/hadoop/share/hadoop/common,/usr/local/hadoop/share/hadoop/common/lib -Dyarn.log.dir=/usr/local/hadoop/logs -Dyarn.log.file=hadoop-hadoop-resourcemanager-master.log -Dyarn.home.dir=/usr/local/hadoop -Dyarn.root.logger=INFO,console -Dhadoop.log.dir=/usr/local/hadoop/logs -Dhadoop.log.file=hadoop-hadoop-resourcemanager-master.log -Dhadoop.home.dir=/usr/local/hadoop -Dhadoop.id.str=hadoop -Dhadoop.root.logger=INFO,RFA -Dhadoop.policy.file=hadoop-policy.xml -Dhadoop.security.logger=INFO,NullAppender org.apache.hadoop.yarn.server.resourcemanager.ResourceManager
hadoop    13794      1 17 02:10 ?        00:00:04 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.201.b09-2.el6_10.x86_64/bin/java -Dproc_nodemanager -Djava.library.path=/lib -Dyarn.log.dir=/usr/local/hadoop/logs -Dyarn.log.file=hadoop-hadoop-nodemanager-master.log -Dyarn.home.dir=/usr/local/hadoop -Dyarn.root.logger=INFO,console -Dhadoop.log.dir=/usr/local/hadoop/logs -Dhadoop.log.file=hadoop-hadoop-nodemanager-master.log -Dhadoop.home.dir=/usr/local/hadoop -Dhadoop.id.str=hadoop -Dhadoop.root.logger=INFO,RFA -Dhadoop.policy.file=hadoop-policy.xml -Dhadoop.security.logger=INFO,NullAppender org.apache.hadoop.yarn.server.nodemanager.NodeManager
hadoop    14116  12870  0 02:11 pts/0    00:00:00 grep java
复制代码

查看端口

netstat -tnlp
复制代码

0.12. 附录

0.12.1. /etc/hosts/etc/sysconfig/network 的区别

Linux系统在向DNS服务器发出域名解析请求之前会查询/etc/hosts文件,如果里面有相应的记录,就会使用hosts里面的记录。/etc/hosts文件通常里面包含这一条记录

network文件,路径:/etc/sysconfig/network,此文件是针对本计算机的,是给计算机起的一个名字,是计算机的一个标识。

设置了 /etc/hosts 后重启, /etc/rc.d/rc.sysinit 启动脚本会根据 eth0 的 ip 和 /etc/hosts 中的对应关系,把系统的 hostname 改成相应的名称。

# In theory there should be no more than one network interface active
        # this early in the boot process -- the one we're booting from.
        # Use the network address to set the hostname of the client.  This
        # must be done even if we have local storage.
        ipaddr=
        if [ "$HOSTNAME" = "localhost" -o "$HOSTNAME" = "localhost.localdomain" ]; then
                ipaddr=$(ip addr show to 0.0.0.0/0 scope global | awk '/[[:space:]]inet / { print gensub("/.*","","g",$2) }')
                for ip in $ipaddr ; do
                        HOSTNAME=
                        eval $(ipcalc -h $ip 2>/dev/null)
                        [ -n "$HOSTNAME" ] && { hostname ${HOSTNAME} ; break; }
                done
        fi

# code ...

    # Reread in network configuration data.
    if [ -f /etc/sysconfig/network ]; then
        . /etc/sysconfig/network

        # Reset the hostname.
        action $"Resetting hostname ${HOSTNAME}: " hostname ${HOSTNAME}
    fi
复制代码

0.12.2. hadoop 3.0 与 2.0 的异同

官方介绍: hadoop.apache.org/docs/r3.0.0…

1 端口变化

Namenode ports: 50470 –> 9871, 50070 –> 9870, 8020 –> 9820
Secondary NN ports: 50091 –> 9869, 50090 –> 9868
Datanode ports: 50020 –> 9867, 50010 –> 9866, 50475 –> 9865, 50075 –> 9864
复制代码

2 节点配置文件由slaves改为了workers

3 Hadoop3.0最低支持 Java 8

0.13. 问题与解决

问题:

虽然 hadoop 启动了,但 Jps 不显示 hadoop 进程信息。

解决:

使用hdfs namenode -format格式化namenode时,会在namenode数据文件夹中保存一个current/VERSION文件,记录clusterID,而datanode中保存的current/VERSION文件中的clustreID的值是第一次格式化保存的clusterID,再次进行格式化时,就会生成新的clusterID,并保存在namenode的current/VERSION文件中,从而datanode和namenode之间的ID不一致。导致上述结果!

修改NameNode的VERSION文件的clusterID的值。 namenode节点的路径:/解压路径/hadoop/tmp/dfs/name/current datanode节点的路径:/解压路径/hadoop/tmp/dfs/data/current/ more VERSION,可发现,datanode的clustreID与其他3台datanode的clustreID不同。 vim VERSION修改clusterID的值与DataNode相同即可,并启动。

问题:

Couldn't find datanode to write file. Forbidden

hadoop 3.0 集群部署,超详细-Ali0th

解决:

由于多次格式化hdfs,导致格式化hdfs的时候失败(提示Reformat Y or N,输入了Y也不能格式化成功),可能会导致namenode无法启动,所以如果要重新格式化。清空 hadoop.tmp.dir配置项路径下的tmp和logs 即可。

rm -rf (文件夹路径)/*

rm -rf /usr/local/hadoop/data/*
rm -rf /usr/local/data/hadoop/name/*
rm -rf /usr/local/data/hadoop/data/*
复制代码

重新启动后,发现问题依旧存在。

使用 hdfs dfsadmin -report 检查。

[root@master hadoop]# hdfs dfsadmin -report
Configured Capacity: 0 (0 B)
Present Capacity: 0 (0 B)
DFS Remaining: 0 (0 B)
DFS Used: 0 (0 B)
DFS Used%: 0.00%
Replicated Blocks:
	Under replicated blocks: 0
	Blocks with corrupt replicas: 0
	Missing blocks: 0
	Missing blocks (with replication factor 1): 0
	Low redundancy blocks with highest priority to recover: 0
	Pending deletion blocks: 0
Erasure Coded Block Groups: 
	Low redundancy block groups: 0
	Block groups with corrupt internal blocks: 0
	Missing block groups: 0
	Low redundancy blocks with highest priority to recover: 0
	Pending deletion blocks: 0
复制代码

使用 tail -n 10 logs/hadoop-hadoop-datanode-slave1.log 查看 slave1 的日志。

[root@slave1 hadoop]# tail -n 10 logs/hadoop-hadoop-datanode-slave1.log 
2019-04-18 02:18:15,895 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: localhost.localdomain/127.0.0.1:9000. Already tried 4 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
2019-04-18 02:18:16,896 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: localhost.localdomain/127.0.0.1:9000. Already tried 5 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
2019-04-18 02:18:17,900 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: localhost.localdomain/127.0.0.1:9000. Already tried 6 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
2019-04-18 02:18:18,904 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: localhost.localdomain/127.0.0.1:9000. Already tried 7 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
2019-04-18 02:18:19,906 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: localhost.localdomain/127.0.0.1:9000. Already tried 8 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
2019-04-18 02:18:20,788 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: RECEIVED SIGNAL 15: SIGTERM
2019-04-18 02:18:20,792 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down DataNode at slave1/192.168.192.165
************************************************************/
复制代码

发现 slave1 连接不上 master,发现是因为 slave1 以为 localhost.localdomain 才是 master,发现 slave1 的配置文件中, core-site.xml 如下,配置是 hdfs://localhost.localdomain:9000

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost.localdomain:9000</value>
        <description>hdfs内部通讯访问地址</description>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/usr/local/data/hadoop/tmp</value>
    </property>
</configuration>
复制代码

原来是配置没有分发成功,重新进行分发即可。

问题:

Permission denied: user=dr.who, access=WRITE, inode="/":root:supergroup:drwxr-xr-x

解决:

hadoop fs -chmod 777 /
复制代码

问题:

Couldn't upload the file 从人工智能到TensorFlow.pdf.

解决:

应该是在别的机子访问时,没有配置host地址解析造成的。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Text Processing in Python

Text Processing in Python

David Mertz / Addison-Wesley Professional / 2003-6-12 / USD 54.99

Text Processing in Python describes techniques for manipulation of text using the Python programming language. At the broadest level, text processing is simply taking textual information and doing som......一起来看看 《Text Processing in Python》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

SHA 加密
SHA 加密

SHA 加密工具