Hadoop学习笔记
0-前置章节-环境准备
0.1 环境介绍
配置环境:hadoop-3.4.0,jdk-8u171-linux-x64
0.2 VMware准备Linux虚拟机
0.2.1主机名、IP、SSH免密登录
1.配置固定IP地址(root权限)
开启master,修改主机名为node1,并修改固定ip为:192.168.247.131
# 1.修改主机名
hostnamectl set-hostname node1# 2.修改IP地址
vim /etc/sysconfig/network-scripts/ifcfg-ens33
#改为:BOOTPROTO="static"IPADDR="192.168.247.121"NETMASK="255.255.255.0"GATEWAY="192.168.247.2"DNS1="192.168.247.2"# 3.重启网卡
systemctl stop network
systemctl start network
# 或者直接
systemctl restart network
同样的操作启动node2和node3,
修改node2主机名为node2,设置ip为192.168.247.122
修改node3主机名为node3,设置ip为192.168.247.123
2.配置主机名映射
-
在Windows系统中修改hosts文件,填入如下内容:
文件路径:C:\Windows\System32\drivers\etc,找到hosts文件并打开(可用VSCode打开,方便保存)
添加并保存
192.168.247.121 node1 192.168.247.122 node2 192.168.247.123 node3
-
在3台Linux(root)的
vim /etc/hosts
文件中,填入如下内容(3台都要添加)
192.168.247.121 node1
192.168.247.122 node2
192.168.247.123 node3
3.配置SSH免密登录
后续安装的集群化软件,多数需要远程登录以及远程执行命令,我们可以简单起见,配置三台Linux服务器之间的免密码互相SSH登陆
-
在每一台机器都执行:
ssh-keygen -t rsa -b 4096
,一路回车到底即可 -
在每一台机器都执行:
ssh-copy-id node1 # 注意:yes ssh-copy-id node2 ssh-copy-id node3
-
执行完毕后,node1、node2、node3之间将完成root用户之间的免密互通
4.创建hadoop用户并配置免密登录
后续大数据的软件,将不会以root用户启动(确保安全,养成良好的习惯)
我们为大数据的软件创建一个单独的用户hadoop,并为三台服务器同样配置hadoop用户的免密互通
- 在每一台机器执行:
useradd hadoop
,创建hadoop用户 - 在每一台机器执行:
passwd hadoop
,设置hadoop用户密码为123456
(会显示无效密码,不用管) - 在每一台机器均切换到hadoop用户:
su - hadoop
,并执行ssh-keygen -t rsa -b 4096
,创建ssh密钥,一路回车到底即可 - 在每一台机器均执行
ssh-copy-id node1 # 注意:yes,密码:123456
ssh-copy-id node2
ssh-copy-id node3
在node3登录node2:
0.2.2JDK环境部署(3台机器都要执行)
JDK:Java Development Kit,是用于Java语言开发的环境。
使用的是jdk-8u171-linux-x64.tar.gz
1.配置JDK环境
-
创建文件夹,用来部署JDK,将JDK和Tomcat都安装部署到:/export/server 内
root@node1 ~]# mkdir -p /export/server
移动文件夹:
[root@node3 export]# mv /home/master/jdk-8u171-linux-x64.tar.gz /export/server
-
解压缩JDK安装文件(注意路径,在server下)
[root@node3 server]# tar -zxvf jdk-8u171-linux-x64.tar.gz -C /export/server
-
配置JDK的软链接
ln -s /export/server/jdk1.8.0_171 /export/server/jdk
-
配置JAVA_HOME环境变量,以及将$JAVA_HOME/bin文件夹加入PATH环境变量中
# 编辑 vim /etc/profile文件,在文件最后添加:
export JAVA_HOME=/export/server/jdk
export PATH=$PATH:$JAVA_HOME/bin
-
生效环境变量
source /etc/profile
-
配置java执行程序的软链接
#删除系统自带的java程序 rm -f /usr/bin/java # 软连接我们自己安装的java程序 ln -s /export/server/jdk/bin/java /usr/bin/java
-
执行验证
java -version
javac -version
0.2.3防火墙、SELinux、时间同步
1.关闭防火墙和SELinux
集群化软件之间需要通过端口互相通讯,为了避免出现网络不通的问题,我们可以简单的在集群内部关闭防火墙。
# 在每一台机器都执行
systemctl stop firewalld
systemctl disable firewalld # 关闭开机自启防火墙
Linux有一个安全模块:SELinux
,用以限制用户和程序的相关权限,来确保系统的安全稳定。
在当前,我们只需要关闭SELinux功能,避免导致后面的软件运行出现问题即可
# 在每一台机器都执行vim /etc/sysconfig/selinux
# 将第七行,SELINUX=enforcing 改为
SELINUX=disabled
# 保存退出后,重启虚拟机即可,千万要注意disabled单词不要写错,不然无法启动系统
可通过init 0
或init 6
重启虚拟机
2.修改时区并配置自动时间同步
以下操作在三台Linux均执行
注意:系统已自带安装ntp,可以直接systemctl status ntpd
来查询ntp服务是否开启
# 1. 安装ntp软件:yum install -y ntp
# 2. 更新时区rm -f /etc/localtime;sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 3. 同步时间ntpdate -u ntp.aliyun.com
# 4. 开启ntp服务并设置开机自启systemctl start ntpdsystemctl enable ntpd
3.设置快照
目前Linux虚拟机的状态基本准备就绪,可以对当前状态进行快照保存,以备后续恢复。
对三台虚拟机均执行拍摄快照。
0.3VMware虚拟机设置(略)
0.4云平台入门
1.什么是云平台
云平台也称云计算平台。
- 云: 通俗的理解就是远程计算机, 并且是一组 一堆, 这些远程计算机协同工作构建出一个平台,对用户提供服务
- 计算:这是一个概念很大的名词,小了说可以认为是对业务数据进行计算分析的算力,不过通俗意义上,计算是指构建业务系统的各种需求
- 平台:将云(远程硬件资源)和计算(远程软件资源)组合在一起,就形成了一个平台,对用户提供各种各样的服务。
我们可以这样理解,云平台是: 一个云上的平台,聚合了一些软硬件资源,为用户提供各种各样的远程服务
2.云平台提供的服务类型
云平台主要提供软硬件等服务,这些服务可以划分为三个类别:
-
IaaS服务(Infrastructure as a Service)基础设施即服务
-
PaaS服务(Platform as a Service)平台即服务
-
SaaS服务(Software as a Service)软件即服务
(1)IaaS 基础设施即服务,各类硬件设施
IaaS见名知意,即将IT基础设施作为服务。IT基础设施是指:
● 公网IP、带宽
● VPC(virtual private cloud)私有虚拟局域网
● 云服务器(CPU、内存、磁盘等计算、存储资源)
● 等等
简单来说就是构建一个实体服务器所需的:CPU、内存、磁盘、网络、公网IP、交换机等等一系列物理设备的云上化。这些称之为IaaS服务,IT基础设施作为服务对外提供。
(2)PaaS平台即服务,各类支持平台
Platform as a Service : 平台即服务.是指将平台作为一种服务对外提供.
那么我们要学习的云平台,就是一种PaaS服务,其他还有如
● 腾讯地图开发平台
● 小程序开发平台
● 云上消息中心平台(Kafka等)
● 云上Hadoop大数据计算平台
● 等等
(3)SaaS软件即服务,各类软件应用
Software as a Service: 软件即服务, 是指将软件作为一种服务对外提供.
● 云上数据库服务
● 云上缓存服务
● 云网盘服务
● DNS服务
● 流量高防服务
● 域名托管服务
● 和一切其它非云平台提供的,如:ProcessON、DrawIO、CSDN博客、邮箱服务、135编辑器、在线Office等
SaaS就是现成可用的软件(可认为是解决方案)提供给你,你只需要有网络(浏览器或其它客户端)去连接使用即可(可能付费)。无需关心维护、管理等。
0.5阿里云购买云服务器
0.6阿里云服务器系统设置
0.7UCloud云购买虚拟机
第一章 Hello 大数据分布式
第二章
2.1分布式的基础架构分析
分布式系统常见的组织形式?
- 去中心化模式:没有明确中心,大家协调工作
- 中心化模式:有明确的中心,基于中心节点分配工作
什么是主从模式?
- 主从模式(Master-Slaves)就是中心化模式,表示有一个主节点来作为管理者,管理协调下属一批从节点工作。
Hadoop是哪种模式?
- **主从模式(中心化模式)**的架构
2.2HDFS的基础架构
1.HDFS
HDFS是Hadoop三大组件(HDFS、MapReduce、YARN)之一
HDFS是一个典型的主从模式架构
2.HDFS的基础架构
- NameNode:
HDFS系统的主角色,是一个独立的进程
负责管理HDFS整个文件系统
负责管理DataNode
- DataNode:
HDFS系统的从角色,是一个独立进程
主要负责数据的存储,即存入数据和取出数据
- SecondaryNameNode:
NameNode的辅助,是一个独立进程
主要帮助NameNode完成元数据整理工作(打杂)
一个典型的HDFS集群,就是由1个DataNode加若干(至少一个)DataNode组成
2.3HDFS集群环境部署,VMware虚拟机中部署
1.集群规划
我们准备了基于VMware的三台虚拟机,其硬件配置如下。
节点 | CPU | 内存 |
---|---|---|
node1 | 1核心 | 4GB |
node2 | 1核心 | 2GB |
node3 | 1核心 | 2GB |
Hadoop HDFS的角色包含:
- NameNode,主节点管理者
- DataNode,从节点工作者
- SecondaryNameNode,主节点辅助
服务规划:
节点 | 服务 |
---|---|
node1 | NameNode、DataNode、SecondaryNameNode |
node2 | DataNode |
node3 | DataNode |
2.上传 & 解压
注意:请确认已经完成前置准备中的服务器创建、固定IP、防火墙关闭、Hadoop用户创建、SSH免密、JDK部署等操作。
# 以下操作,node1节点执行,以root身份登录# 1.上传Hadoop安装包到node1节点中
# 2.解压缩安装包到/export/server/中
tar -zxvf hadoop-3.4.0.tar.gz -C /export/server
# 3.构建软链接
cd /export/server
ln -s /export/server/hadoop-3.4.0 hadoop
# 4.进入hadoop安装包内
cd hadoop
cd 进入Hadoop安装包内,通过ls -l
命令查看文件夹内部结构
各个文件夹含义如下
- bin,存放Hadoop的各类程序(命令)
- etc,存放Hadoop的配置文件
- include,C语言的一些头文件
- lib,存放Linux系统的动态链接库(.so文件)
- libexec,存放配置Hadoop系统的脚本文件(.sh和.cmd)licenses-binary,存放许可证文件
- sbin,管理员程序(super bin)
- share,存放二进制源码(Java jar包)
3.修改配置文件,应用自定义设置
[root@node1 hadoop]# pwd
/export/server/hadoop/etc/hadoop
[root@node1 hadoop]# ll
总用量 180
-rw-r--r-- 1 root root 774 3月 4 2024 core-site.xml
-rw-r--r-- 1 root root 3999 3月 4 2024 hadoop-env.cmd
-rw-r--r-- 1 root root 16786 3月 4 2024 hadoop-env.sh
...
-rw-r--r-- 1 root root 28 10月 18 22:02 workers
-rw-r--r-- 1 root root 2250 3月 4 2024 yarn-env.cmd
-rw-r--r-- 1 root root 7095 3月 4 2024 yarn-env.sh
-rw-r--r-- 1 root root 690 3月 4 2024 yarn-site.xml
配置HDFS集群,我们主要涉及到如下文件的修改:
- workers: 配置从节点(DataNode)有哪些
- hadoop-env.sh: 配置Hadoop的相关环境变量
- core-site.xml: Hadoop核心配置文件
- hdfs-site.xml: HDFS核心配置文件
这些文件均存在与$HADOOP_HOME/etc/hadoop
文件夹中。
ps:$HADOOP_HOME
是后续我们要设置的环境变量,其指代Hadoop安装文件夹即/export/server/hadoop
- 配置workers文件
# 进入配置文件目录
cd etc/hadoop
# 编辑workers文件
vim workers
# 填入如下内容
node1
node2
node3
填入的node1、node2、node3,表明集群记录了三个从节点(DataNode)
注:data文件夹,新建文件夹namenode、datanode
- 配置hadoop-env.sh文件
vim hadoop-env.sh
# 填入如下内容
export JAVA_HOME=/export/server/jdk
export HADOOP_HOME=/export/server/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_LOG_DIR=$HADOOP_HOME/logs
- JAVA_HOME,指明JDK环境的位置在哪
- HADOOP_HOME,指明Hadoop安装位置
- HADOOP_CONF_DIR,指明Hadoop配置文件目录位置
- HADOOP_LOG_DIR,指明Hadoop运行日志目录位置
通过记录这些环境变量, 来指明上述运行时的重要信息
- 配置core-site.xml文件
在文件内部填入如下内容
<configuration><property><name>fs.defaultFS</name><value>hdfs://node1:8020</value></property><property><name>io.file.buffer.size</name><value>131072</value></property>
</configuration>
key:fs.defaultFS
含义:HDFS文件系统的网络通讯路径
值:hdfs://node1:8020
- 协议为hdfs://
- namenode为node1
- namenode通讯端口为8020
key:io.file.buffer.size
含义:io操作文件缓冲区大小
值:131072 bit
-
hdfs://node1:8020为整个HDFS内部的通讯地址,应用协议为hdfs://(Hadoop内置协议)
-
表明DataNode将和node1的8020端口通讯,node1是NameNode所在机器
-
此配置固定了node1必须启动NameNode进程
-
配置hdfs-site.xml文件
# 在文件内部填入如下内容
<configuration><property><name>dfs.datanode.data.dir.perm</name><value>700</value></property><property><name>dfs.namenode.name.dir</name><value>/data/namenode</value></property><property><name>dfs.namenode.hosts</name><value>node1,node2,node3</value></property><property><name>dfs.blocksize</name><value>268435456</value></property><property><name>dfs.namenode.handler.count</name><value>100</value></property><property><name>dfs.datanode.data.dir</name><value>/data/datanode</value></property>
</configuration>
-
key:dfs.datanode.data.dir.perm
-
含义:hdfs文件系统,默认创建的文件权限设置
-
值:700,即:rwx------
-
key:dfs.namenode.name.dir
-
含义:NameNode元数据的存储位置
-
值:/data/nn,在node1节点的/data/nn目录下
-
key:dfs.namenode.hosts
-
含义:NameNode允许哪几个节点的DataNode连接(即允许加入集群)
-
值:node1、node2、node3,这三台服务器被授权
-
key:dfs.blocksize
-
含义:hdfs默认块大小
-
值:268435456(256MB)
-
key:dfs.namenode.handler.count
-
含义:namenode处理的并发线程数
-
值:100,以100个并行度处理文件系统的管理任务
-
key:dfs.datanode.data.datanode
-
含义:从节点DataNode的数据存储目录
-
值:/data/datanode,即数据存放在node1、node2、node3,三台机器的/data/datanode内
4.准备数据目录
根据下述2个配置项:
<property><name>dfs.namenode.name.dir</name><value>/data/namenode</value>
</property>
<property><name>dfs.datanode.data.dir</name><value>/data/datanode</value>
</property>
- namenode数据存放node1的/data/namenode
- datanode数据存放node1、node2、node3的/data/datanode
所以应该
- 在node1节点:
- mkdir -p /data/namenode
- mkdir -p /data/datanode
- 在node2和node3节点:
- mkdir -p /data/datanode
5.分发Hadoop文件夹
目前,已经基本完成Hadoop的配置操作,可以从node1将hadoop安装文件夹远程复制到node2、node3
- 分发
# 在node1执行如下命令
cd /export/server
scp -r hadoop-3.4.0 node2:`pwd`/
scp -r hadoop-3.4.0 node3:`pwd`/
- 在node2执行,为hadoop配置软链接
# 在node2执行如下命令
ln -s /export/server/hadoop-3.4.0 /export/server/hadoop
- 在node3执行,为hadoop配置软链接
# 在node3执行如下命令
ln -s /export/server/hadoop-3.4.0 /export/server/hadoop
6.配置环境变量
为了方便我们操作Hadoop,可以将Hadoop的一些脚本、程序配置到PATH中,方便后续使用。
在Hadoop文件夹中的bin、sbin两个文件夹内有许多的脚本和程序,现在来配置一下环境变量
-
vim /etc/profile
# 在/etc/profile文件底部追加如下内容 export HADOOP_HOME=/export/server/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
-
在node2和node3配置同样的环境变量
-
最后都要:
source /etc/profile
7.授权为hadoop用户
hadoop部署的准备工作基本完成
为了确保安全,hadoop系统不以root用户启动,我们以普通用户hadoop来启动整个Hadoop服务
所以,现在需要对文件权限进行授权。
ps:请确保已经提前创建好了hadoop用户(前置准备章节中有讲述),并配置好了hadoop用户之间的免密登录
- 以root身份,在node1、node2、node3三台服务器上均执行如下命令
# 以root身份,在三台服务器上均执行
chown -R hadoop:hadoop /data
chown -R hadoop:hadoop /export
8.格式化整个文件系统(只在node1上)
前期准备全部完成,现在对整个文件系统执行初始化
- 在node1上,格式化namenode
# 确保以hadoop用户执行
su - hadoop
# 格式化namenode
hadoop namenode -format
- 在node1上,启动
# 一键启动hdfs集群
start-dfs.sh
# 查看jps
jps# 启动完后,可以直接在node2、node3上输入jps(无需进行与node1同样的格式化和启动)# 一键关闭hdfs集群
stop-dfs.sh# 如果遇到命令未找到的错误,表明环境变量未配置好,可以以绝对路径执行
/export/server/hadoop/sbin/start-dfs.sh
/export/server/hadoop/sbin/stop-dfs.sh
9.查看HDFS WEBUI
启动完成后,可以在浏览器打开:(可以直接在本机Windows系统浏览器上打开)
http://node1:9870
,即可查看到hdfs文件系统的管理网页。
2.4HDFS的Shell操作
注意:三台电脑都要,启动HDFS前,切换到用户hadoop下,即:su - hadoop密码是:123456[hadoop@node1 ~]$ start-dfs.sh
Starting namenodes on [node1]
Starting datanodes
localhost: mv: cannot stat ‘/export/server/hadoop/logs/hadoop-hadoop-datanode-node1.out’: No such file or directory
Starting secondary namenodes [node1]
[hadoop@node1 ~]$ jps
5792 Jps
5114 NameNode
5293 DataNode
5518 SecondaryNameNode
1.进程启停管理
一键启停脚本
Hadoop HDFS组件内置了HDFS集群的一键启停脚本。
-
$HADOOP_HOME/sbin/start-dfs.sh
,一键启动HDFS集群执行原理:
- 在执行此脚本的机器上,启动SecondaryNameNode
- 读取core-site.xml内容(fs.defaultFS项),确认NameNode所在机器,启动NameNode
- 读取workers内容,确认DataNode所在机器,启动全部DataNode
-
$HADOOP_HOME/sbin/stop-dfs.sh
,一键关闭HDFS集群执行原理:
- 在执行此脚本的机器上,关闭SecondaryNameNode
- 读取core-site.xml内容(fs.defaultFS项),确认NameNode所在机器,关闭NameNode
- 读取workers内容,确认DataNode所在机器,关闭全部NameNode
单进程启停
除了一键启停外,也可以单独控制进程的启停。
1.$HADOOP_HOME/sbin/hadoop-daemon.sh
,此脚本可以单独控制所在机器的进程的启停
用法:
hadoop-daemon.sh (start|status|stop) (namenode|secondarynamenode|datanode)
2.$HADOOP_HOME/bin/hdfs
,此程序也可以用以单独控制所在机器的进程的启停
用法:
hdfs --daemon (start|status|stop) (namenode|secondarynamenode|datanode)
node1:
[hadoop@node1 ~]$ jps
5845 Jps
5114 NameNode
5293 DataNode
5518 SecondaryNameNode
[hadoop@node1 ~]$ hadoop-daemon.sh stop datanode # 没有成功,停不了
WARNING: Use of this script to stop HDFS daemons is deprecated.
WARNING: Attempting to execute replacement "hdfs --daemon stop" instead.
# [hadoop@node1 ~]$ hdfs --daemon stop datanode
[hadoop@node1 ~]$ hdfs --daemon stop namenode
[hadoop@node1 ~]$ jps
5293 DataNode
6269 Jps
5518 SecondaryNameNode# node3:
[hadoop@node3 ~]$ jps
5034 Jps
4619 DataNode
[hadoop@node3 ~]$ hdfs --daemon stop datanode
[hadoop@node3 ~]$ jps
5098 Jps
2.文件系统操作命令
HDFS文件系统基本信息
HDFS作为分布式存储的文件系统,有其对数据的路径表达方式。
- HDFS同Linux系统一样,均是以/作为根目录的组织形式
-
Linux: /usr/local/hello.txt
-
HDFS: /usr/local/hello.txt
如何区分呢?
- Linux:file:///
- HDFS:hdfs://namenode:port**/**
- 注: namenode(的主机名或IP):port(namenode的端口)
如上路径:
- Linux:file:///usr/local/hello.txt
- HDFS:hdfs://node1:8020**/usr/local/hello.txt**
协议头file:/// 或 hdfs://node1:8020/可以省略
- 需要提供Linux路径的参数,会自动识别为file://
- 需要提供HDFS路径的参数,会自动识别为hdfs://
除非你明确需要写或不写会有BUG,否则一般不用写协议头
介绍
关于HDFS文件系统的操作命令,Hadoop提供了2套命令体系
两者在文件系统操作上,用法完全一致用哪个都可以
某些特殊操作需要选择hadoop命令或hdfs命令讲到的时候具体分析
# 1.创建文件夹
[hadoop@node1 ~]$ hadoop fs -mkdir -p file:///home/hadoop/test # 在Linux里面创建文件夹
[hadoop@node1 ~]$ ls
test
[hadoop@node1 ~]$ hadoop fs -mkdir -p hdfs://node1:8020/xp_hadoop/bigdata # 在HDFS里面创建文件夹
[hadoop@node1 ~]$ hdfs dfs -mkdir -p /home/hadoop/itcast # 没有用协议头,默认创建在hdfs文件系统上(因为是在hadoop用户上),而非本地Linux系统
[hadoop@node1 ~]$ ls
test# 2.查看指定目录下内容
[hadoop@node1 ~]$ hadoop fs -ls /
Found 2 items
drwxr-xr-x - hadoop supergroup 0 2024-10-20 11:29 /home
drwxr-xr-x - hadoop supergroup 0 2024-10-20 11:26 /xp_hadoop
[hadoop@node1 ~]$ hadoop fs -ls /home
Found 1 items
drwxr-xr-x - hadoop supergroup 0 2024-10-20 11:29 /home/hadoop
[hadoop@node1 ~]$ hdfs dfs -ls /home/hadoop
Found 1 items
drwxr-xr-x - hadoop supergroup 0 2024-10-20 11:29 /home/hadoop/itcast
1)、创建文件夹
-
hadoop fs -mkdir [-p]
… -
hdfs dfs -mkdir [-p]
…
path 为待创建的目录
-p选项的行为与Linux mkdir -p一致,它会沿着路径创建父目录。
2)、查看指定目录下内容
- hadoop fs -ls [-h] [-R] [
…] - hdfs dfs -ls [-h] [-R] [
…]
path 指定目录路径
-h 人性化显示文件size
-R 递归查看指定目录及其子目录
3)、上传文件到HDFS指定目录下
- hadoop fs -put [-f] [-p] …
- hdfs dfs -put [-f] [-p] …
-f 强制覆盖目标文件(已存在下)
-p 保留访问和修改时间,所有权和权限。
localsrc 本地文件系统(客户端所在机器,即Linux)
dst 目标文件系统(HDFS)
# 3.将文件从Linux系统上传文件到HDFS指定目录下
[hadoop@node1 ~]$ vim test1.txt
[hadoop@node1 ~]$ ll
总用量 4
drwxr-xr-x 2 hadoop hadoop 6 10月 20 11:25 test
-rw-rw-r-- 1 hadoop hadoop 36 10月 20 11:37 test1.txt
[hadoop@node1 ~]$ hadoop fs -put file:///home/hadoop/test1.txt hdfs://node1:8020/
[hadoop@node1 ~]$ hadoop fs -ls /
Found 3 items
drwxr-xr-x - hadoop supergroup 0 2024-10-20 11:29 /home
-rw-r--r-- 3 hadoop supergroup 36 2024-10-20 11:39 /test1.txt
drwxr-xr-x - hadoop supergroup 0 2024-10-20 11:26 /xp_hadoop[hadoop@node1 ~]$ vim test2.txt
[hadoop@node1 ~]$ hdfs dfs -put ./test2.txt /
[hadoop@node1 ~]$ hdfs dfs -ls /
Found 4 items
drwxr-xr-x - hadoop supergroup 0 2024-10-20 11:29 /home
-rw-r--r-- 3 hadoop supergroup 36 2024-10-20 11:39 /test1.txt
-rw-r--r-- 3 hadoop supergroup 36 2024-10-20 11:42 /test2.txt
drwxr-xr-x - hadoop supergroup 0 2024-10-20 11:26 /xp_hadoop
4)、查看HDFS文件内容
- hadoop fs -cat …
- hdfs dfs -cat …
读取指定文件全部内容,显示在标准输出控制台。
[hadoop@node1 ~]$ ls -ll
总用量 8
drwxr-xr-x 2 hadoop hadoop 6 10月 20 11:25 test
-rw-rw-r-- 1 hadoop hadoop 36 10月 20 11:37 test1.txt
-rw-rw-r-- 1 hadoop hadoop 36 10月 20 11:41 test2.txt
[hadoop@node1 ~]$ hdfs dfs -cat /test1.txt
hello,hadoop!
hahahhha
bigdata 6666
读取大文件可以使用管道符配合more(more:对内容进行翻页查看)
- hadoop fs -cat | more
- hdfs dfs -cat | more
5)、下载HDFS文件
- hadoop fs -get [-f] [-p] … (前面是HDFS文件路径,后面是Linux路径)
- hdfs dfs -get [-f] [-p] …
下载文件到本地文件系统指定目录,localdst必须是目录
-f 覆盖目标文件(已存在下)
-p 保留访问和修改时间,所有权和权限。
[hadoop@node1 ~]$ ll
总用量 8
drwxr-xr-x 2 hadoop hadoop 6 10月 20 11:25 test
-rw-rw-r-- 1 hadoop hadoop 36 10月 20 11:37 test1.txt
-rw-rw-r-- 1 hadoop hadoop 36 10月 20 11:41 test2.txt
[hadoop@node1 ~]$ rm -rf * # 将Linux上的文件(夹)都删除
[hadoop@node1 ~]$ ll
总用量 0
[hadoop@node1 ~]$ hadoop fs -ls /
Found 4 items
drwxr-xr-x - hadoop supergroup 0 2024-10-20 11:29 /home
-rw-r--r-- 3 hadoop supergroup 36 2024-10-20 11:39 /test1.txt
-rw-r--r-- 3 hadoop supergroup 36 2024-10-20 11:42 /test2.txt
drwxr-xr-x - hadoop supergroup 0 2024-10-20 11:26 /xp_hadoop
[hadoop@node1 ~]$ hdfs dfs -get /test1.txt . # 将hdfs上的文件test1.txt下载到Linux的home目录下(用.表示home目录)
[hadoop@node1 ~]$ ll
总用量 4
-rw-r--r-- 1 hadoop hadoop 36 10月 20 11:54 test1.txt
[hadoop@node1 ~]$ cat test1.txt
hello,hadoop!
hahahhha
bigdata 6666
6)、拷贝HDFS文件
- hadoop fs -cp [-f] …
- hdfs dfs -cp [-f] …
-f 覆盖目标文件(已存在下)
7)、追加数据到HDFS文件中
- hadoop fs -appendToFile …
- hdfs dfs -appendToFile …
将所有给定本地文件的内容追加到给定dst文件。
dst如果文件不存在,将创建该文件。
如果为-,则输入为从标准输入中读取。
8)、HDFS数据移动操作
- hadoop fs -mv …
- hdfs dfs -mv …
移动文件到指定文件夹下
可以使用该命令移动数据,重命名文件的名称
9)、HDFS数据删除操作
- hadoop fs -rm -r [-skipTrash] URI [URI …]
- hdfs dfs -rm -r [-skipTrash] URI [URI …]
删除指定路径的文件或文件夹
-skipTrash 跳过回收站,直接删除
[hadoop@node1 ~]$ vim /export/server/hadoop/etc/hadoop/core-site.xml
回收站功能默认关闭,如果要开启需要在core-site.xml内配置:(需要三台机器分别执行)
<property>
<name>fs.trash.interval</name>
<value>1440</value> # 1440:整个回收站的保留时间,1440分钟,即1天
</property><property>
<name>fs.trash.checkpoint.interval</name>
<value>120</value> # 120表示当前回收站检查的间隔,120分钟
</property>无需重启集群,在哪个机器配置的,在哪个机器执行命令就生效。
回收站默认位置在:/user/用户名(hadoop)/.Trash
[hadoop@node1 ~]$ hdfs dfs -ls /
Found 4 items
drwxr-xr-x - hadoop supergroup 0 2024-10-20 11:29 /home
-rw-r--r-- 3 hadoop supergroup 36 2024-10-20 11:39 /test1.txt
-rw-r--r-- 3 hadoop supergroup 36 2024-10-20 11:42 /test2.txt
drwxr-xr-x - hadoop supergroup 0 2024-10-20 11:26 /xp_hadoop
[hadoop@node1 ~]$ hdfs dfs -ls /xp_hadoop
Found 1 items
drwxr-xr-x - hadoop supergroup 0 2024-10-20 11:26 /xp_hadoop/bigdata
[hadoop@node1 ~]$ hdfs dfs -rm -r /xp_hadoop # 删除文件夹
Deleted /xp_hadoop# 开启回收站功能后
[hadoop@node1 ~]$ hdfs dfs -ls /
Found 3 items
drwxr-xr-x - hadoop supergroup 0 2024-10-20 11:29 /home
-rw-r--r-- 3 hadoop supergroup 36 2024-10-20 11:39 /test1.txt
-rw-r--r-- 3 hadoop supergroup 36 2024-10-20 11:42 /test2.txt
[hadoop@node1 ~]$ hdfs dfs -rm /test2.txt
2024-10-20 12:10:49,575 INFO fs.TrashPolicyDefault: Moved: 'hdfs://node1:8020/test2.txt' to trash at: hdfs://node1:8020/user/hadoop/.Trash/Current/test2.txt
# 即将test2.txt在hdfs里面删除,移动到回收站里面,回收站的默认路径:/user/hadoop/.Trash
[hadoop@node1 ~]$ hdfs dfs -ls /
Found 3 items
drwxr-xr-x - hadoop supergroup 0 2024-10-20 11:29 /home
-rw-r--r-- 3 hadoop supergroup 36 2024-10-20 11:39 /test1.txt
drwx------ - hadoop supergroup 0 2024-10-20 12:10 /user
HDFS shell其它命令
-
命令官方指导文档https://hadoop.apache.org/docs/r3.3.4/hadoop-project-dist/hadoop-common/FileSystemShell.html
-
提示
常见的操作自己最好能够记住,其他操作可以根据需要查询文档使用。
命令属于多用多会,孰能生巧,不用就忘。
HDFS WEB浏览
node1:9870
除了使用命令操作HDFS文件系统外,在HDFS的WEB UI上也可以查看HDFS文件系统的内容。
使用WEB浏览操作文件系统,一般会遇到权限问题
这是因为WEB浏览器中是以匿名用户(dr.who)登陆的,其只有只读权限,多数操作是做不了的。
如果需要以特权用户在浏览器中进行操作,需要配置如下内容到core-site.xml并重启集群
<property><name>hadoop.http.staticuser.user</name><value>hadoop</value></property>
但是,不推荐这样做
- HDFS WEBUI,只读权限挺好的,简单浏览即可
- 如果给与高权限,会有很大的安全问题,造成数据泄露或丢失
3.HDFS客户端 - Jetbrians产品插件
Big Data Tools插件
在Jetbrains的产品中,均可以安装插件,其中:Big Data Tools插件可以帮助我们方便的操作HDFS,比如
- IntelliJ IDEA(Java IDE)
- PyCharm(Python IDE)
- DataGrip(SQL IDE)
均可以支持Bigdata Tool插件。同学们如果有使用以上几款IDE,就可以安装此插件进行HDFS操作。
配置Windows未成功!!
需要对Windows系统做一些基础设置,配合插件使用
- 解压Hadoop安装包到Windows系统,如解压到:
D:\LXP\SoftApp\Hadoop\hadoop_VMware\hadoop-3.4.0
- 设置$HADOOP_HOME环境变量指向:
D:\LXP\SoftApp\Hadoop\hadoop_VMware\hadoop-3.4.0
- 下载winutils-master,我选的是
hadoop-3.3.6\bin
中的- hadoop.dll
- winutils.exe
- 可以自行下载,或从课程资料中获取
- 将hadoop.dll和winutils.exe放入D:\LXP\SoftApp\Hadoop\hadoop_VMware\hadoop-3.4.0\bin中
4.HDFS客户端 - NFS(未开始)
HDFS NFS Gateway
HDFS提供了基于NFS(Network File System)的插件,可以对外提供NFS网关,供其它系统挂载使用。NFS 网关支持 NFSv3,并允许将 HDFS 作为客户机本地文件系统的一部分挂载,现在支持:
- 上传、下载、删除、追加内容
如下图,将HDFS挂载为Windows文件管理器的网络位置
配置NFS
配置HDFS需要配置如下内容:
- core-site.xml,新增配置项 以及 hdfs-site.xml,新增配置项
- 开启portmap、nfs3两个新进程
在node1进行如下操作
1)、在core-site.xml 内新增如下两项
<property><name>hadoop.proxyuser.hadoop.groups</name><value>*</value></property><property><name>hadoop.proxyuser.hadoop.hosts</name><value>*</value></property>
- 项目: hadoop.proxyuser.hadoop.groups 值:允许hadoop用户代理任何其它用户组
- 项目:hadoop.proxyuser.hadoop.hosts 值:允许代理任意服务器的请求
2)、在hdfs-site.xml中新增如下项
<property><name>nfs.superuser</name><value>hadoop</value></property><property><name>nfs.dump.dir</name><value>/tmp/.hdfs-nfs</value></property><property><name>nfs.exports.allowed.hosts</name><value>192.168.88.1 rw</value></property>
- nfs.suerpser:NFS操作HDFS系统,所使用的超级用户(hdfs的启动用户为超级用户)
- nfs.dump.dir:NFS接收数据上传时使用的临时目录
- nfs.exports.allowed.hosts:NFS允许连接的客户端IP和权限,rw表示读写,IP整体或部分可以以*代替
课程设置的允许192.168.88.1以rw连接(这个IP是电脑虚拟网卡VMnet8的IP,连接虚拟机就走这个网卡)
启动NFS功能
-
将配置好的core-site.xml和hdfs-site.xml分发到node2和node3
-
重启Hadoop HDFS集群(先stop-dfs.sh,后start-dfs.sh)
-
停止系统的NFS相关进程
a.
systemctl stop nfs; systemctl disable nfs
关闭系统nfs并关闭其开机自启b.
yum remove -y rpcbind
卸载系统自带rpcbind -
启动portmap(HDFS自带的rpcbind功能)(必须以root执行):
hdfs --daemon start portmap
-
启动nfs(HDFS自带的nfs功能)(必须以hadoop用户执行):
hdfs --daemon start nfs3
检查NFS是否正常
以下操作在node2或node3执行(因为node1卸载了rpcbind,缺少了必要的2个命令)
- 执行:rpcinfo -p node1,正常输出如下
有mountd和nfs出现
-
执行:showmount -e node1
可以看到 / 192.168.88.1
在Windows挂载HDFS文件系统
- 开启Windows的NFS功能
此功能需要专业版,如果是家庭版Windows需要升级为专业版
-
在Windows命令提示符(CMD)内输入:
net use X: \\192.168.88.101\!
-
完成后即可在文件管理器中看到盘符为X的网络位置
-
点击右键客户断开连接
至此,就将HDFS挂载到Windows文件管理器内了可以进行上传、下载、改名、删除、追加文本等操作。
2.5HDFS的存储原理
2.5.1 存储原理
- 数据存入HDFS是分布式存储,即每一个服务器节点,负责数据的一部分。
- 数据在HDFS上是划分为一个个Block块进行存储。
- 在HDFS上,数据Block块可以有多个副本,提高数据安全性,每个Block块都有2个(可修改)备份,每个副本都复制到其它服务器一份
2.5.2 fsck命令
HDFS副本块数量的配置
在前面我们了解了HDFS文件系统的数据安全,是依靠多个副本来确保的。
如何设置默认文件上传到HDFS中拥有的副本数量呢?可以在hdfs-site.xml中配置如下属性:
<property> <name>dfs.replication</name> <value>3</value>
</property>
这个属性默认是3,一般情况下,我们无需主动配置(除非需要设置非3的数值)如果需要自定义这个属性,请修改每一台服务器的hdfs-site.xml文件,并设置此属性。
- 除了配置文件外,我们还可以在上传文件的时候,临时决定被上传文件以多少个副本存储。
hadoop fs -D dfs.replication=2 -put test.txt /tmp/
如上命令,就可以在上传test.txt的时候,临时设置其副本数为2,-D表示覆盖
- 对于已经存在HDFS的文件,修改dfs.replication属性不会生效,如果要修改已存在文件可以通过命令
hadoop fs -setrep [-R] 2 path
如上命令,指定path的内容将会被修改为2个副本存储。
-R选项可选,使用-R表示对子目录也生效。
fsck命令检查文件的副本数
同时,我们可以使用hdfs提供的fsck命令来检查文件的副本数
hdfs fsck path [-files [-blocks [-locations]]]
fsck可以检查指定路径是否正常
- -files可以列出路径内的文件状态
- -files -blocks 输出文件块报告(有几个块,多少副本)
- -files -blocks -locations 输出每一个block的详情
block配置
可以看到通过fsck命令我们验证了:
- 文件有多个副本
- 文件被分成多个块存储在hdfs
对于块(block),hdfs默认设置为256MB一个,也就是1GB文件会被划分为4个block存储。块大小可以通过参数:
<property> <name>dfs.blocksize</name> <value>268435456</value> <description>设置HDFS块大小,单位是b</description>
</property>
如上,设置为256MB
2.5.3 NameNode元数据
1.NameNode基于
- edits:记录每次操作
- fsimage:记录某一个时间节点前的当前文件系统全部文件的状态和信息维护整个文件系统元数据
- edits文件会被合并到fsimage中,这个合并由:SecondaryNameNode来操作
- fsimage记录的内容
1.edits文件
在hdfs中,文件是被划分了一堆堆的block块,那如果文件很大、以及文件很多,Hadoop是如何记录和整理文件和block块的关系呢?
答案就在于NameNode
NameNode基于一批edits和一个fsimage文件的配合完成整个文件系统的管理和维护
edits文件,是一个流水账文件,记录了hdfs中的每一次操作,以及本次操作影响的文件其对应的block
所以,会存在多个edits文件确保不会有超大edits的存在保证检索性能
问题在于,当用户想要查看某文件内容如:/tmp/data/test.txt就需要在全部的edits中搜索(还需要按顺序从头到尾,避免后期改名或删除)效率非常低
需要合并edits文件,得到最终的结果
2.fsimage文件
将全部的edits文件,合并为最终结果,即可得到一个FSImage文件
fsimage,记录某一个时间节点前的当前文件系统全部文件的状态和信息维护整个文件系统元数据
3.NameNode元数据管理维护
NameNode基于edits和FSImage的配合,完成整个文件系统文件的管理。
-
每次对HDFS的操作,均被edits文件记录
-
edits达到大小上线后,开启新的edits记录
-
定期进行edits的合并操作
-
如当前没有fsimage文件, 将全部edits合并为第一个fsimage
-
如当前已存在fsimage文件,将全部edits和已存在的fsimage进行合并,形成新的fsimage
-
-
重复123流程
4.元数据合并控制参数
对于元数据的合并,是一个定时过程,基于:
dfs.namenode.checkpoint.period
,默认3600(秒)即1小时dfs.namenode.checkpoint.txns
,默认1000000,即100W次事务
只要有一个达到条件就执行。检查是否达到条件,默认60秒检查一次,基于:-
dfs.namenode.checkpoint.check.period
,默认60(秒),来决定
5.SecondaryNameNode的作用
SecondaryNameNode会通过http从NameNode拉取数据(edits和fsimage),然后合并完成后提供给NameNode使用。
2.5.4 HDFS数据的读写流程
1、对于客户端读取HDFS数据的流程中,一定要知道
不论读、还是写,NameNode都不经手数据,均是客户端和DataNode直接通讯,不然对NameNode压力太大
2、写入和读取的流程,简单来说就是:
- NameNode做授权判断(是否能写、是否能读)
- 客户端直连DataNode进行写入(由DataNode自己完成副本复制)、客户端直连DataNode进行block读取
- 写入,客户端会被分配找离自己最近的DataNode写数据
- 读取,客户端拿到的block列表,会是网络距离最近的一份
3、网络距离
最近的距离就是在同一台机器s
其次就是同一个局域网(交换机)
再其次就是跨越交换机
再其次就是跨越数据中心
HDFS内置网络距离计算算法,可以通过IP地址、路由表来推断网络距离
1.数据写入流程
- 客户端向NameNode发起请求
- NameNode审核权限、剩余空间后,满足条件允许写入,并告知客户端写入的DataNode地址
- 客户端向指定的DataNode发送数据包
- 被写入数据的DataNode同时完成数据副本的复制工作,将其接收的数据分发给其它DataNode
- 如上图,DataNode1复制给DataNode2,
- 然后基于DataNode2复制给Datanode3和DataNode4
- 写入完成客户端通知NameNode,NameNode做元数据记录工作
关键信息点:
- NameNode不负责数据写入,只负责元数据记录和权限审批
- 客户端直接向1台DataNode写数据,这个DataNode一般是**离客户端最近(网络距离)**的那一个
- 数据块副本的复制工作,由DataNode之间自行完成(构建一个PipLine,按顺序复制分发,如图1给2, 2给3和4)
2.数据读取流程
1、客户端向NameNode申请读取某文件
2、 NameNode判断客户端权限等细节后,允许读取,并返回此文件的block列表
3、客户端拿到block列表后自行寻找DataNode读取即可
关键点:
1、数据同样不通过NameNode提供
2、NameNode提供的block列表,会基于网络距离计算尽量提供离客户端最近的
这是因为1个block有3份,会尽量找离客户端最近的那一份让其读取
第三章 Hadoop Map Reduce & Hadoop Yarn 分布式计算和资源调度
3.1分布式计算概述
分布式计算常见的2种工作模式:
- 分散->汇总 (MapReduce就是这种模式)
- 中心调度->步骤执行 (大数据体系的Spark、Flink等是这种模式)
分散->汇总模式:
- 将数据分片,多台服务器各自负责一部分数据处理
- 然后将各自的结果,进行汇总处理
- 最终得到想要的计算结果
中心调度->步骤执行模式:(分散—具体步骤—汇总,较为复杂)
- 由一个节点作为中心调度管理者
- 将任务划分为几个具体步骤
- 管理者安排每个机器执行任务
- 最终得到结果数据
3.2MapReduce概述
MapReduce执行原理
什么是MapReduce
MapReduce的主要编程接口
- map接口,主要提供“分散”功能,由服务器分布式处理数据
- reduce接口,主要提供“汇总”功能,进行数据汇总统计得到结果
- MapReduce可供Java、Python等语言开发计算程序
注:MapReduce尽管可以通过Java、Python等语言进行程序开发,但当下年代基本没人会写它的代码了,因为太过时了。 尽管MapReduce很老了,但现在仍旧活跃在一线,主要是Apache Hive框架非常火,而Hive底层就是使用的MapReduce。 所以对于MapReduce的代码开发,课程会简单扩展一下,但不会深入讲解,对MapReduce的底层原理会放在Hive之后,基于Hive做深入分析。
MapReduce的运行机制
- 将要执行的需求,分解为多个Map Task和Reduce Task
- 将Map Task 和 Reduce Task分配到对应的服务器去执行
3.3YARN概述
MapReduce是基于YARN运行的,即没有YARN”无法”运行MapReduce程序
YARN是做什么的?
- YARN是Hadoop的一个组件用以做集群的资源(内存、CPU等)调度
为什么需要资源调度
- 将资源统一管控进行分配可以提高资源利用率
程序如何在YARN内运行
- 程序向YARN 申请所需资源
- YARN为程序分配所需资源供程序使用
MapReduce和YARN的关系
- YARN用来调度资源给MapReduce分配和管理运行资源
- 所以,MapReduce需要YARN才能执行(普遍情况)
3.4YARN架构
1.核心架构
YARN的架构有哪2个角色?
- 主(Master):ResourceManager
- 从(Slave):NodeManager
两个角色各自的功能是什么?
- ResourceManager: 管理、统筹并分配整个集群的资源
- NodeManager:管理、分配单个服务器的资源,即创建管理容器,由容器提供资源供程序使用
什么是YARN的容器?
- 容器(Container)是YARN的NodeManager在所属服务器上分配资源的手段
- NodeManager 预先占用一部分资源
- 然后将这一部分资源提供给程序使用
- 应用程序运行在容器(集装箱)内,无法突破容器的资源限制
- ps:容器是**虚拟化(虚拟化存储docker)**的相关机制,后续我们会详细讲解
2.辅助架构
- 代理服务器(ProxyServer):Web Application Proxy Web应用程序代理,提高YARN在开放网络中的安全性
- 历史服务器(JobHistoryServer): 应用程序历史信息记录服务,记录历史运行的程序的信息以及产生的日志并提供WEB UI站点供用户使用浏览器查看。
2.1Web应用代理(Web Application Proxy)
代理服务器,即Web应用代理是 YARN 的一部分。默认情况下,它将作为资源管理器(RM)的一部分运行,但是可以配置为在独立模式下运行。使用代理的原因是为了减少通过 YARN 进行基于网络的攻击的可能性。
这是因为, YARN在运行时会提供一个WEB UI站点(同HDFS的WEB UI站点一样)可供用户在浏览器内查看YARN的运行信息
对外提供WEB 站点会有安全性问题, 而代理服务器的功能就是最大限度保障对WEB UI的访问是安全的。 比如:
- 警告用户正在访问一个不受信任的站点
- 剥离用户访问的Cookie等
开启代理服务器,可以提高YARN在开放网络中的安全性 (但不是绝对安全只能是辅助提高一些)
代理服务器默认集成在了ResourceManager中
也可以将其分离出来单独启动,如果要分离代理服务器
在yarn-site.xml中配置 yarn.web-proxy.address 参数即可 (部署环节会使用到)
(注:文件在:cd /export/server/hadoop/etc/hadoop)
<property><name>yarn.web-proxy.address</name><value>node1:8089</value><description>代理服务器主机和端口</description>
</property>
并通过命令启动它即可 $HADOOP_YARN_HOME/sbin/yarn-daemon.sh start proxyserver
(部署环节会使用到)
[hadoop@node1 hadoop]$ start-dfs.sh
Starting namenodes on [node1]
Starting datanodes
node2: ssh: connect to host node2 port 22: No route to host
Starting secondary namenodes [node1]
[hadoop@node1 hadoop]$ jps
3480 DataNode
3289 NameNode
3995 Jps
3694 SecondaryNameNode
[hadoop@node1 hadoop]$ yarn-daemon.sh start proxyserver
WARNING: Use of this script to start YARN daemons is deprecated.
WARNING: Attempting to execute replacement "yarn --daemon start" instead.
[hadoop@node1 hadoop]$ jps
4065 WebAppProxyServer
3480 DataNode
4104 Jps
3289 NameNode
3694 SecondaryNameNode
2.2JobHistoryServer历史服务器
JobHistoryServer历史服务器功能:
- 提供WEB UI站点,供用户在浏览器上查看程序日志
- 可以保留历史数据,随时查看历史运行程序信息
JobHistoryServer需要配置:
- 开启日志聚合,即从容器中抓取日志到HDFS集中存储
<property><name>yarn.log-aggregation-enable</name><value>true</value><description>开启日志聚合</description>
</property>
<property><name>yarn.nodemaneger.remote-app-log-dir</name><value>/tmp/logs</value><description>程序日志HDFS的存储路径</description>
</property>
- 配置历史服务器端口和主机
<property><name>mapreduce.jobhistory.webapp.address</name><value>node1:19888</value><description>历史服务器web端口为node1的19888</description>
</property>
详细历史服务器配置和启动,在部署YARN集群环节讲解
3.5MapReduce & YARN 的部署
关于MapReduce和YARN的部署,其实就是2件事情:
- 关于MapReduce: 修改相关配置文件,但是没有进程可以启动
- 关于YARN: 修改相关配置文件, 并启动ResourceManager、NodeManager进程以及辅助进程(代理服务器、历史服务器)
集群规划
有3台服务器,其中node1配置较高,集群规划如下:
主机 | 角色 |
---|---|
node1 | ResourceManager、NodeManager、ProxyServer、JobHistoryServer |
node2 | NodeManager |
node3 | NodeManager |
MapReduce配置文件
在 $HADOOP_HOME/etc/hadoop 文件夹内,修改:
- mapred-env.sh文件,添加如下环境变量
# 设置JDK路径
export JAVA_HOME=/export/server/jdk
# 设置JobHistoryServer进程内存为1G
export HADOOP_JOB_HISTORYSERVER_HEAPSIZE=1000
# 设置日志级别为INFO
export HADOOP_MAPRED_ROOT_LOGGER=INFO,RFA
- mapred-site.xml文件,添加如下配置信息
<configuration><property><name>mapreduce.framework.name</name><value>yarn</value><description>MapReduce的运行框架设置为YARN</description></property><property><name>mapreduce.jobhistory.address</name><value>node1:10020</value><description>历史服务器通讯端口为node1:10020</description></property><property><name>mapreduce.jobhistory.webapp.address</name><value>node1:19888</value><description>历史服务器web端口为node1的19888</description></property><property><name>mapreduce.jobhistory.intermediate-done-dir</name><value>/data/mr-history/tmp</value><description>历史信息在HDFS的记录临时路径</description></property><property><name>mapreduce.jobhistory.done-dir</name><value>/data/mr-history/done</value><description>历史信息在HDFS的记录路径</description></property><property><name>yarn.app.mapreduce.am.env</name><value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value><description>MapReduce HOME设置为HADOOP_HOME</description></property><property><name>mapreduce.map.env</name><value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value><description>MapReduce HOME设置为HADOOP_HOME</description></property><property><name>mapreduce.reduce.env</name><value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value><description>MapReduce HOME设置为HADOOP_HOME</description></property>
</configuration>
YARN配置文件
在 $HADOOP_HOME/etc/hadoop 文件夹内,修改:
- yarn-env.sh文件,添加如下4行环境变量内容:
# 设置JDK路径的环境变量
export JAVA_HOME=/export/server/jdk
# 设置HADOOP_HOME的环境变量
export HADOOP_HOME=/export/server/hadoop
# 设置配置文件路径的环境变量
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
# 设置日志文件路径的环境变量
export HADOOP_LOG_DIR=$HADOOP_HOME/logs
- yarn-site.xml文件,配置如图属性
<configuration><!-- Site specific YARN configuration properties -->
<property><name>yarn.log.server.url</name><value>http://node1:19888/jobhistory/logs</value><description></description>
</property><property><name>yarn.web-proxy.address</name><value>node1:8089</value><description>proxy server hostname and port</description></property><property><name>yarn.log-aggregation-enable</name><value>true</value><description>Configuration to enable or disable log aggregation</description></property><property><name>yarn.nodemanager.remote-app-log-dir</name><value>/tmp/logs</value><description>Configuration to enable or disable log aggregation</description></property><!-- Site specific YARN configuration properties --><property><name>yarn.resourcemanager.hostname</name><value>node1</value><description></description></property><property><name>yarn.resourcemanager.scheduler.class</name><value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value><description></description></property><property><name>yarn.nodemanager.local-dirs</name><value>/data/nm-local</value><description>Comma-separated list of paths on the local filesystem where intermediate data is written.</description></property><property><name>yarn.nodemanager.log-dirs</name><value>/data/nm-log</value><description>Comma-separated list of paths on the local filesystem where logs are written.</description></property><property><name>yarn.nodemanager.log.retain-seconds</name><value>10800</value><description>Default time (in seconds) to retain log files on the NodeManager Only applicable if log-aggregation is disabled.</description></property><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value><description>Shuffle service that needs to be set for Map Reduce applications.</description></property>
</configuration>
分发配置文件
MapReduce和YARN的配置文件修改好后,需要分发到其它的服务器节点中。
scp mapred-env.sh mapred-site.xml yarn-env.sh yarn-site.xml node2:`pwd`/
scp mapred-env.sh mapred-site.xml yarn-env.sh yarn-site.xml node3:`pwd`/
分发完成配置文件,就可以启动YARN的相关进程啦。
集群启动命令介绍
常用的进程启动命令如下:
-
一键启动YARN集群:
$HADOOP_HOME/sbin/start-yarn.sh
- 会基于yarn-site.xml中配置的yarn.resourcemanager.hostname来决定在哪台机器上启动resourcemanager
- 会基于workers文件配置的主机启动NodeManager
-
一键停止YARN集群:
$HADOOP_HOME/sbin/stop-yarn.sh
-
在当前机器,单独启动或停止进程
$HADOOP_HOME/bin/yarn --daemon start|stop resourcemanager|nodemanager|proxyserver
- start和stop决定启动和停止
- 可控制resourcemanager、nodemanager、proxyserver三种进程
-
历史服务器启动和停止
$HADOOP_HOME/bin/mapred --daemon start|stop historyserver
开始启动YARN集群
在node1服务器,以hadoop用户执行
-
首先执行:
$HADOOP_HOME/sbin/start-yarn.sh
,一键启动所需的:- ResourceManager、NodeManager、ProxyServer(代理服务器)
-
其次执行:
$HADOOP_HOME/bin/mapred --daemon start historyserver
启动:- HistoryServer(历史服务器)
查看YARN的WEB UI页面
打开http://node1:8088
即可看到YARN集群的监控页面(ResourceManager的WEB UI)
在最后,可以给虚拟机打上快照,保存安装状态
3.6MapReduce & YARN 初体验
3.6.1 集群启停命令
一键启动脚本
启动:
$HADOOP_HOME/sbin/start-yarn.sh
- 从yarn-site.xml中读取配置,确定ResourceManager所在机器,并启动它
- 读取workers文件,确定机器,启动全部的NodeManager
- 在当前机器启动ProxyServer(代理服务器)
关闭
$HADOOP_HOME/sbin/stop-yarn.sh
单进程启停
除了一键启停外,也可以单独控制进程的启停。
$HADOOP_HOME/bin/yarn
,此程序也可以用以单独控制所在机器的进程的启停
用法:yarn --daemon (start|stop) (resourcemanager|nodemanager|proxyserver)
$HADOOP_HOME/bin/mapred
,此程序也可以用以单独控制所在机器的历史服务器的启停
用法:mapred --daemon (start|stop) historyserver
[hadoop@node1 hadoop]$ mapred --daemon start historyserver
WARNING: HADOOP_MAPRED_ROOT_LOGGER has been replaced by HADOOP_ROOT_LOGGER. Using value of HADOOP_MAPRED_ROOT_LOGGER.
[hadoop@node1 hadoop]$ jps
4065 WebAppProxyServer
6178 NameNode
6563 SecondaryNameNode
7155 NodeManager
3480 DataNode
6984 ResourceManager
8185 JobHistoryServer
8204 Jps
3.6.2 提交MapReduce任务到YARN执行
在部署并成功启动YARN集群后,我们就可以在YARN上运行各类应用程序了。
YARN作为资源调度管控框架,其本身提供资源供许多程序运行,常见的有:
- MapReduce程序
- Spark程序
- Flink程序
Spark和Flink是大数据后续的学习内容,我们目前先来体验一下在YARN上执行MapReduce程序的过程。
Hadoop官方内置了一些预置的MapReduce程序代码,我们无需编程,只需要通过命令即可使用。
常用的有2个MapReduce内置程序:
- wordcount:单词计数程序。
统计指定文件内各个单词出现的次数
- pi:求圆周率
通过蒙特卡罗算法(统计模拟法)求圆周率
- 这些内置的示例MapReduce程序代码,都在:
$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar
这个文件内。
- 可以通过 hadoop jar 命令来运行它,提交MapReduce程序到YARN中。
语法: hadoop jar 程序文件 java类名 [程序参数] ... [程序参数]
提交wordcount示例程序
单词计数示例程序的功能很简单:
- 给定数据输入的路径(HDFS)、给定结果输出的路径(HDFS)
- 将输入路径内的数据中的单词进行计数,将结果写到输出路径
我们可以准备一份数据文件,并上传到HDFS中。
itheima itcast itheima itcast
hadoop hdfs hadoop hdfs
hadoop mapreduce hadoop yarn
itheima hadoop itcast hadoop
itheima itcast hadoop yarn mapreduce
将上面内容保存到Linux中为words.txt文件,并上传到HDFS hadoop fs -mkdir -p /input/wordcount
hadoop fs -mkdir /output
hadoop fs -put words.txt /input/wordcount/
-
执行如下命令,提交示例MapReduce程序WordCount到YARN中执行
$HADOOP_HOME = /export/server/hadoop
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.4.0.jar wordcount hdfs://node1:8020/input/wordcount/ hdfs://node1:8020/output/wc1
注意:
- 参数wordcount,表示运行jar包中的单词计数程序(Java Class)
- 参数1是数据输入路径(hdfs://node1:8020/input/wordcount/)
- 参数2是结果输出路径(hdfs://node1:8020/output/wc1), 需要确保输出的文件夹wc1不存在
提交程序后,可以在YARN的WEB UI页面看到运行中的程序(http://node1:8088/cluster/apps
)
执行完成后,可以查看HDFS上的输出结果
- _SUCCESS文件是标记文件,表示运行成功,本身是空文件
- part-r-00000,是结果文件,结果存储在以part开头的文件中
cd /export/server/hadoop/etc/hadoop
[hadoop@node1 hadoop]$ vim words.txt
[hadoop@node1 hadoop]$ hdfs dfs -mkdir -p /input/wordcount
[hadoop@node1 hadoop]$ hdfs dfs -mkdir /output
[hadoop@node1 hadoop]$ hdfs dfs -put words.txt /input/wordcount/[hadoop@node1 hadoop]$ hadoop jar /export/server/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.4.0.jar wordcount hdfs://node1:8020/input/wordcount/ hdfs://node1:8020/output/wc1
# hadoop jar 程序文件 java类名 [程序参数1(输入的文件夹)] ... [程序参数(输出的文件夹)][hadoop@node1 hadoop]$ hadoop fs -ls /output/wc1
Found 2 items
-rw-r--r-- 3 hadoop supergroup 0 2024-10-21 14:40 /output/wc1/_SUCCESS
-rw-r--r-- 3 hadoop supergroup 54 2024-10-21 14:40 /output/wc1/part-r-00000[hadoop@node1 hadoop]$ hadoop fs -cat /output/wc1/*
hadoop 7
hdfs 2
itcast 4
itheima 4
mapreduce 2
yarn 2
查看运行日志
提交求圆周率示例程序
可以执行如下命令,使用蒙特卡罗算法模拟计算求PI(圆周率)
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar pi 3 1000
- 参数pi表示要运行的Java类,这里表示运行jar包中的求pi程序
- 参数3,表示设置几个map任务
- 参数1000,表示模拟求PI的样本数(越大求的PI越准确,但是速度越慢)
[hadoop@node1 hadoop]$ hadoop jar /export/server/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.4.0.jar pi 3 1000
Number of Maps = 3
Samples per Map = 1000
Wrote input for Map #0
Wrote input for Map #1
Wrote input for Map #2
Starting Job
....
Job Finished in 127.654 seconds
Estimated value of Pi is 3.14133333333333333333
如上,运行完成,求得PI值(样本1000太小,不够精准,仅演示)
第四章 Apache Hive
4.1Apache Hive 概述
分布式SQL计算 — Hive
MapReduce支持程序开发(Java、Python等)但不支持SQL开发
什么是分布式SQL计算?
- 以分布式的形式,执行SQL语句,进行数据统计分析。
Apache Hive是一款分布式SQL计算的工具, 其主要功能是:
- 将SQL语句 翻译成MapReduce程序运行
使用Hive处理数据的好处
- 操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)
- 底层执行MapReduce,可以完成分布式海量数据的SQL处理
传统MapReduce开发:写MR代码->得到结果
使用Hive开发:写SQL->得到结果
底层都是MR在运行,但是使用层面上更加简单了。
4.2模拟实现Hive功能
基于MapReduce构建分布式SQL执行引擎,主要需要有哪些功能组件?
- 元数据管理:帮助记录各类元数据
- 数据位置
- 数据结构
- 等对数据进行描述
- SQL解析器:帮助记录各类元数据
Apache Hive其2大主要组件就是:元数据存储以及SQL解析器, 如下图。
4.3Hive基础架构
1.Hive架构图
Hive的核心架构包含哪些?
- 元数据管理,称之为Metastore服务
- SQL解析器(Driver驱动程序),完成SQL解析、执行优化、代码提交等功能
- 用户接口:提供用户和Hive交互的功能
2.Hive组件
- 元数据存储
通常是存储在关系数据库如 mysql/derby中。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
– Hive提供了 Metastore 服务进程提供元数据管理功能
- Driver驱动程序,包括语法解析器、计划编译器、优化器、执行器
完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后有执行引擎调用执行。
这部分内容不是具体的服务进程,而是封装在Hive所依赖的Jar文件即Java代码中。
- 用户接口
包括 CLI、JDBC/ODBC、WebGUI。其中,CLI(command line interface)为shell命令行;Hive中的Thrift服务器允许外部客户端通过网络与Hive进行交互,类似于JDBC或ODBC协议。WebGUI是通过浏览器访问Hive。
– Hive提供了 Hive Shell、 ThriftServer等服务进程向用户提供操作接口
4.4Hive部署(详细另见)
CentOS7下,hive4.0.0安装部署
4.4.1VMware虚拟机部署
Hive是分布式运行的框架还是单机运行的?
Hive是单机工具,只需要部署在一台服务器即可。
Hive虽然是单机的,但是它可以提交分布式运行的MapReduce程序运行。
规划
我们知道Hive是单机工具后,就需要准备一台服务器供Hive使用即可。
同时Hive需要使用元数据服务,即需要提供一个关系型数据库,我们也选择一台服务器安装关系型数据库即可
所以:
服务 | 机器 |
---|---|
Hive本体 | 部署在node1 |
元数据服务所需的关系型数据库(课程选择最为流行的MySQL) | 部署在node1 |
为了简单起见,都安装到node1服务器上。
。。。
4.4.2 阿里云部署略
4.4.3 UCloud云部署略
4.5 Hive初体验
- Hive中可以使用类MySQL的SQL语法完成基本的库、表、插入、查询等操作
- 通过YARN控制台可以看到,Hive是将SQL翻译成MapReduce程序运行在YARN中
- Hive中创建的库和表的数据,存储在HDFS中,默认存放在:
hdfs://node1:8020/user/hive/warehouse
中。
首先,确保启动了Metastore服务。
可以执行:bin/hive,进入到Hive Shell环境中,可以直接执行SQL语句。
- 创建表
CREATE TABLE test(id INT, name STRING, gender STRING);
- 插入数据
INSERT INTO test VALUES(1, ‘王力红’, ‘男’), (2, ‘周杰轮’, ‘男’), (3, ‘林志灵’, ‘女’);
- 查询数据
SELECT gender, COUNT(*) AS cnt FROM test GROUP BY gender;
- 验证Hive的数据存储
Hive的数据存储在HDFS的:/user/hive/warehouse
中
- 验证SQL语句启动的MapReduce程序
打开YARN的WEB UI页面查看任务情况:http://node1:8088
4.6 Hive客户端
4.6.1 HiveServer2 & Beeline
HiveServer2服务
在启动Hive的时候,除了必备的Metastore服务外,我们前面提过有2种方式使用Hive:
- 方式1: bin/hive 即Hive的Shell客户端,可以直接写SQL
方式2: bin/hive --service hiveserver2
后台执行脚本:nohup bin/hive --service hiveserver2 >> logs/hiveserver2.log 2>&1 &
bin/hive --service metastore,启动的是元数据管理服务
bin/hive --service hiveserver2,启动的是HiveServer2服务
HiveServer2是Hive内置的一个ThriftServer服务,提供Thrift端口供其它客户端链接
可以连接ThriftServer的客户端有:
- Hive内置的 beeline客户端工具(命令行工具)
- 第三方的图形化SQL工具,如DataGrip、DBeaver、Navicat等
启动
在hive安装的服务器上,首先启动metastore服务,然后启动hiveserver2服务。
#先启动metastore服务 然后启动hiveserver2服务
nohup bin/hive --service metastore >> logs/metastore.log 2>&1 &
nohup bin/hive --service hiveserver2 >> logs/hiveserver2.log 2>&1 &
beeline
- 在node1上使用beeline客户端进行连接访问。需要注意hiveserver2服务启动之后需要稍等一会才可以对外提供服务。
- Beeline是JDBC的客户端,通过JDBC协议和Hiveserver2服务进行通信,协议的地址是:
jdbc:hive2://node1:10000
[root@node1 ~]# /export/server/hive/bin/beeline
Beeline version 3.1.2 by Apache Hive
beeline> ! connect jdbc:hive2://node1:10000
Connecting to jdbc:hive2://node1:10000
Enter username for jdbc:hive2://node1:10000: root
Enter password for jdbc:hive2://node1:10000:
Connected to: Apache Hive (version 3.1.2)
Driver: Hive JDBC (version 3.1.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ0: jdbc:hive2://node1:10000>
4.6.2 DataGrip & DBeaver
1.Hive第三方客户端
DataGrip、Dbeaver、SQuirrel SQL Client等
可以在Windows、MAC平台中通过JDBC连接HiveServer2的图形界面工具;
这类工具往往专门针对SQL类软件进行开发优化、页面美观大方,操作简洁,更重要的是SQL编辑环境优雅;
SQL语法智能提示补全、关键字高亮、查询结果智能显示、按钮操作大于命令操作;
2.Hive可视化工具客户端
DataGrip
DataGrip是由JetBrains公司推出的数据库管理软件,DataGrip支持几乎所有主流的关系数据库产品,如DB2、Derby、MySQL、Oracle、SQL Server等,也支持几乎所有主流的大数据生态圈SQL软件,并且提供了简单易用的界面,开发者上手几乎不会遇到任何困难。