【大数据】☀️搞定Hadoop集群☀️Hadoop运行模式-完全分布式

目录 

三大模式:

完全分布式搭建:

分析:

编写集群分发脚本xsync:

1.scp(secure copy)安全拷贝:

2.rsync远程同步工具:

3.xsync集群分发脚本:

SSH无密登录配置:

配置SSH:

1.基本语法:

2.ssh连接时出现Host key verification failed的解决办法:

无密钥配置:

1.免密钥登录原理:

2.生成公钥和私钥:

3.将公钥拷贝到需要免密码登录的目标机器:

集群配置:

集群部署规划:

注意:

配置文件说明:

默认配置文件:

自定义配置文件:

配置集群:

核心配置文件:

HDFS配置文件:

YARN配置文件:

MapReduce配置文件:

在集群上分发配置好的Hadoop配置文件:

查看分发配置好的Hadoop文件:

群起集群:

配置workers

启动集群:

测试集群:

上传文件到集群:

上传文件后查看文件放在什么位置:

拼接:

下载:

执行:

集群启动/停止方式总结:

重新格式化集群操作:

配置历史服务器:

配置mapred-site.xml:

在hadoop02启动历史服务器:

配置日志的聚集:

配置yarn-site.xml

集群时间同步:

集群启动/停止脚本:

问题解决:

查看三台服务器Java进程:jpsall脚本

常用端口说明:


官网:Apache Hadoop

三大模式:

本地模式:数据存储在Linux服务器本地 伪分布式:数据存储在HDFS 完全分布式:数据存储在HDFS/多态服务器工作

完全分布式搭建:

分析:

准备三台客户机(关闭防火墙、静态IP、主机名称) 安装JDK 配置环境变量 配置集群 单点启动 配置SSH 群起并测试集群

编写集群分发脚本xsync:

1.scp(secure copy)安全拷贝:

scp定义:

scp可以实现服务器和服务器之间恶的数据拷贝(from server1 to server2)

scp基本语法:

scp -r $pdir/$fname $user@host:$pdir/$fname

命令 递归 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称

scp -r jdk1.8.0_212/ root@192.168.10.102:/opt/module/

scp -r root@192.168.10.101:/opt/module/hadoop-3.1.3 ./

scp -r root@hadoop02:/opt/module/* root@hadoop04:/opt/module/

2.rsync远程同步工具:

rsync主要用于备份和镜像。速度快、避免赋值相同内容和支持符号连接 rsync和scp主要区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。

基本语法:

rsync -av $pdir/$fname $user@host:$pdir/$fname

命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称

选项

功能

-a

递归拷贝

-v

显示复制过程

3.xsync集群分发脚本:

循环复制文件到所有节点的相同目录下 脚本命令:xsunc 要同步的文件名 脚本要在任何路径下都可以使用(脚本放在声明了全局变量的路径)

进入/root/bin目录:

/root/bin目录下创建脚本

脚本实现:

#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
  echo Not Enough Arguement!
  exit;
fi
#2. 遍历集群所有机器
for host in hadoop02 hadoop03 hadoop04
do
  echo ====================  $host  ====================
  #3. 遍历所有目录,挨个发送
  for file in $@
  do
    #4 判断文件是否存在
    if [ -e $file ]
    then
      #5. 获取父目录
      pdir=$(cd -P $(dirname $file); pwd)
      #6. 获取当前文件的名称
      fname=$(basename $file)
      ssh $host "mkdir -p $pdir"
      rsync -av $pdir/$fname $host:$pdir
    else
      echo $file does not exists!
    fi
  done
done

赋予脚本可执行权限:

chmod 777 xsync

分发脚本文件:

xsync bin/

分发配置文件:(同步环境变量)

xsync /etc/profile.d/my_env.sh

sudo ./bin/xsync /etc/profile.d/my_env.sh

source /etc/profile:刷新资源


SSH无密登录配置:

配置SSH:

1.基本语法:

ssh 另外一台电脑的ip地址

2.ssh连接时出现Host key verification failed的解决办法:

The authenticity of host '192.168.1.103 (192.168.1.103)' can't be established.
RSA key fingerprint is cf:1e:de:d7:d0:4c:2d:98:60:b4:fd:ae:b1:2d:ad:06.
Are you sure you want to continue connecting (yes/no)? 

直接输入yes

无密钥配置:

1.免密钥登录原理:

2.生成公钥和私钥:

进入root家目录:cd /root

查看所有文件(包括隐藏文件):ll -a

进入cd .ssh目录

ssh-keygen -t rsa

然后敲(三个回车),就会生成两个文件id rsa(私钥)、id rsa.pub(公钥)

3.将公钥拷贝到需要免密码登录的目标机器:

ssh-copy-id hadoop02

ssh-copy-id hadoop03

ssh-copy-id hadoop04

注意:使用root账户(不同的账户)需要重新配置免密码登录

配置完成后,执行xsync命令时,不需要再次输入密码:


集群配置:

集群部署规划:

注意:

NameNode和SecondaryNode不要安装在一台服务器,这两个占用内存资源较大。 ResourceManager也很消耗内存,不要和NameNode和SecondaryNode配置在同一台机器上。

Hadoop02

Hadoop03

Hadoop04

HDFS

NameNode、DataNode

DataNode

SecondaryNameNode、DataNode

YARN

NodeManager

ResourceManager、NodeManager

NodeManager

配置文件说明:

Hadoop配置文件分为两大类:默认配置文件和自定义配置文件,只有用户想修改某一默认配置值时,才需要修改自定义配置文件,更改响应的属性。

默认配置文件:

文件名

文件存放在Hadoop的jar包中位置

【core-default.xml】

hadoop-common-3.1.3.jar/core-default.xml

【hdfs-default.xml】

hadoop-hdfs-3.1.3.jar/hdfs-defalut.xml

【yarn-default,xml】

hadoop-yarn-common-3.1.3.jar/yarn-default.xml

【mapred-default.xml】

hadoop-mapreduce-client-core-3.1.3.jar/mapred-default.xml

自定义配置文件:

core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四个配置文件存放在$HADOOP_HOME/etc/hadoop这个路径上,用户可以根据项目需求重新进行修改配置。

配置集群:

核心配置文件:

配置core-site.xml

cd $HADOOP_HOME/etc/hadoop
vim core-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>

		<!--指定NameNode的地址-->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop02:8020</value>
    </property>

		<!--指定Hadoop数据的存储目录-->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-3.1.3/data</value>
    </property>

    <property>
        <name>hadoop.proxyuser.atguigu.hosts</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.atguigu.groups</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>atguigu</value>
    </property>
  
</configuration>

HDFS配置文件:

配置hdfs-site.xml

vim hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
  
  	<!--nn web端访问地址-->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop02:9870</value>
    </property>
  
  	<!--2nn web端访问地址-->
  	<property>
    		<name>dfs.namenode.secondary.http-address</name>
        <value>hadoop04:9868</value>
  	</property>
  
</configuration>

YARN配置文件:

配置yarn-site.xml

vim yarn-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
  
  	<!--指定MR走shuffle-->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
  
  	<!--指定ResourceManager的地址-->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop03</value>
    </property>
  
    <!--环境变量的继承(3.1.3的Bug后续版本中可以不用进行配置)-->
    <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>
    <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>512</value>
    </property>
    <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>4096</value>
    </property>
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>4096</value>
    </property>
    <property>
        <name>yarn.nodemanager.pmem-check-enabled</name>
        <value>false</value>
    </property>
    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>
</configuration>

MapReduce配置文件:

配置Mapred-site.xml

vim mapred-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
  
  	<!--指定MapReduce程序运行在Yarn上-->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>

    <!-- 历史服务器端地址 -->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop02:10020</value>
    </property>

    <!-- 历史服务器web端地址 -->
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop02:19888</value>
    </property>

</configuration>

在集群上分发配置好的Hadoop配置文件:

/opt/module/hadoop-3.1.3/etc:进入hadoop配置文件目录

xsync hadoop/:分发文件

查看分发配置好的Hadoop文件:

cat /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml

群起集群:

配置workers

vim /opt/module/hadoop-3.1.3/etc/hadoop/workers

注意:在编写配置这个配置文件时,不能有空格,或者空行!!!

hadoop02
hadoop03
hadoop04

cd /opt/module/hadoop-3.1.3/etc/hadoop

xsync workers:分发配置文件,同步所有节点的配置文件

启动集群:

如果集群是第一次启动,需要在hadoop02节点格式化NameNode(注意:格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到以往数据。如果集群在运行过程中报错,需要重新格式化NameNode的话,一定要先停止nameNode和dataNode进程,并且要删除所有机器的data和logs目录,然后再进行格式化)

/opt/module/hadoop-3.1.3:进入hadoop目录

hdfs namenode -format:格式化操作

格式化完成后会多出data、logs目录:

/opt/module/hadoop-3.1.3/sbin

sbin/star-dfs.sh:启动HDFS

问题解决:

启动出现以下问题

[root@localhost sbin]# start-all.sh
Starting namenodes on [hadoop]
ERROR: Attempting to operate on hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.
Starting datanodes
ERROR: Attempting to operate on hdfs datanode as root
ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation.
Starting secondary namenodes [hadoop]
ERROR: Attempting to operate on hdfs secondarynamenode as root
ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation.
2018-07-16 05:45:04,628 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Starting resourcemanager
ERROR: Attempting to operate on yarn resourcemanager as root
ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Aborting operation.
Starting nodemanagers
ERROR: Attempting to operate on yarn nodemanager as root
ERROR: but there is no YARN_NODEMANAGER_USER defined. Aborting operation.

vim /etc/profile:进入配置文件

加入以下内容:

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

source /etc/profile:刷新配置文件

jps:查看运行

程序启动后,通过web浏览器访问:

http://192.168.10.101:9870/dfshealth.html#tab-overview

注意:

如果web浏览器不能访问页面,注意以下操作:

防火墙是否打开,端口号是否开发 主机地址是否配置正确

在配置了ResourceManager的节点(hadoop103)启动YARN

sbin/start-yarn.sh

问题解决:

ERROR: Attempting to operate on yarn resourcemanager as root
ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Aborting operation.

出现以上报错信息需要到 sbin 目录下 更改 start-yarn.sh 和 stop-yarn.sh 信息,在两个配置文件的第一行添加:

YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

最后再输入命令 /sbin/start-yarn.sh 启动 yarn

使用web浏览器访问:http://192.168.10.102:8088/cluster

hadoop fs -mkdir /wcinput:创建目录

测试集群:

上传文件到集群:

hadoop fs -mkdir /wcinput(Hadoop目录):创建一个文件目录

hadoop fs -put wcinput/demo.txt(文件) /wcinput(Hadoop目录):上传文件到Hadoop

上传文件后查看文件放在什么位置:

1.查看HDFS文件储存位置:

/opt/module/hadoop-3.1.3/data/dfs/data/current/BP-433336804-192.168.10.101-1628733575726/current/finalized/subdir0/subdir0

2.使用cat命令可以查看文件内容

拼接:

cat 文件名 >> 映射文件.jar

tar -zxvf 文件名.jar

下载:

/opt/module/hadoop-3.1.3:进入hadoop主目录

bin/hadoop fs -get 文件名 存放路径

执行:

/opt/module/hadoop-3.1.3:进入hadoop主目录

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput /wcoutput

集群启动/停止方式总结:

jps:查看当前hadoop进程

cd /opt/module/hadoop-3.1.3:进入hadoop主目录

sbin/star-dfs.sh:启动hdfs(在hdfs启动的那台服务器上执行)

sbin/start-yarn.sh:启动yarn(在yarn启动的那台服务器上执行)

cd /opt/module/hadoop-3.1.3:进入hadoop主目录

sbin/stop-yarn.sh:停止yarn(在yarn启动的那台服务器上执行)

sbin/stop-dfs.sh:停止hdfs(在hdfs启动的那台服务器上执行)

重新格式化的时候必须删除每一台服务器上的data和logs再进行格式化

/opt/module/hadoop-3.1.3:进入hadoop目录

hdfs namenode -format:格式化操作

重新格式化集群操作:

1.删除所有节点的data和logs:

rm -rf 文件夹名称:递归删除

2.停止所有节点上的服务:

3.重新格式化服务器:

4.重新启动服务:

配置历史服务器:

为了查看程序的历史运行情况,需要配置一下历史服务器!

配置mapred-site.xml:

cd /opt/module/hadoop-3.1.3/etc/hadoop:进入目录

vim mapred-site.xml

<!-- 历史服务器端地址 -->
<property>
    <name>mapreduce.jobhistory.address</name>
    <value>hadoop02:10020</value>
</property>

<!-- 历史服务器web端地址 -->
<property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>hadoop02:19888</value>
</property>

xsync mapred-site.xml:分发配置好的文件到各个节点服务器上

重新启动yarn:

sbin/stop-yarn.sh

sbin/start-yarn.sh

在hadoop02启动历史服务器:

cd /opt/module/hadoop-3.1.3:进入hadoop主目录

bin/mapred --daemon start historyserver:启动历史服务器

mapred --daemon stop historyserver:停止历史服务器

配置日志的聚集:

日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。

日志聚集功能好处:可以方便的查看到程序运行情况,方便开发调试。

注意:开启日志聚集功能,需要重启NodeManager、ResourceManager、HistoryManager

配置yarn-site.xml

<property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
</property>
<property>  
    <name>yarn.log.server.url</name>  
    <value>http://${yarn.timeline-service.webapp.address}/applicationhistory/logs</value>
</property>
<property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>604800</value>
</property>
<property>
    <name>yarn.timeline-service.enabled</name>
    <value>true</value>
</property>
<property>
    <name>yarn.timeline-service.hostname</name>
    <value>${yarn.resourcemanager.hostname}</value>
</property>
<property>
    <name>yarn.timeline-service.http-cross-origin.enabled</name>
    <value>true</value>
</property>
<property>
    <name>yarn.resourcemanager.system-metrics-publisher.enabled</name>
    <value>true</value>
</property>

分发到各个节点上,重启服务!!!

集群时间同步:

如果服务器在公网环境(能连接外网),可以不采用集群时间同步,因为服务器会定期和公网时间进行校准;

如果服务器在内网环境,必须要配置集群时间同步,否则时间久了,会产生时间偏差,导致集群执行任务时间不同步。

找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,生产环境根据任务对时间的准确程度要求周期同步。测试环境为了尽快看到效果,采用1分钟同步一次。

集群启动/停止脚本:

cd root/bin:进入bin目录

vim myhadoop.sh:创建脚本文件

#!/bin/bash

if [ $# -lt 1 ]
then
    echo "No Args Input..."
    exit ;
fi

case $1 in
"start")
        echo " =================== 启动 hadoop集群 ==================="

        echo " --------------- 启动 hdfs ---------------"
        ssh hadoop02 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
        echo " --------------- 启动 yarn ---------------"
        ssh hadoop03 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
        echo " --------------- 启动 historyserver ---------------"
        ssh hadoop02 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
        echo " =================== 关闭 hadoop集群 ==================="

        echo " --------------- 关闭 historyserver ---------------"
        ssh hadoop02 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
        echo " --------------- 关闭 yarn ---------------"
        ssh hadoop03 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
        echo " --------------- 关闭 hdfs ---------------"
        ssh hadoop02 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
    echo "Input Args Error..."
;;
esac

chmod 777 myhadoop.sh:赋予脚本执行权限

问题解决:

[root@hadloop2 hadoop-3.3.0]# sbin/start-dfs.sh 
Starting namenodes on [hadoop2]
ERROR: Attempting to operate on hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.
Starting datanodes
ERROR: Attempting to operate on hdfs datanode as root
ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation.
Starting secondary namenodes [hadoop1]
ERROR: Attempting to operate on hdfs secondarynamenode as root
ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation.

cd $HADOOP_HOME:进入Hadoop主目录

对于start-dfs.sh和stop-dfs.sh文件,添加下列参数:
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root  
对于start-yarn.sh和stop-yarn.sh文件,添加下列参数:
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

查看三台服务器Java进程:jpsall脚本

#!/bin/bash

for host in hadoop02 hadoop03 hadoop04
do
        echo =============== $host ===============
        ssh $host jps 
done

常用端口说明:

端口名称

Hadoop2.X

Hadoop3.X

NameNode内部通信端口

8020/9000

8020/9000/9820

NameNode HTTP UI(对用户的查询端口)

50070

9870

MapReduce查看执行任务端口

8088

8088

历史服务器通信端口

19888

19888

来源url
栏目