hadoop集群搭建
1.准备虚拟机
1.准备一台最小化安装的虚拟机
2.修改配置文件
vi /etc/sysconfig/network-scripts/ifcfg-env33
onboot=yes
网卡接口配置
ONBOOT是指明在系统启动时是否激活网卡,只有在激活状态的网卡才能去连接网络,进行网络通讯
修改临时id
注意:新创建虚拟机不能使用vim,需要yum云安装
说清楚情况阿,一般linux默认不带vim的,都是vi。。。vim需要自己安装
3.重启network服务
systemctl restart network
4.获取IP地址(图形化界面连接)
ip addr show
ifconfig
5.连接fianlshell
6.下载linux系统环境
[root@hadoop100 ~]# yum install -y epel-release
[root@hadoop100 ~]# yum install -y psmisc nc net-tools rsync vim lrzsz ntp libzstd openssl-static tree iotop git
----使用yum安装需要虚拟机可以正常上网,yum安装前可以先测试下虚拟机联网情况
[root@hadoop100 ~]# ping www.baidu.com
PING www.baidu.com (14.215.177.39) 56(84) bytes of data.
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=1 ttl=128 time=8.60 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=2 ttl=128 time=7.72 ms
7.创建新用户并修改用户密码
useradd atguigu
passwd atguigu
8.修改atguigu用户权限(方便执行root权限的命令 加sudo)
vim /etc/sudoers
或者 visudo
atguigu ALL=(ALL) NOPASSWD:ALL
设置 普通用户具有root权限 并且设置无密码登录
id atguigu 查看用户所属组
9.在atguigu下创建两个文件夹并修改所属主和所属组
/opt 系统分配的安装目录
module 解压安装目录
software jar包安装位置
同一目录下创建多个文件夹 空格直接加路径
创建多级目录 -P
递归修改所属权 -R
mkdir /opt/module /opt/software
chown -R atguigu:atguigu /opt/module /opt/software
10.关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
11.修改本机静态IP
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.159.102
UUID=14a6ebe4-ae2e-44b3-bb14-1340cdc82a00
PREFIX=24
GATEWAY=192.168.159.2
DNS1=192.168.159.2
BOOTPROTO=static
IPADDR=192.168.159.102 ip地址
PREFIX=24 255.255.255.0
GATEWAY=192.168.159.2 网关
DNS1=192.168.159.2 解析域名
12.修改静态hostname
hostnamectl --static set-hostname hadoop102
vim /etc/hostname
hadooop102
13.修改hosts文件(配置映射)
vim /etc/hosts
添加内容
192.168.159.100 hadoop100
192.168.159.101 hadoop101
192.168.159.102 hadoop102
192.168.159.103 hadoop103
192.168.159.104 hadoop104
192.168.159.105 hadoop105
192.168.159.106 hadoop106
192.168.159.107 hadoop107
192.168.159.108 hadoop108
或编写脚本添加
for((i=100,i<110,i++))
do
echo "192.168.159.$i hadoop$i">>/etc/hosts
done
14.关机、快照、克隆
1.修改静态ip
2.修改克隆机名hostname
3.关闭防护墙
4.重启克隆机(使配置文件生效)
15.修改windows主机hosts文件
C:\windows\system32\drivers\etc\hosts
192.168.159.100 hadoop100
192.168.159.101 hadoop101
192.168.159.102 hadoop102
192.168.159.103 hadoop103
192.168.159.104 hadoop104
192.168.159.105 hadoop105
192.168.159.106 hadoop106
192.168.159.107 hadoop107
192.168.159.108 hadoop108
2.在102部署JDK和Hadoop环境
1.卸载现有虚拟机(如果有)
rpm -qa |grep -i java |xargs -nl sudo rpm -e --nodeps
-qa 查rpm包
-i 忽略大小写
xargs 将查寻结果传到后边
-nl 1个1个卸载
-e 卸载
2.导入JDK和Hadoop的jar包到/opt/software
3.解压jar包到module
tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module
tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module
-C 指定解压到目录
4.配置环境变量
<1.>新建/etc/profile.d/my_env.sh
sudo vim /etc/profilre.d/my_env.sh
<2>提升环境变量为全局变量(随处可以调用)
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin
#HADOOP_HOME
export HADOOP=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
<3>保存退出 :wq ==shift zz
5.让修改配置文件生效
source /etc/profile 或重启
3.配置远程同步脚本xsync
3.1scp
安全拷贝(全部拷贝)
scp -r /opt/module/hadoop-3.1.3 hadoop103:/opt
命令 递归 文件目录 目标路径
3.2rsync
远程同步,用于备份和镜像 速度快(只对差异文件更新)
rsync -av /opt/module/hadoop-3.1.3 atguigu@hadoop103:/opt
-a归档拷贝 目的用户@主机:路径
-v显示详情
3.3xsync
脚本实现循环复制文件到所有节点上
语法:xsync 要发送的目录
<1>在bin目录下创建xsync文件(任意路径,最后发送到/bin)可以直接在==/home/atguigu/bin==下
cd /home/atguigu
mkdir bin
cd bin
vim xsync
$# 获取参数个数 用于循环
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
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
<2>修改脚本执行权
chmod +x xsync
<3>将脚本复制到/bin目录中,以便全局调用
sudo cp xsync /bin/
<4>删除当前xsync
rm xsync
4.免密登录
想要root用户下的资料也可以免密共享,需要在root用户下也要分发.ssh文件
4.1生成密钥对
ssh-keygen -t rsa
ssh -keygen -t ecdsa
其他默认(敲空格)
4.2将公钥拷贝到要免密登录的目标机器上
<1>逐一发送
ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104
注意:在每台机器的atguigu用户下都要生成并分发密钥对
<2>.ssh文件夹下(~/.ssh)的文件功能解释
known_hosts | 记录ssh访问过计算机的公钥(public key) |
---|---|
id_rsa | 生成的私钥 |
id_rsa.pub | 生成的公钥 |
authotized_keys | 存放授权过的乌木登录服务器公钥 |
<3>集体发送(第一次需要密码)三台机器都要发送一次
xsync ~/.ssh
5.集群部署规划
HDFS nn dn znn
YARN rm nm
2nn是备份nn 不能和nn装在同一台机器上
recourseManger占资源较大 也不能和nn、2nn装在一台机器上
hadoop102 | hadoop103 | hadoop104 | |
---|---|---|---|
HDFS | NameNodeDataNode | DataNode | secondaryNamenodeDataNode |
YARN | NodeManager | RecourseManagerNodeManager | NodeManager |
6.集群配置
/opt/module/hadoop-3.1.3/etc/hadoop
6.1修改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://hadoop102:9820</value>
</property>
<!-- 指定hadoop数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 配置HDFS网页登录使用的静态用户为atguigu -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>atguigu</value>
</property>
<!-- 配置该atguigu(superUser)允许通过代理访问的主机节点 -->
<property>
<name>hadoop.proxyuser.atguigu.hosts</name>
<value>*</value>
</property>
<!-- 配置该atguigu(superUser)允许通过代理用户所属组 -->
<property>
<name>hadoop.proxyuser.atguigu.groups</name>
<value>*</value>
</property>
</configuration>
6.2修改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.http-address</name>
<value>hadoop102:9870</value>
</property>
<!-- 2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
</configuration>
6.3修改mapreduce-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>
</configuration>
6.4修改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>hadoop103</value>
</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_MAPRED_HOME</value>
</property>
<!-- yarn容器允许分配的最大最小内存 -->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>512</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>4096</value>
</property>
<!-- yarn容器允许管理的物理内存大小 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>
<!-- 关闭yarn对物理内存和虚拟内存的限制检查 -->
<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>
6.5修改workers
hadoop102
hadoop103
hadoop104
7.同步配置文件及资源启动
7.1.同步配置文件
xsync /opt/module/hadoop-3.1.3/etc
7.2.格式化nn在102上执行
如果集群是第一次启动,
需要在hadoop102节点格式化NameNode(注意格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化NameNode的话,一定要先停止namenode和datanode进程,并且要删除所有机器的data和logs目录,然后再进行格式化。)
hdfs namenode -format
7.3.启动集群资源
102上启动HDFS
start-dfs.sh
103上启动YARN(配置了Recoursemanager)
start-yarn.sh
7.4.查看网址
hadoop102:9820
hadoop103:8088
7.5.集群测试
<1.>上传文件到集群 hadoop fs -put
小文件直接上传
大文件上传tar包
hadoop fs -mkdir /input
hadoop fs -put $HADOOP_HOME/wcinput/word.txt /input
<2>文件存放位置
/opt/module/hadoop-3.1.3/data/dfs/data/current/BP-938951106-192.168.10.107-1495462844069/current/finalized/subdir0/subdir0
<3>文件以块的形式存储,可以拼接>>
cat blk_1073741836>>tmp.tar.gz
<4>下载文件 hadoop fs -get
hadoop fs -get /jdk-8u212-linux-x64.tar.gz ./
<5>执行wordcount程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-
文件路径
3.1.3.jar wordcount /input /output
输入文件 输出位置(不允许存在)
8.集群启动/停止方式
8.1各个服务组件逐一启动/停止
<1>分别启动/停止HDFS组件
hdfs --daemon start/stop namenode/datanode/secondarynamenode
<2>分开启动YARN
yarn --daemon start/stop resourcemanager/nodemanager
8.2各个模块分开启动/停止
<1>整体启动HDFS
start-dfs.sh /stop-dfs.sh
<2>整体启动YARN
start-yarn.sh /stop-yarn.sh
9.配置历史服务器
方便查看历史运行情况
9.1配置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>
9.2分发配置
$HADOOP_HOME=/opt/module/hadoop-3.1.3
xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
9.3在102启动历史服务器
mapred --daemon start historyserver
查看历史服务器是否启动
jps
9.4查看jobHistory
http://hadoop102:19888/jobhistory
10.配置日志聚集
10.1日志聚集使用
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryServer。
10.2配置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>
10.3分发配置
xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml
10.4重启NodeManager、RecourseManager和HistoryServer
stop-yarn.sh
mapred --daemon stop historyserver
start-yarn.sh
mapred --daemon start historyserver
11.编写hadoop集群常用脚本
11.1查看三台服务器Java进程脚本:jpsall
cd /home/atguigu/bin
vim jpsall
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
echo ========== $host ==========
ssh $host jps $@ |grep -v Jps
done
chmod +x jpsall
12.集群时间同步
12.1时间服务器配置
(必须使用root用户,拥有修改系统时间的权限)
<1>查看所有节点ntpd服务状态和开机自启动状态
[atguigu@hadoop102 ~]$ sudo systemctl status ntpd
[atguigu@hadoop102 ~]$ sudo systemctl is-enabled ntpd
<2>在所有节点关闭ntp服务和自启动
[atguigu@hadoop102 ~]$ sudo systemctl stop ntpd
[atguigu@hadoop102 ~]$ sudo systemctl disable ntpd
<3>修改hadoop102的ntp.conf配置文件
[atguigu@hadoop102 ~]$ sudo vim /etc/ntp.conf
a)修改1(授权192.168.1.0-192.168.1.255网段上的所有机器可以从这台机器上查询和同步时间)
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
为restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
b)修改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
c)添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步)
server 127.127.1.0
fudge 127.127.1.0 stratum 10
<4>修改hadoop102的/etc/sysconfig/ntpd 文件
[atguigu@hadoop102 ~]$ sudo vim /etc/sysconfig/ntpd
增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
<5>重新启动ntpd服务
[atguigu@hadoop102 ~]$ sudo systemctl start ntpd
<6>设置ntpd服务开机启动
[atguigu@hadoop102 ~]$ sudo systemctl enable ntpd
12.2其他机器配置
必须是root用户
<1>在其他机器配置1分钟与时间服务器同步一次
编写定时任务
sudo crontab -e
*/1 * * * * /usr/sbin/ntpdate hadoop102
<2>修改任意时间
sudo date -s "2017-9-1 11:51:06"
13.翻车修复
停止集群所有进程
102
stop-dfs.sh
103
stop-yarn.sh
或者在2,3,4上同时执行
killall -9 java
在3台节点上删除数据文件
rm -rf /opt/module/hadoop-3.1.3/data /opt/module/hadoop-3.1.3/logs
从格式化开始重新来