第一章 Hadoop
1.1 Hadoop 简介
Hadoop 是一个适合海量数据的分布式存储和分布式计算的框架。
这里的分布式存储指的是HDFS ;分布式计算指的是MapReduce
1.1.1 Hadoop 版本
- Hadoop1.x HDFS+MapReduce
- Hadoop2.x HDFS+YARN+MapReduce
- Hadoop3.x HDFS+YARN+MapReduce
1.1.2 Hadoop3.x的细节变化
-
最低的Java版本要求从Java7变为Java8
-
在Hadoop 3中,HDFS支持纠删码,纠删码是一种比副本存储更节省存储空间的数据持久化存储方法,使用这种方法,相同容错的情况下可以比之前节省一半的存储空间
https://hadoop.apache.org/docs/r3.0.0/hadoop-project-dist/hadoop-hdfs/HDFSErasureCoding.html
-
Hadoop 2中的HDFS最多支持两个NameNode,一主一备,而Hadoop 3中的HDFS支持多个NameNode,一主多备
https://hadoop.apache.org/docs/r3.0.0/hadoop-project-dist/hadoop-hdfs/HDFSErasureCoding.html
-
MapReduce任务级本地优化,MapReduce添加了映射输出收集器的本地化实现的支持。对于密集型的洗牌操作(shuffle-intensive)jobs,可以带来30%的性能提升,
https://issues.apache.org/jira/browse/MAPREDUCE-2841
-
修改了多重服务的默认端口,Hadoop2中一些服务的端口和Hadoop3中是不一样的
-
详细优化点参考 https://hadoop.apache.org/docs/r3.0.0/index.html
1.1.3 常见的Hadoop发行版本
- Cloudera Hadoop(CDH) 收费商用版本
- HortonWorks(HDP) 开源版本,互联网公司使用较多
- Apache Hadoop 官方原生版本
1.1.4 Hadoop 三大核心组件
- HDFS 负责海里数据的分布式存储
- MapReduce 是一个计算模型,负责海量数据的分布式计算
- YARN 负责集群资源的管理和调度
1.2 Hadoop 安装
1.2.1 Hadoop集群的进程
- HDFS服务进程
- NameNode
- SecondaryNameNode
- DataNode
- YARN服务进程
- ResourceManager
- NodeManager
MapRedcue在这里没有进程,因为它是一个计算框架,等Hadoop集群安装好了以后MapReduce程序可以在上面执行。
1.2.1 伪分布式集群安装
-
首先配置基础环境 ip,hostname,firewalld,ssh免密码登录,JDK
-
ip
[root@bigdata04 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="static" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="ens33" UUID="2bc41e60-ba09-4989-b408-3b40b89378e7" DEVICE="ens33" ONBOOT="yes" IPADDR=192.168.35.103 GATEWAY=192.168.35.2 DNS1=192.168.35.2 [root@bigdata04 ~]#
修改项
BOOTPROTO=“static”
IPADDR=192.168.35.103
GATEWAY=192.168.35.2
DNS1=192.168.35.2 -
hostname
[root@bigdata04 ~]# hostname bigdata04 [root@bigdata04 ~]# cat /etc/hostname bigdata04 [root@bigdata04 ~]#
-
firewalld
# 临时关闭防火墙 [root@bigdata04 ~]# systemctl stop firewalld # 永久关闭防火墙 [root@bigdata04 ~]# systemctl disable firewalld # 查看防火墙状态 [root@bigdata04 ~]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man:firewalld(1) Dec 27 14:05:34 bigdata04 systemd[1]: Starting firewalld - dynamic firew.... Dec 27 14:05:34 bigdata04 systemd[1]: Started firewalld - dynamic firewa.... Dec 27 14:19:41 bigdata04 systemd[1]: Stopping firewalld - dynamic firew.... Dec 27 14:19:42 bigdata04 systemd[1]: Stopped firewalld - dynamic firewa.... Hint: Some lines were ellipsized, use -l to show in full. # 确认开机不启动防火墙 [root@bigdata04 ~]# systemctl list-unit-files | grep firewalld firewalld.service disabled
-
ssh 免密码登录
# 生成公钥和私钥文件 ssh-keygen -t rsa # 将公钥拷贝到要登录的主机 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys [root@bigdata04 ~]# ll ~/.ssh total 16 -rw-r--r--. 1 root root 396 Jan 5 13:52 authorized_keys -rw-------. 1 root root 1679 Jan 5 13:51 id_rsa -rw-r--r--. 1 root root 396 Jan 5 13:51 id_rsa.pub -rw-r--r--. 1 root root 203 Jan 5 13:52 known_hosts [root@bigdata04 ~]#
-
JDK安装
-
解压JDK压缩文件
-
配置环境变量
# 1.vi /etc/profile 增加JDK环境信息 export JAVA_HOME=/data/soft/jdk1.8 export PATH=.:$JAVA_HOME/bin:$PATH # 2.验证JDK 安装是否成功 [root@bigdata04 ~]# java -version java version "1.8.0_311" Java(TM) SE Runtime Environment (build 1.8.0_311-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.311-b11, mixed mode)
source /etc/profile 配置完重新加载配置文件 使环境变量生效
-
-
-
安装Hadoop
-
解压Hadoop安装文件
[root@bigdata04 soft]# tar -zxvf hadoop-3.2.0.tar.gz
-
修改配置文件
[root@bigdata04 hadoop]# pwd /data/soft/hadoop-3.2.0/etc/hadoop # 第一步 修改 hadoop-env.sh [root@bigdata04 hadoop]# vi hadoop-env.sh # 指定Java安装的目录 export JAVA_HOME=/data/soft/jdk1.8 # Hadoop 的日志存放目录 export HADOOP_LOG_DIR=/data/hadoop_repo/logs/hadoop # 第二步 修改 core-site.xml [root@bigdata04 hadoop]# vi core-site.xml .... <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://bigdata04:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/data/hadoop_repo</value> </property> </configuration> # 第三步 修改 mapred-site.xml,设置mapreduce使用的资源调度框架 [root@bigdata04 hadoop]# vi mapred-site.xml ... <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> # 第四步 修改 yarn-site.xml,设置yarn上支持运行的服务和环境变量白名单 [root@bigdata04 hadoop]# vi yarn-site.xml ... <configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</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> </configuration> # 第五步 修改 workers,设置集群中从节点的主机名信息,在这里就一台集群,所以就填写bigdata04即可 [root@bigdata04 hadoop]# vi workers bigdata04 # 第六步 修改 sbin 目录下 start-dfs.sh 增加用户 [root@bigdata04 sbin]# pwd /data/soft/hadoop-3.2.0/sbin [root@bigdata04 sbin]# vi start-dfs.sh HDFS_DATANODE_USER=root HDFS_DATANODE_SECURE_USER=hdfs HDFS_NAMENODE_USER=root HDFS_SECONDARYNAMENODE_USER=root # 第七步 修改 sbin 目录下 stop-dfs.sh 增加用户 [root@bigdata04 sbin]# pwd /data/soft/hadoop-3.2.0/sbin [root@bigdata04 sbin]# vi start-dfs.sh HDFS_DATANODE_USER=root HDFS_DATANODE_SECURE_USER=hdfs HDFS_NAMENODE_USER=root HDFS_SECONDARYNAMENODE_USER=root # 第八步修改sbin 目录下 start-yarn.sh [root@bigdata04 sbin]# vi start-yarn.sh YARN_RESOURCEMANAGER_USER=root HADOOP_SECURE_DN_USER=yarn YARN_NODEMANAGER_USER=root # 第九步 修改sbin 目录下 stop-yarn.sh [root@bigdata04 sbin]# vi stop-yarn.sh YARN_RESOURCEMANAGER_USER=root HADOOP_SECURE_DN_USER=yarn YARN_NODEMANAGER_USER=root
-
格式化HDFS
[root@bigdata04 hadoop]# cd /data/soft/hadoop-3.2.0 [root@bigdata04 hadoop-3.2.0]# bin/hdfs namenode -format
-
启动伪分布集群
[root@bigdata04 hadoop-3.2.0]# sbin/start-all.sh Starting namenodes on [bigdata04] Last login: Fri Jan 7 10:07:25 CST 2022 from fe80::214d:f5bf:36e9:dae8%ens33 on pts/1 Starting datanodes Last login: Fri Jan 7 11:19:17 CST 2022 on pts/1 Starting secondary namenodes [bigdata04] Last login: Fri Jan 7 11:19:19 CST 2022 on pts/1 Starting resourcemanager Last login: Fri Jan 7 11:19:23 CST 2022 on pts/1 Starting nodemanagers Last login: Fri Jan 7 11:19:31 CST 2022 on pts/1
-
验证集群是否启动
[root@bigdata04 hadoop-3.2.0]# jps 4530 ResourceManager 4004 NameNode 4122 DataNode 5034 Jps 4284 SecondaryNameNode 4685 NodeManager
除jps进程外有5个进程说明安装成功
此外通过web ui 也可以验证安装是否成功
HDFS webui界面:
http://192.168.35.103:9870
YARN webui界面:
http://192.168.35.103:8088(这个IP为bigdata04主机IP,如果想使用主机名访问需要在windows配置host)
-
停止集群
[root@bigdata04 hadoop-3.2.0]# sbin/stop-all.sh Stopping namenodes on [bigdata04] Last login: Fri Jan 7 11:19:33 CST 2022 on pts/1 Stopping datanodes Last login: Fri Jan 7 11:27:24 CST 2022 on pts/1 Stopping secondary namenodes [bigdata04] Last login: Fri Jan 7 11:27:25 CST 2022 on pts/1 Stopping nodemanagers Last login: Fri Jan 7 11:27:27 CST 2022 on pts/1 Stopping resourcemanager Last login: Fri Jan 7 11:27:30 CST 2022 on pts/1 [root@bigdata04 hadoop-3.2.0]# jps 6312 Jps
-
1.2.2 分布式集群安装
在这里我们要配置一主两从的分布式集群,准备三个节点
- bigdata01:192.168.35.100
- bigdata02:192.168.35.101
- bigdata03:192.168.25.102
-
前置配置
需要把每个节点的基础环境配置好,先把ip,hostname,firewalld,ssh免密码登录配置好
-
Hadoop安装
-
配置三台主机的/etc/host
# 修改bigdata01的/etc/host [root@bigdata01 ~]# vi /etc/hosts 192.168.35.100 bigdata01 192.168.35.101 bigdata02 192.168.35.102 bigdata03 # 修改bigdata02的/etc/host [root@bigdata02 ~]# vi /etc/hosts 192.168.35.100 bigdata01 192.168.35.101 bigdata02 192.168.35.102 bigdata03 # 修改bigdata03的/etc/host [root@bigdata03 ~]# vi /etc/hosts 192.168.35.100 bigdata01 192.168.35.101 bigdata02 192.168.35.102 bigdata03
在这里同样建议在windows 上配置host,主机ip映射 C:\Windows\System32\drivers\etc\host 在文件末尾直接添加 主机ip映射
-
集群节点之间的时间同步
集群只要涉及到多个节点的就需要对这些节点做时间同步,如果节点之间时间不同步相差太多,会影响集群的稳定性,甚至导致集群出问题。
# 在bigdata01 上配置时间同步 [root@bigdata01 ~]# vi /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed # 配置时间同步,每分钟执行一次 * * * * * root /usr/sbin/ntpdate -u ntp.sjtu.edu.cn You have new mail in /var/spool/mail/root # 在bigdata02 上配置时间同步 [root@bigdata02 ~]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed # 配置时间同步,每分钟执行一次 * * * * * root /usr/sbin/ntpdate -u ntp.sjtu.edu.cn You have new mail in /var/spool/mail/root # 在bigdata03 上配置时间同步 [root@bigdata03 ~]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed # 配置时间同步,每分钟执行一次 * * * * * root /usr/sbin/ntpdate -u ntp.sjtu.edu.cn You have new mail in /var/spool/mail/root [root@bigdata03 ~]#
默认是没有ntpdate命令的,需要使用yum在线安装,执行命令
yum install -y ntpdate
ntp.sjtu.edu.cn 指的是ntp服务器,yintp服务器进行时间校准,常见的ntp服务器地址 https://blog.csdn.net/weixin_42588262/article/details/82501488
集群内设置时钟同步两种方法
局域网内设置时钟同步 -
SSH免密码登录
# 将bigdata01 的公钥信息拷贝到bigdata02 bigdata03 [root@bigdata01 ~]# scp ~/.ssh/authorized_keys bigdata02:~/ [root@bigdata01 ~]# scp ~/.ssh/authorized_keys bigdata03:~/ # 添加到指定文件夹 [root@bigdata02 ~]# cat ~/authorized_keys >> ~/.ssh/authorized_keys [root@bigdata03 ~]# cat ~/authorized_keys >> ~/.ssh/authorized_keys
-
安装Hadoop
在这里只需要在bigdata01上安装就可以,后续将修改好配置的安装包拷贝到其他两个从节点,先创建安装目录 /data/soft,在/data/soft目录下进行解压
修改配置文件
# 1.修改 hadoop-env.sh 文件 在文件末尾增加环境变量信息 [root@bigdata01 hadoop]# pwd /data/soft/hadoop-3.2.0/etc/hadoop [root@bigdata01 hadoop]# vi hadoop-env.sh export JAVA_HOME=/data/soft/jdk1.8 export HADOOP_LOG_DIR=/data/hadoop_repo/logs/hadoop # 2.修改core-site.xml 文件 注意fs.defaultFS属性中的主机名需要和主节点的主机名保持一致 [root@bigdata01 hadoop]# vi core-site.xml ... <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://bigdata01:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/data/hadoop_repo</value> </property> </configuration> # 3.修改 hdfs-site.xml 文件 把hdfs中文件副本的数量设置为2,最多为2,因为现在集群中有两个从节点,还有secondaryNamenode进程所在的节点信息 [root@bigdata01 hadoop]# vi hdfs-site.xml ... <configuration> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>bigdata01:50090</value> </property> # 这个设置的dfs 身份验证 <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> </configuration> # 4.修改 mapred-site.xml,设置mapreduce使用的资源调度框架 [root@bigdata01 hadoop]# vi mapred-site.xml ... <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> # 5.修改yarn-site.xml,设置yarn上支持运行的服务和环境变量白名单,注意,针对分布式集群在这个配置文件中还需要设置resourcemanager的hostname,否则nodemanager找不到resourcemanager节点。 [root@bigdata01 hadoop]# vi yarn-site.xml ... <configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</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.resourcemanager.hostname</name> <value>bigdata01</value> </property> </configuration> # 6.修改 workers,把从节点名称加上 [root@bigdata01 hadoop]# vi workers bigdata02 bigdata03 # 7.修改启动脚本 修改start-dfs.sh,stop-dfs.sh这两个脚本文件,在文件前面增加如下内容 [root@bigdata01 hadoop]# cd /data/soft/hadoop-3.2.0/sbin [root@bigdata01 sbin]# vi start-dfs.sh HDFS_DATANODE_USER=root HDFS_DATANODE_SECURE_USER=hdfs HDFS_NAMENODE_USER=root HDFS_SECONDARYNAMENODE_USER=root [root@bigdata01 sbin]# vi stop-dfs.sh HDFS_DATANODE_USER=root HDFS_DATANODE_SECURE_USER=hdfs HDFS_NAMENODE_USER=root HDFS_SECONDARYNAMENODE_USER=root # 8.修改start-yarn.sh,stop-yarn.sh这两个脚本文件,在文件前面增加如下内容 [root@bigdata01 sbin]# vi start-yarn.sh YARN_RESOURCEMANAGER_USER=root HADOOP_SECURE_DN_USER=yarn YARN_NODEMANAGER_USER=root [root@bigdata01 sbin]# vi stop-yarn.sh YARN_RESOURCEMANAGER_USER=root HADOOP_SECURE_DN_USER=yarn YARN_NODEMANAGER_USER=root
-
将bigdata01节点上修改好配置的安装包拷贝到其他两个从节点
[root@bigdata01 sbin]# cd /data/soft/ [root@bigdata01 soft]# scp -rq hadoop-3.2.0 bigdata02:/data/soft/ [root@bigdata01 soft]# scp -rq hadoop-3.2.0 bigdata03:/data/soft/
-
在bigdata01上格式化HDFS
[root@bigdata01 soft]# cd /data/soft/hadoop-3.2.0 [root@bigdata01 hadoop-3.2.0]# bin/hdfs namenode -format
注意如果格式化失败可以查看日志文件
/data/hadoop_repo/logs/hadoop
格式化通常只建议做一次,如果需要进行多次执行,删除日志目录,执行命令rm -rf /data/hadoop_repo
-
启动集群
[root@bigdata01 hadoop]# cd /data/soft/hadoop-3.2.0 # 启动hadoop 集群 [root@bigdata01 hadoop-3.2.0]# sbin/start-all.sh Starting namenodes on [bigdata01] Last login: Fri Jan 7 13:07:53 CST 2022 from 192.168.35.1 on pts/0 Starting datanodes Last login: Fri Jan 7 14:15:31 CST 2022 on pts/0 Starting secondary namenodes [bigdata01] Last login: Fri Jan 7 14:15:33 CST 2022 on pts/0 Starting resourcemanager Last login: Fri Jan 7 14:15:37 CST 2022 on pts/0 Starting nodemanagers Last login: Fri Jan 7 14:15:42 CST 2022 on pts/0
-
验证集群
[root@bigdata01 hadoop-3.2.0]# jps 31797 NameNode 32634 Jps 32059 SecondaryNameNode 32300 ResourceManager [root@bigdata02 ~]# jps 28307 Jps 28181 NodeManager 28071 DataNode [root@bigdata03 ~]# jps 28374 Jps 28249 NodeManager 28139 DataNode
此外通过web ui 也可以验证安装是否成功
HDFS webui界面:
http://bigdata01:9870
YARN webui界面:
http://bigdata01:8088
-
停止集群
[root@bigdata01 hadoop-3.2.0]# sbin/stop-all.sh Stopping namenodes on [bigdata01] Last login: Fri Jan 7 14:15:44 CST 2022 on pts/0 Stopping datanodes Last login: Fri Jan 7 14:21:59 CST 2022 on pts/0 Stopping secondary namenodes [bigdata01] Last login: Fri Jan 7 14:22:01 CST 2022 on pts/0 Stopping nodemanagers Last login: Fri Jan 7 14:22:03 CST 2022 on pts/0 Stopping resourcemanager Last login: Fri Jan 7 14:22:06 CST 2022 on pts/0 You have new mail in /var/spool/mail/root [root@bigdata01 hadoop-3.2.0]# jps 33389 Jps
-
1.3 Hadoop客户端节点
建议在业务机器上安装Hadoop,只需要保证业务机器上的Hadoop的配置和集群中的配置保持一致即可,这样就可以在业务机器上操作Hadoop集群了,此机器就称为是Hadoop的客户端节点。