Hadoop概述
1.Hadoop是apache基金会开发的分布式基础架构
2.主要解决海量数据的存储和分析计算问题
3.广义来说Hadoop通常指的是更广泛的概念-Hadoop生态圈
Hadoop优势
1.高可靠性:多副本机制,即使某个节点出现故障也不会导致数据的丢失
2.高扩展性:在集群件分配任务数据,可方便的扩展节点
3.高效性:并行计算可以加快任务处理速度
4.高容错性:能够自动将失败的任务自动分配
Hadoop组成
1.HDFS:分布式文件系统
1.1 NameNode:存储文件的元数据,如文件名,目录结构,文件属性,及每个文件的块列表和其所在的DataNode
1.2 DataNode:在本地文件系统中存储文件块数据及数据的校检和
1.3 SecondaryNameNode:每隔一段时间对NameNode元数据备份
2.Yarn:资源管理器
2.1 ResourceManager(RM):整个集群资源的(内存、cpu等)的老大
2.2 NodeManager(NM):单个节点服务器的老大
2.3 ApplicationMaster(AM):单个任务运行的老大
2.4 Container:容器,相当于一台独立的服务器,里面装了任务运行所需要的资源
3.MapReduce:MapReduce将计算过程分为两个阶段:Map和Reduce
3.1 Map阶段并行处理输入数据
3.2 Reduce阶段对Map结果进行汇总
Hadoop完全分布式运行环境搭建(3台虚拟机)
1.关闭防火墙,
systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld
2.创建用户和密码
useradd wsl(个人用户名)
passwd wsl(个人设置的密码)
3.配置用户具有root权限
修改/etc/sudoers文件,在 %wheel 下面一行添加
wsl ALL=(ALL) NOPASSWD:ALL
4.在/opt 目录下创建文件夹并修改所属组和所属主
4.1 创建目录:
mkdir /opt/module (该目录用于存放软件)
4.2 修改文件的所有者和所属组均为wsl用户:
chown wsl:wsl /opt/module
5. 卸载虚拟机自带的jdk
5.1 查看自带的jdk信息
java -version
5.2 查找jdk文件
rpm -qa | grep java
5.3 删除文件
rpm -e --nodeps 查找出来的文件
6. 修改主机名和ip地址
6.1 修改IP地址
vim /etc/sysconfig/network-scripts/ifcfg-ens33 打开配置文件
ONBOOT=yes
BOOTPROTO=static
NAME="ens33"
IPADDR=192.168.84.11
PREFIX=24
GATEWAY=192.168.84.2
DNS1=192.168.84.2
6.2 虚拟机设置为NAT模式
6.3 修改主机名
vim /etc/hostname
wsl01
6.4 配置主机名映射
vim /etc/hosts
192.168.84.11 wsl01
192.168.84.12 wsl02
192.168.84.13 wsl03
7. 安装jdk
7.1 上传jdk到 /opt/module 目录下并解压
tar -zxvf xxx.tar.gz
7.2 配置环境变量
1. 打开配置文件:
vim /etc/profile
2. 添加环境变量
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin
3. 退出并使配置文件生效
:wq 退出
source /etc/profile 生效
4. 测试是否生效
java -version
8. 安装Hadoop
8.1 创建Hadoop到/opt/module 并解压
tar -zxvf xxxx.tar.gz
8.2 配置环境变量
1. 打开配置文件:
vim /etc/profile
2. 添加环境变量
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
3. 退出并使配置文件生效
:wq 退出
source /etc/profile 生效
4. 测试是否生效
hadoop version
9. 编写集群分发脚本
9.1 安装 rsync远程同步工具
yum -y install rsync
9.2 把分发脚本放在声明了全局变量的路径里
1. echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/opt/module/jdk1.8.0_212/bin:/opt/module/hadoop-3.1.3/bin:/opt/module/hadoop-3.1.3/sbin:/opt/module/hive/bin:/home/wsl/.local/bin:/home/wsl/bin
2. 在/home/wsl/bin 目录下创建xsync文件
vim xsync.sh
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
for host in wsl01 wsl02 wsl03
do
echo ===== $host ======
for file in $@
do
if [ -e $file ]
then
pdir=$(cd -P $(dirname $file); pwd)
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
3.修改脚本执行权限
chmod +x xsync
10 ssh免密登录
1. 生成公钥和密钥
wsl01、wsl02、wsl03:ssh-keygen -t rsa
2. 互相拷贝公钥到要免密的机器上
ssh-copy-id 目标主机
11 集群时间同步
1. 查看所有节点的ntpd服务状态和开机自启状态
systemctl status ntpd
systemctl start ntpd
systemctl is-enabled ntpd
2. 修改ntp.conf配置文件
2.1 vim /etc/ntp.conf
(a)修改1(授权192.168.84.0-192.168.84.255网段上的所有机器可以从这台机器上查询和同步时间)
为restrict 192.168.84.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
为
(c)添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步)
server 127.127.1.0
fudge 127.127.1.0 stratum 10
2.3.修改wsl01的/etc/sysconfig/ntpd 文件
vim /etc/sysconfig/ntpd
增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
2.4.重新启动ntpd服务
systemctl start ntpd
2.5.设置ntpd服务开机启动
systemctl enable ntpd
3. 其他机器配置
3.1 关闭所有节点上ntp服务和自启动
wsl02:sudo systemctl stop ntpd
wsl02:sudo systemctl disable ntpd
wsl03:sudo systemctl stop ntpd
wsl03:sudo systemctl disable ntpd
3.2 在其他机器配置1分钟与时间服务器同步一次
wsl02: crontab -e
编写定时任务如下:
*/1 * * * * /usr/sbin/ntpdate wsl01
wsl03 同上
12 集群配置
1.部署规划
| wsl01 | wsl02 | wsl03 |
|---|
| HDFS | NameNode,DataNode | DataNode | DataNode,SecondaryNameNode |
| YARN | NodeManager | ResourceManager,NodeManager | NodeManager |
2.配置文件
2.1 配置core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://wsl01:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<property>
<name>hadoop.http.staticuser.user</name>
<value>wsl</value>
</property>
</configuration>
2.2 配置hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.namenode.http-address</name>
<value>wsl01:9870</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>wsl03:9868</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
</configuration>
2.3 配置 yarn-site.xml
<?xml version="2.0"?>
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>wsl02</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>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log.server.url</name>
<value>http://wsl01:19888/jobhistory/logs</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</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>
2.4 配置mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>wsl01:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>wsl01:19888</value>
</property>
</configuration>
2.5 配置hadoop.env.sh
# 添加jdk的路径
export JAVA_HOME=/opt/module/jdk1.8.0_212
2.6 配置works
vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
wsl01
wsl02
wsl03
2.7 分发
xsync /opt/module/hadoop-3.1.3/etc
3.启动集群
1. 如果集群第一次启动需要在wsl01格式化NameNode
wsl01:hdfs namenode -format
2. 启动HDFS
wsl01: start-dfs.sh
3. 在配置了ResourceManager的节点启动yarn
wsl02: start-yarn.sh
4. 启动历史服务器
wsl01: mapred --daemon start historyserver
5. 浏览器查看运行情况
web端查看HDFS的namenode
http://wsl01:9870
web端查看yarn的resourcemanager
http://wsl02:8088
web端查看历史服务
http://wsl01:19888/jobhistory
4.编写启动脚本
1.hadoop集群启停脚本
cd /home/wsl/bin
vim hadoop.sh
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 hadoop集群 ==================="
echo " --------------- 启动 hdfs ---------------"
ssh wsl01 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh wsl02 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh wsl01 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop集群 ==================="
echo " --------------- 关闭 historyserver ---------------"
ssh wsl01 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh wsl02 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh wsl01 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
2. 查看java进程脚本
cd /home/wsl/bin
vim jspall.sh
for host in wsl01 wsl02 wsl03
do
echo =============== $host ===============
ssh $host jps
done
5.常用端口说明
| 端口名 | hadoop2.x | hadoop3.x |
|---|
| NameNode内部通信端口 | 8020/9000 | 8020/9000/9820 |
| NameNode HTTP UI | 50070 | 9870 |
| MapReduce查看执行任务端口 | 8088 | 8088 |
| 历史服务器通信端口 | 19888 | 19888 |