Hadoop入门mac系统下搭配运行环境(三)集群搭建1、

1、编写集群分发脚本xsync

1.1、scp安全拷贝

  • (1)定义

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

  • (2)基本语法
scp -r $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 递归 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
  • (3)案例实操
    • a)在hadoop102上,将hadoop102中/opt/module目录下的软件拷贝到hadoop103上
scp -r /opt/module 自定义的用户名@hadoop103:opt/module
复制代码
    • b)在hadoop102上,将hadoop103服务器上的/opt/module目录下的软件拷贝到hadoop102上
scp -r 自定义的用户名@hadoop103:/opt/module 自定义的用户名@hadoop102:/opt/module
复制代码
    • c)在hadoop102上操作将hadoop103中/opt/module目录下的软件拷贝到hadoop104上
scp -r 自定义用户名@hadoop103:/opt/module 自定义的用户名@hadoop104:opt/module
复制代码

注意:拷贝过来的/opt/module目录,别忘了在hadoop102hadoop103hadoop104上修改所\color{FF0000}{注意:拷贝过来的/opt/module目录,别忘了在hadoop102、hadoop103、hadoop104 上修改所}


有文件的,所有者和所有者组。sudochown 自定义用户名:自定义用户名R/opt/module\color{FF0000}{有文件的,所有者和所有者组。sudo chown 自定义用户名:自定义用户名 -R /opt/module}

    • d)将hadoop102中/etc/profile文件拷贝到hadoop103的/etc/profile上。
scp /etc/profile.d/* 自定义用户名@hadoop103:/etc/profile.d
复制代码
    • e)将hadoop104/etc/profile文件拷贝到hadoop103的/etc/profile上。
scp 自定义用户名@hadoop104/etc/profile.d 自定义用户@hadoop103/etc/profile
复制代码

1.2、rsync远程 同步工具

rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
(1)基本语法

rsync -av $pdir/$fname $user@hadoop$host:$dir$fname
命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
选项参数说明
选项 功能
-a 归档拷贝
-v 显示复制过程

(2)案例实操(注意用户本机执行的用户就会默认到拷贝的目的机目录)

rsync -av /opt/software hadoop103:opt/software
复制代码

1.3、xsync集群分发脚本

  • (1)需求:循环复制文件到所有节点相同目录下
  • (2)需求分析:

rsync命令的原始拷贝

rsync -av /opt/module 自定义用户名@hodaoop103:/opt/module
复制代码
  • (3)期望脚本

xsync要同步的文件名称在/opt/module/hadoop-3.1.3/bin这个目录下存放的脚本,自定义用户可以在系统任何地方直接执行。

  • (4)脚本实现
vim /opt/module/hadoop-3.1.3/bin/xsync
复制代码

在该文件中编辑shell脚本如下:

#!/bin/bash
#1、判断参数个数
if [ $# -lt 1 ]
then
    echo Not Enough Argument!
    exit;
fi
#2、遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
do
echo ==================$host=============================
    #3、遍历所有目录、挨个发送
    for file in $@
    do
        if [ -e $file ]
        then
            #5、获取父目录
            pdir=$(cd -P $(dirname $file); pwd)
            #6、获取当前文件的名称
            fname=$(basname $file)
            ssh $host "mkdir -P $pdir"
            rsync -av $pdir/$fname $host:$pdir
        else
            echo $file does not exists!
    done
done
复制代码

修改脚本 xsync 具有执行权限

chmod u+x xsync
复制代码

1.4、SSH无密登录配置

1.4.1 配置ssh

(1)基本语法
ssh另一台电脑的ip地址
(2)ssh连接时出现Host key verification failed的解决方法

ssh hadoop103
复制代码

会出现需要登录密码

(3)无密钥配置

  • 1)生成公钥和私钥

ssh-keygen -t rsa

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

  • 3)将公钥拷贝到要免密登录的目标机器上(注意自己本身机器也需要拷贝一份不同用的公私钥匙不同的)

ssh-copy-id hadoop102

ssh-copy-id hadoop103

ssh-copy-id hadoop104

1.5、集群配置

1.5.1、集群部署规划

注意:NameNode和SecondaryNameNode不要安装在同一台服务器

注意:ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置在同一台机器上。

  server hadoop102 hadoop103 hadoop104
HDFS  NameNodeDataNode  DataNode SecondaryNameNodeDataNode
YARN  NodeManager ResourceManagerNodeManager  NodeManager

1.5.2、修改集群的配置文件

  • 1)核心配置文件(core-site.xml)
cd $HADOOP_HOME/etc/hadoop
vim core-site.xml
复制代码

以下内容放置到<configuration></configuration>标签中

<configuration>
<!--指定HDFS中NameNode的地址-->
<property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop102:8020</value>
</property>
<!--指定Hadoop运行时产生文件的存储目录-->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!--通过web界面操作hdfs的权限-->
<property>
        <name>hadoop.http.staticuser.user</name>
        <value>atguigu</value>
</property>
< !--后面hive的兼容性配置-->
    <property>
        <name>hadoop.proxyuser.atguigu.hosts</name>
        <value></value>
    </property>
    <property>
        <name>hadoop.proxyuser.atguigu.groups</name>
        <value></value>
</property>
</configuration>
复制代码

2)HDFS配置文件配置(hdfs-site.xml)

vim hdfs-site.xml
复制代码

以下内容放置到<configuration></configuration>标签中

<configuration>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop104:9868</value>
    </property>
</configuration>
复制代码

3)YRAN配置文件(yarn-site.xml)

vim yarn-site.xml
复制代码

以下内容放置到<configuration></configuration>标签中

<configuration>
<!--Reducer获取数据的方式-->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
</property>
<!--*指定YARN的ResourceManager的地址-->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop103</value>
</property>
<!-- 环境变量通过从NodeManagers的容器继承的环境属性,对于mapreduce应用程序,除了默认值 hadoop op_mapred_home应该被添加外。属性值 还有如下-->
    <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>
<!--解决Yarn在执行程序遇到超出虚拟内存限制,Container被kill-->
    <property>
        <name>yarn.nodemanager.pmem-check-enabled</name>
        <value>false</value>
    </property>
    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>
<!--后面hive的兼容性配置** **-->
    <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>
</configuration>
复制代码

4)、MapReduce配置文件(配置mapred-site.xml)

vim mapred-site.xml
复制代码

以下内容放置到<configuration></configuration>标签中

<configuration>
<!-- 指定MR运行在Yarn上 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>
复制代码

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

xsync /opt/module/hadoop-3.1.3/etc/hadoop
复制代码

1.5.4、分发完成之后查看一下配置其他机器是否正常

cat /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml
复制代码

1.5.4、 配置workers

vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
复制代码

文件内容中配置如下:(该文件中添加的内容结尾不允许有空格,文件中不允许有空行)

hadoop 102

hadoop 103

hadoop 104

同步所有节点配置文件

xsync /opt/module/hadoop-3.1.3/etc
复制代码

1.6、群起集群

1.6.1、启动集群

(1)如果集群是第一次启动,需要在hadoop102节点格式化NameNode(注意格式化之前,一定要先停止上次启动的所有namenode和datanode进程,然后再删除data和log数据)

hdfs namenode -format
复制代码

(2)、启动HDFS

sbin/start-dfs.sh
复制代码

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

sbin/start-yarn.sh
复制代码

(4)Web端查看SecondaryNameNode

image.png
如果页面看不到信息是由于hadoop的3版本的js文件需要修改解决的方法如下:

vim $HADOOP_HOME/share/hadoop/hdfs/webapps/static
复制代码

找到61行(vim 设置行号 set nu 找用 61 按下G)如下代码:

'date_tostring' : function (v) {
      return moment(Number(v)).format('ddd MMM DD HH:mm:ss ZZ YYYY');
},
复制代码

需要修改为

'date_tostring' : function (v) {=
  return new Date(Number(v)).toLocaleString();
},
复制代码

1.6.2、 集群基本测试

image.png

  • 3)新键一个目录为input
  • 4)进入input目录上传新建的文件

image.png
-5)到hadoop的根目录中执行如下命令(注意如果存在了output则需要删除或者命名为output2)

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
复制代码

-6)是否执行成功可以到改链接去查看

1.6.3、集群启动停止方式总结

(1)各个服务组件逐一启动/停止

  • 1)分别启动/停止HDFS组件
hdfs --daemon start namenode
hdfs --daemon start datanode
hdfs --daemon start secondarynamenode

hdfs --daemon stop namenode
hdfs --daemon stop datanode
hdfs --daemon stop secondarynamenode
复制代码

(2)各个模块分开启动/停止(配置ssh是前提)

常用\color{#FF0000}{常用}

  • 1)整体启动/停止HDFS
start-dfs.sh
stop-dfs.sh
复制代码
  • 2)整体启动/停止YARN
start-yarn.sh
stop-yarn.sh
复制代码

-)用脚本群起集群并且把改脚本配置环境变量方便使用或者放到/opt/module/hadoop-1.3.1/bin

cd /opt/module/haddop-1.3.1/bin
vim mycluster
复制代码
#!/bin/bash
if [ $# -ne 1 ]
    then
        echo "args number error!"
        exit
fi
case $1 in
"start")
    ssh hadoop102 start-dfs.sh
    ssh haddop103 start-yarn.sh
    ;;
"stop")
    ssh hadoop102 stop-dfs.sh
    ssh hadoop103 stop-yarn.sh
    ;;
*)
    echo "args info error!"
    exit
    ;;
esac
复制代码

1.7、配置历史服务器

为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下:

(1)配置mapred-site.xml

vim $HADOOP_HOME/etc/hadoop/mapred-site.xml
复制代码

在该文件将以下内容添加到标签中

<!-- 历史服务器端地址 -->
<property>
    <name>mapreduce.jobhistory.address</name>
    <value>hadoop102:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>hadoop102:19888</value>
</property>
复制代码

(2)分发配置

xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
复制代码

(3)用于配置的是102需要到hadoop102启动历史服务器

mapred --daemon start historyserver
复制代码

(4)查看历史服务器是否启动

jps
复制代码

(5)查看JobHistory

http://hadoop102:19888

1.8、配置日志的聚焦

日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
image.png
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。

注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryServer。
开启日志聚集功能具体步骤如下:

(1)配置yarn-site.xml

vim yarn-site.xml
复制代码

在该文件将以下内容添加到标签中

<!-- 开启日志聚集功能 -->
<property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>  
    <name>yarn.log.server.url</name>  
    <value>http://hadoop102:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>604800</value>
</property>
复制代码

(2)分发配置

xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml
复制代码

(3)关闭NodeManager、ResourceManager和HistoryServer

stop-yarn.sh
mapred --daemon historyserver
复制代码

(4)再次启动nodeMangr、ResourceManger和HistoryServer

start-yarn.sh
mapred --daemon historyserver
复制代码

(5)删除HDFS上已经存在的输出文件

hadoop fs -rm -r /output
复制代码

(6)执行WordCount程序

hadoop jar $HADOOP_HOME/shar/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
复制代码

(7)查看日志

  • 1)历史查看服务器地址


http://hadoop102:19888

  • 2)查看日志列表

image.png

  • 3)查看运行日志

image.png

  • 4)查看日志详情

image.png

1.9、集群启动/停止方式总结再次优化集群群起脚本

(1)各个模块分开启动/停止(配置ssh是前提)常用

  • 1)整体启动/停止HDFS
start-dfs.sh
stop-dfs.sh
复制代码
  • 2)整体启动/停止YARN
start-yarn.sh
stop-yarn.sh
复制代码

(2)各个服务组件逐一启动/停止

  • 1)分别启动/停止HDFS组件
hdfs --daemon start namenode
hdfs --daemon stop namenode
hdfs --daemon start secondarynamenode
复制代码
  • 2)启动/停止YARN
yarn --daemon start resouremager
yarn --daemon stop resourcemanger
yarn --daemon start nodemanger
yarn --daemon stop nodemanger
复制代码
  • 3)启动/停止 historySserver日志服务器
mapred --daemon start hsitoryserver
mapred --daemon stop historyserver
复制代码

2.0、编写Hadooop集群常用脚本

(1)HadoopHadoop集群启停脚本(包含HDFS,Yarn,Historyserver):myculster

vim $HADOOP_HONE/bin/myculster
复制代码

内容修改

#!/bin/bash
if [ $# -ne 1 ]
    then
        echo "args number error!"
        exit
fi
case $1 in
"start")
    ssh hadoop102 start-dfs.sh
    ssh hadoop103 start-yarn.sh
    ssh hadoop102 mapred --daemon start historyserver
    ;;
"stop")
    ssh hadoop102 stop-dfs.sh
    ssh hadoop103 stop-yarn.sh
    ssh hadoop102 mapred --daemon stop historyserver
    ;;
*)
    echo "args info error!"
    exit
    ;;
esac
复制代码

(2)保存后退出给权限

chmod u+x mycluster
复制代码

(3)查看三台服务器的Java进程用脚本实现

vim #HADOOP_HOME/bin jpsall
复制代码

she脚本如下

#!/bin/bash
for in hadoop102 hadoop103 hadoop104
do
echo ===================$host=============================
ssh $host jps
done
复制代码

(4)保存之后给于权限

chomd u+x jpsall
复制代码

2.1、常用端口号说明

端口说明 Hdaoop3.X
NameNode内部通信端口 8020 / 9000/9820
NameNode HTTP UI 9870
MapReduce查看执行任务端口 8088
历史服务器通信端口 19888

2.2、集群时间同步

如果服务器在公网环境(能连接外网),可以不采用集群时间同步,因为服务器会定期和公网时间进行校准;
如果服务器在内网环境,必须要配置集群时间同步,否则时间久了,会产生时间偏差,导致集群执行任务时间不同步。

(1)需求

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

image.png
(2)时间服务器配置(必须root用户)

#如果是使用普通用户需要命令前面加sudo
#查看时间服务状态
sudo systemctl status ntpd
#开启时间服务
sudo systemctl start ntpd
sudo systemctl is-enabled ntpd
复制代码

(3)修改hdoop102的ntp.conf配置文件(因为是用hadoop102机器作为时间服务器)
修改内容如下

  • 1)修改1(授权192.168.10.0-192.168.10.255网段上的所有机器可以从这台机器上查询和同步时间)
#restrict 192.168.10.0 mask 255.255.255.0 nomodify notrap
修改为
restrict 192.168.10.0 mask 255.255.255.0 nomodify notrap
复制代码
  • 2)集群在局域网中,不使用其他互联网上的时间
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 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
复制代码

-3)当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步(直接添加如下)

server 127.127.1.0
fudge 127.127.1.0 stratum 10
复制代码

-4)修改hadoop102的/etc/sysconfig/ntpd文件并增加一下内容

sudo vim /etc/sysconfig/ntpd
复制代码
SYNC_HWCLOCK=yes
复制代码
  • 5)重启服务 ntpd服务
sudo systemctl start ntpd
复制代码

-6)设置开机自动启动

sidp systemctl enable btpd
复制代码

(4)其他机器配置(必须root用户)

  • 1)关闭其他所有节点ntp服务和自启动(例如 103 104节点)
sudo systemctl stop ntpd
sudo systemctl disable ntpd
复制代码
  • 2在其他机器配置1分钟与时间服务器内同步一次
sudo crontab -e
复制代码
*/ * * * * sudo /usr/sbin/ntpdate hadoop102
复制代码
  • 3)检测是否修改任意时间之后每秒种会同步时间服务器时间
sudo date -s "2011-11-11 11:11:11"
#等一分钟后之后查看一下时间是否同步的是时间服务器
sudo date
复制代码