系列文章目录
从零开始了解大数据(三):HDFS分布式文件系统篇-CSDN博客
目录
本文将对本专栏之前的几篇从零开始了解大数据的文章进行总结。
原因分析:
离线分析(Batch Processing):
面向过去,面向历史,分析已有的数据;
在时间维度明显成批次性变化。一周一分析(T+7),一天一分析(T+1),所以也叫做批处理。
现状分析:
实时分析(Real Time Processing | Streaming):
面向当下,分析实时产生的数据;
所谓的实时是指数据产生到数据分析到数据应用的时间间隔很短,可细分秒级、毫秒级。
预测分析:
机器学习(Machine Learning):
基于历史数据和当下产生的实时数据预测未来发生的事情;
侧重于数学算法的运用,如分类、聚类、关联、预测。
明确分析目的和思路
数据收集
数据预处理(主要包括 数据清洗、数据转化、数据提取、数据计算)
数据分析
数据展现(数据可视化)
报告撰写
Volume(数据体量大)
Variety(种类、来源多样化)
Value(低价值密度)
Velocity(速度快)
Veracity(数据的质量)
分布式:多台机器每台机器上部署不同组件
集群:多台机器每台机器上部署相同组件
特殊符号:
. 目录或文件名以 . 开始表示隐藏的文件,路径以 . 开始表示当前路径
.. 当前目录的上一级目录
~ 当前用户的home目录
/ 根目录
快捷方式:
Tab键:自动补全和提示
history命令:显示历史执行记录
显示目录内容:
ls(list files)命令:显示指定工作目录下的内容(列出目前工作目录所含文件及子目录)
-a:显示所有文件及目录
-l:显示文件名称、文件类型、权限、拥有者、文件大小等(ls -l = ll)
切换目录:
cd(change directory)命令:用于切换当前工作目录
~:表示home目录
.:表示目前所在目录
..:表示目前目录位置的上一层目录
创建、删除:
mkdir(make directory)命令:用于创建目录
-p:确保父目录名称存在,不存在则创建
touch命令:创建一个空文件
rm(remove)命令:用于删除一个文件或目录
-f:强制直接删除,无需用户确认
-r:将目录及以下所有递归逐一删除
复制、移动:
cp(copy file)命令:用于复制文件或目录
-r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件
mv(move file)命令:用于文件或目录改名,或将文件或目录移入其它位置
文件内容查看:
cat(concatenate)命令:用于连接文件并打印到标准输出设备上(适合小文件内容查看)
more命令:类似cat命令,会以一页一页的形式显示,翻页结束自动退出(适合大文件查看),按space键翻下一页,按b往回上一页
tail命令:用于查看文件的结尾部分内容
-n:用于显示行数,默认为10,即显示10行的内容
-f:用于实时显示文件动态追加的内容。会把文件里的最尾部的内容显示在屏幕上,并不断刷新,只要文件有更新,就可以看到最新的文件内容
其他:
| 管道命令:将前一个命令执行的结果作为内容交给下一个命令处理,可以形成多级管道操作
命令1 | 命令2:将命令1的结果通过命令2做进一步的处理
echo命令:用于内容的输出,将内容输出到console控制台上
> 输出重定向(覆盖)命令:
command > file :执行command然后将输出的内容存入file,file内已经存在的内容将被新内容覆盖替换
>> 输出重定向(追加)命令:
command >> file :执行command然后将输出的内容存入file,新内容追加在文件末尾
解压缩命令:
打包、解包
tar(tape archive)命令:常用于备份文件,是用来建立、还原备份文件的工具程序,可以加入、解开备份文件内的文件
-c 或 - -create :建立新的备份文件
-x 或 - -extract 或- -get :从备份文件中还原文件
-v 或- -verbose :显示指令执行过程
-f <备份文件> 或 - -file=<备份文件> :指定备份文件
打包压缩、解包解压缩
在打包备份或者解包的过程中,可以通过指定压缩算法,对打包的文件进行压缩,解压的时候也需要指定相应的算法
-z 或 - -gzip 或 - -ungzip :通过gzip指令处理备份文件
最重要的搭配:tar -zxvf xxxxx.tar.gz
时间、日期查看:
date命令:用来显示或设定系统的日期与时间,格式设定为一个加号后接数个标记
cal(calendar)命令:用于显示当前或指定日期的公历
内存、磁盘使用率查看:
free命令:用于显示内存状态。会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等
df(disk free)命令:用于显示目前在linux系统上的文件系统磁盘使用情况统计
进程查看:
ps(process status)命令:用于显示当前进程的状态
jps命令:JDK自带的命令,用于查看本机运行的Java进程情况
打开与新建文件:
vim / path / file
如果文件不存在,则新建文件,编辑器左下角提示 new file
如果文件存在,则打开文件,进入命令模式
vim编辑器3种工作模式:
命令模式(Command mode):
所敲的按键编辑器都理解为命令,以命令驱动执行不同的功能
不能自由进行文本编辑
输入模式(Insert mode):
编辑模式、插入模式
可以对文件内容进行自由编辑
底线命令模式(Last line mode):
以 : 开始,通常用于文件的保存、退出
命令模式<- ->输入模式:
i :进入到编辑输入模式后,定位到当前光标前面
o :进入到编辑输入模式后,在当前行的后面添加一行空行
输入模式下按ESC退回到命令模式
命令模式<- ->底线命令模式:
在命令模式下,输入 : 进入底线命令模式
常用的底线命令:
: q 退出
: w 保存
: wq 保存退出
: wq! 强制保存退出
命令模式下按shift + zz ,可以实现快速的保存退出
vim基本操作命令:
光标移动:
方向键控制移动
翻页 pageup pagedown
行首(home 或 0) 行尾(end 或 $)
跳到文件最后一行 G
跳到文件第一行 gg
复制粘贴:
复制:
yy:复制光标当前所在行内容
nyy:复制当前行往下 n 行
粘贴:
p:当前行的下一行粘贴
P:当前行的上一行粘贴
删除、撤销:
删除:
dd:删除光标所在当前行内容
ndd:删除当前行往下 n 行
撤销、反撤销:
u:撤销上一步的操作
ctrl + r:反撤销
Hadoop集群包括两个集群:HDFS集群、YARN集群
两个集群逻辑上分离,通常物理上在一起
两个集群都是标准的主从架构集群
HDFS集群(分布式存储):
主角色:NameNode
从角色:DataNode
主角色辅助角色:SecondaryNameNode
YARN集群(资源管理、调度):
主角色:ResourceManager
从角色:NodeManager
手动逐个进程启停:
每台机器上每次手动启动关闭一个角色进程,可以精准控制每个进程启停,避免群起群停
HDFS集群
?
YARN集群
?
shell脚本一键启停:
在node1上,使用软件自带的shell脚本一键启动(前提:配置好机器之间的SSH免密登录和workers文件)
HDFS集群
start-dfs.sh
stop-dfs.sh
YARN集群
start-yarn.sh
stop-yarn.sh
Hadoop集群
start-all.sh
stop-all.sh
进程状态、日志查看:
启动完毕后可使用 jps 命令查看进程是否启动成功
Hadoop启动日志路径:/export/server/hadoop-3.3.0/logs/
HDFS集群:
其中namenode_host是namenode运行所在机器的主机名或ip
如果使用主机名访问,需要在windows配置hosts
YARN集群:
地址:http://resourcemanager_host:8080
其中resourcemanager_host是resourcemanager运行所在机器的主机名或ip
如果使用主机名访问,需要在windows配置hosts
数据
指存储的内容本身,如文件、视频、图片等
元数据
元数据(metadata)又称为解释性数据,记录数据的数据;
文件系统元数据一般指文件大小、最后修改时间、底层存储位置、属性、所属用户、权限等信息
分布式存储
元数据记录
分块存储
副本机制
大部分HDFS应用对文件要求的是write-one-read-many访问模型,一个文件一旦创建、写入、关闭之后就不需要修改了
移动计算的代价比移动数据的代价低
HDFS被设计为可从一个平台轻松移植到另一个平台
主从架构:
HDFS集群是标准的master/slave主从架构集群
一般一个HDFS集群由一个Namenode和一定数目的Datanode组成
Namenode是HDFS主节点,Datanode是HDFS从节点,两种角色各司其职、共同协调完成分布式的文件存储服务
官方架构图中是一主五从模式,其中五个从角色位于两个机架(Rack)的不同服务器上
分块存储:
HDFS中的文件在物理上是分块存储(block)的,默认大小为128M,不足128M则本身为一块
块的大小可以通过配置参数来规定,参数位于hdfs-default.xml中:dfs.blocksize
副本机制:
文件的所有block都会有副本。副本系数可以在文件创建的时候指定,也可以在之后通过命令改变
副本数由参数dfs.replication控制,默认值是3,即会额外再复制2份,连同本身总共3份副本
元数据管理:
在HDFS中,Namenode管理的元数据具有两种类型:
文件自身属性信息:
文件名称、权限、修改时间、文件大小、复制因子、数据块大小
文件块位置映射信息
记录文件快和DataNode之间的映射信息,即哪个块位于哪个节点上
namespace:
HDFS支持传统的层次型文件组织结构。用户可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件
Namenode负责维护文件系统的namespace名称空间,任何对文件系统名称空间或属性的修改都将被Namenode记录下来
HDFS会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件
命令行界面(command-line interface,缩写:CLI),指用户通过键盘输入指令,计算机接收到指令后,予以执行一种人际交互方式
Hadoop提供了以文件系统的shell命令客户端:hadoop fs [generic options]
文件系统协议:
HDFS Shell CLI支持操作多种文件系统,包括本地文件系统(file:///)、分布式文件系统(hdfs://nn:8020)等
具体操作的是什么文件系统取决于命令中文件路径URL中的前缀协议
如果没有前缀协议,则将会读取环境变量中的fs.defaultFS属性,以该属性值作为默认文件系统
?
创建文件夹:
hadoop fs -mkdir [-p] <path> …
path:待创建的目录
-p:沿着路径创建父目录
查看指定目录下的内容:
hadoop fs -ls [-h] [-R] [<path> …]
path:指定目录路径
-h:人性化显示文件size
-R:递归查看指定目录及其子目录
上传文件到HDFS指定目录下:
hadoop fs -put [-f] [-p] <localsrc> … <dst>
-f:覆盖目标文件
-p:保留访问时间、修改时间、所有权和权限
localsrc:本地文件系统(客户端所在机器)
dst:目标文件系统(HDFS)
查看HDFS文件内容:
hadoop fs -cat <src> …
读取指定文件全部内容,显示在标准输出控制台
(注意:大文件内容读取慎用)
下载HDFS文件:
Hadoop fs -get [-f] [-p] <src> … <localdst>
下载文件到本地文件系统指定目录,localdst必须是目录
-f:覆盖目标文件
-p:保留访问时间、修改时间、所有权和权限
拷贝HDFS文件:
hadoop fs -cp [-f] <src> … <dst>
-f:覆盖目标文件
追加数据到HDFS文件中:
hadoop fs -appendToFile <localsrc> … <dst>
将所有给定本地文件的内容追加到给定dst文件
dst如果文件不存在,将创建该文件
如果<localsrc>为-,则输入为从标准输入中读取
HDFS数据移动操作:
hadoop fs -mv <src> … <dst>
移动文件到指定文件夹下
可以使用该命令移动数据,重命名文件的名称
主角色:namenode
NameNode是Hadoop分布式文件系统的核心,架构中的主角色
NameNode维护和管理文件系统元数据,包括名称空间目录树结构、文件和块的位置信息、访问权限等信息
NameNode是访问HDFS的唯一入口
NameNode内部通过内存和磁盘文件两种方式管理元数据
其中磁盘上的元数据文件包括Fsimage内存元数据镜像文件和edits log(Journal)编辑日志
从角色:datanode
DataNode是Hadoop HDFS中的从角色,负责具体的数据块存储
DataNode的数量决定了HDFS集群的整体数据存储能力,通过和NameNode配合维护着数据块
主角色辅助角色: secondarynamenode
SecondaryNameNode充当NameNode的辅助节点,但不能替代NameNode
主要是帮助主角色进行元数据文件的合并动作
namenode职责:
NameNode仅存储HDFS的元数据:文件系统中所有文件的目录树,并跟踪整个集群中的文件,不存储实际数据
NameNode知道HDFS中任何给定文件的块列表及其位置,使用此信息NameNode知道如何从块中构建文件
NameNode不持久化存储每个文件中各个块所在的datanode的位置信息,这些信息会在系统启动时从DataNode 重建
NameNode是Hadoop集群中的单点故障
NameNode所在机器通常会配置有大量内存(RAM)
datanode职责:
DataNode负责最终数据块block的存储,是集群的从角色,也称为Slave
DataNode启动时,会将自己注册到NameNode并汇报自己负责持有的块列表
当某个DataNode关闭时,不会影响数据的可用性, NameNode将安排由其他DataNode管理的块进行副本复制
DataNode所在机器通常配置有大量的硬盘空间,因为实际数据存储在DataNode中
写数据完整流程图:
?
Pipeline管道
Pipeline管道是HDFS在上传文件写数据过程中采用的一种数据传输方式
客户端将数据块写入第一个数据节点,第一个数据节点保存数据之后再将块复制到第二个数据节点,后者保存后将其复制到第三个数据节点
数据以管道的方式,顺序的沿着一个方向传输,这样能够充分利用每个机器的带宽,避免网络瓶颈和高延迟时的连接,最小化推送所有数据的延时
在线性推送模式下,每台机器所有的出口宽带都用于以最快的速度传输数据,而不是在多个接受者之间分配宽带
ACK应答响应
ACK (Acknowledge character)即确认字符,在数据通信中,接收方发给发送方的一种传输类控制字符。表示发来的数据已确认接收无误
在HDFS pipeline管道传输数据的过程中,传输的反方向会进行ACK校验,确保数据传输安全
默认3副本存储策略
默认副本存储策略是由BlockPlacementPolicyDefault指定
第一块副本:优先客户端本地,否则随机
第二块副本:不同于第一块副本的不同机架
第三块副本:第二块副本相同机架不同机器
完整流程:
HDFS客户端创建对象实例DistributedFileSystem, 该对象中封装了与HDFS文件系统操作的相关方法
调用DistributedFileSystem对象的create()方法,通过RPC请求NameNode创建文件。 NameNode执行各种检查判断:目标文件是否存在、父目录是否存在、客户端是否具有创建该文件的权限。检查通过,NameNode就会为本次请求记下一条记录,返回FSDataOutputStream输出流对象给客户端用于写数据
客户端通过FSDataOutputStream输出流开始写入数据
客户端写入数据时,将数据分成一个个数据包(packet 默认64k), 内部组件DataStreamer请求NameNode挑选出适合存储数据副本的一组DataNode地址,默认是3副本存储。DataStreamer将数据包流式传输到pipeline的第一个DataNode,该DataNode存储数据包并将它发送到pipeline的第二个DataNode。同样,第二个DataNode存储数据包并且发送给第三个(也是最后一个)DataNode
传输的反方向上,会通过ACK机制校验数据包传输是否成功
客户端完成数据写入后,在FSDataOutputStream输出流上调用close()方法关闭
DistributedFileSystem联系NameNode告知其文件写入完成,等待NameNode确认。 因为namenode已经知道文件由哪些块组成(DataStream请求分配数据块),因此仅需等待最小复制块即可成功返回。最小复制是由参数dfs.namenode.replication.min指定,默认是1
读数据完整流程图:
?
完整流程:
HDFS客户端创建对象实例DistributedFileSystem, 调用该对象的open()方法来打开希望读取的文件
DistributedFileSystem使用RPC调用namenode来确定文件中前几个块的块位置(分批次读取)信息。 对于每个块,namenode返回具有该块所有副本的datanode位置地址列表,并且该地址列表是排序好的,与客户端的网络拓扑距离近的排序靠前
DistributedFileSystem将FSDataInputStream输入流返回到客户端以供其读取数据
客户端在FSDataInputStream输入流上调用read()方法。然后,已存储DataNode地址的InputStream连接到文件中第一个块的最近的DataNode。数据从DataNode流回客户端,结果客户端可以在流上重复调用read()
当该块结束时,FSDataInputStream将关闭与DataNode的连接,然后寻找下一个block块的最佳datanode位置。这些操作对用户来说是透明的。所以用户感觉起来它一直在读取一个连续的流
一旦客户端完成读取,就对FSDataInputStream调用close()方法
MapReduce的思想核心是“先分再合,分而治之”,即把一个复杂的问题,按照一定的“分解”方法分为等价的规模较小的若干部分,然后逐个解决,分别找出各部分的结果,然后把各部分的结果组成整个问题的最终结果
Map表示第一阶段,负责“拆分”:即把复杂的任务分解为若干个“简单的子任务”来并行处理。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系
Reduce表示第二阶段,负责“合并”:即对map阶段的结果进行全局汇总
如何对付大数据处理场景
对相互间不具有计算依赖关系的大数据计算任务,实现并行最自然的办法就是采取MapReduce分而治之的策略
首先Map阶段进行拆分,把大数据拆分成若干份小数据,多个程序同时并行计算产生中间结果,然后是Reduce聚合阶段,通过程序对并行的结果进行最终的汇总计算,得出最终的结果
不可拆分的计算任务或相互间有依赖关系的数据无法进行并行计算
构建抽象编程模型
MapReduce借鉴了函数式语言中的思想,用Map和Reduce两个函数提供了高层的并行编程抽象模型
map: 对一组数据元素进行某种重复式的处理
reduce: 对Map的中间结果进行某种进一步的结果整理
MapReduce中定义了如下的Map和Reduce两个抽象的编程接口,由用户去编程实现:
map: (k1; v1) → (k2; v2)
reduce: (k2; [v2]) → (k3; v3)
MapReduce处理的数据类型是<key,value>键值对
统一架构、隐藏底层细节
MapReduce特点:
易于编程:
Mapreduce框架提供了用于二次开发的接口,简单地实现一些接口,就可以完成一个分布式程序。任务计算交给计算框架去处理,将分布式程序部署到hadoop集群上运行,集群节点可以扩展到成百上千个等
良好的扩展性:
当计算机资源不能得到满足的时候,可以通过增加机器来扩展它的计算能力。基于MapReduce的分布式计算的特点可以随节点数目增长保持近似于线性的增长,这个特点是MapReduce处理海量数据的关键,通过将计算节点增至几百或者几千可以很容易地处理数百TB甚至PB级别的离线数据
高容错性:
Hadoop集群是分布式搭建和部署的,任何单一机器节点宕机了,它可以把上面的计算任务转移到另一个节点上运行,不影响整个作业任务得完成,过程完全是由Hadoop内部完成的
适合海量数据的离线处理:
可以处理GB、TB和PB级别的数据量
MapReduce局限性:
实时计算性能差:
MapReduce主要应用于离线作业,无法做到秒级或者是亚秒级的数据响应
不能进行流式计算:
流式计算特点是数据是源源不断的计算,并且数据是动态的,而MapReduce作为一个离线计算框架,主要是针对静态数据集的,数据是不能动态变化的
MapReduce实例进程:
一个完整的MapReduce程序在分布式运行时有三类:
MRAppMaster:负责整个MR程序的过程调度及状态协调
MapTask:负责map阶段的整个数据处理流程
ReduceTask:负责reduce阶段的整个数据处理流程
阶段组成:
一个MapReduce编程模型中只能包含一个Map阶段和一个Reduce阶段,或者只有Map阶段
不能有诸如多个map阶段、多个reduce阶段的情景出现
如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序串行运行
MapReduce数据类型:
整个MapReduce程序中,数据都是以kv键值对的形式流转的
MapReduce整体执行流程图:
?
Map阶段执行过程:
第一阶段:把输入目录下文件按照一定的标准逐个进行逻辑切片,形成切片规划,默认Split size = Block size(128M),每一个切片由一个MapTask处理(getSplits)
第二阶段:对切片中的数据按照一定的规则读取解析返回对,默认是按行读取数据,key是每一行的起始位置偏移量,value是本行的文本内容(TextInputFormat)
第三阶段:调用Mapper类中的map方法处理数据,每读取解析出来的一个 ,调用一次map方法
第四阶段:按照一定的规则对Map输出的键值对进行分区partition,默认不分区,因为只有一个reducetask,分区的数量就是reducetask运行的数量
第五阶段:Map输出数据写入内存缓冲区,达到比例溢出到磁盘上,溢出spill的时候根据key进行排序sort,默认根据key字典序排序
第六阶段:对所有溢出文件进行最终的merge合并,成为一个文件
Reduce阶段执行过程:
第一阶段:ReduceTask会主动从MapTask复制拉取属于需要自己处理的数据
第二阶段:把拉取来的数据,全部进行合并merge,即把分散的数据合并成一个大的数据,再对合并后的数据排序
第三阶段:对排序后的键值对调用reduce方法,键相等的键值对调用一次reduce方法,最后把这些输出的键值对写入到HDFS文件中
shuffle概念:
在MapReduce中,Shuffle指的是将map端的无规则输出按指定的规则“打乱”成具有一定规则的数据,以便reduce端接收处理
一般把从Map产生输出开始到Reduce取得数据作为输入之前的过程称作shuffle
?
Map端Shuffle:
Collect阶段:将MapTask的结果收集输出到默认大小为100M的环形缓冲区,保存之前会对key进行分区的计算,默认Hash分区
Spill阶段:当内存中的数据量达到一定的阀值的时候,就会将数据写入本地磁盘,在将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了combiner,还会将有相同分区号和key的数据进行排序
Merge阶段:把所有溢出的临时文件进行一次合并操作,以确保一个MapTask最终只产生一个中间数据文件
?
Reducer端shuffle:
Copy阶段: ReduceTask启动Fetcher线程到已经完成MapTask的节点上复制一份属于自己的数据
Merge阶段:在ReduceTask远程复制数据的同时,会在后台开启两个线程对内存到本地的数据文件进行合并操作
Sort阶段:在对数据进行合并的同时,会进行排序操作,由于MapTask阶段已经对数据进行了局部的排序,ReduceTask只需保证Copy的数据的最终整体有效性即可
?
YARN简介:
Apache Hadoop YARN (Yet Another Resource Negotiator)是一种新的Hadoop资源管理器
YARN是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度
YARN功能说明:
资源管理系统:集群的硬件资源,和程序运行相关,比如内存、CPU等
调度平台:多个程序同时申请计算资源如何分配,调度的规则(算法)
通用:理论上支持各种计算程序
YARN官方架构图:
?
YARN三大组件:
集群物理层面:
ResourceManager(RM)
YARN集群中的主角色,决定系统中所有应用程序之间资源分配的最终权限,即最终仲裁者
接收用户的作业提交,并通过NM分配、管理各个机器上的计算资源
NodeManager(NM)
YARN中的从角色,一台机器上一个,负责管理本机器上的计算资源
根据RM命令,启动Container容器、监视容器的资源使用情况,并且向RM主角色汇报资源使用情况
App层面:
ApplicationMaster(AM)
用户提交的每个应用程序均包含一个AM
应用程序内的“老大”,负责程序内部各阶段的资源申请,监督程序的执行情况
核心交互流程:
MR作业提交 Client-->RM
资源的申请 MrAppMaster-->RM
MR作业状态汇报 Container(Map|Reduce Task)-->Container(MrAppMaster)
节点的状态汇报 NM-->RM
整体概述:
当用户向 YARN 中提交一个应用程序后, YARN将分两个阶段运行该应用程序
第一个阶段是客户端申请资源启动运行本次程序的ApplicationMaster
第二个阶段是由ApplicationMaster根据本次程序内部具体情况,为它申请资源,并监控它的整个运行过程,直到运行完成
MR提交YARN交互流程:
用户通过客户端向YARN中ResourceManager提交应用程序(比如hadoop jar提交MR程序)
ResourceManager为该应用程序分配第一个Container(容器),并与对应的NodeManager通信,要求它在这个Container中启动这个应用程序的ApplicationMaster
ApplicationMaster启动成功之后,首先向ResourceManager注册并保持通信,这样用户可以直接通过ResourceManage查看应用程序的运行状态
AM为本次程序内部的各个Task任务向RM申请资源,并监控它的运行状态
一旦 ApplicationMaster 申请到资源后,便与对应的 NodeManager 通信,要求它启动任务
NodeManager 为任务设置好运行环境后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务
各个任务通过某个 RPC 协议向 ApplicationMaster 汇报自己的状态和进度,以让 ApplicationMaster 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过 RPC 向 ApplicationMaster 查询应用程序的当前运行状态
应用程序运行完成后,ApplicationMaster 向 ResourceManager 注销并关闭自己
调度器策略:
三种调度器
FIFO Scheduler(先进先出调度器)、Capacity Scheduler(容量调度器)、Fair Scheduler(公平调度器)
Apache版本YARN默认使用Capacity Scheduler
如果需要使用其他的调度器,可以在yarn-site.xml中的yarn.resourcemanager.scheduler.class进行配置
FIFO Scheduler:
概述:
FIFO Scheduler是Hadoop1.x中JobTracker原有的调度器实现,此调度器在YARN中保留了下来
FIFO Scheduler是一个先进先出的思想,即先提交的应用先运行,调度工作不考虑优先级和范围,适用于负载较低的小规模集群,当使用大型共享集群时,它的效率较低且会导致一些问题
FIFO Scheduler拥有一个控制全局的队列queue,默认queue名称为default,该调度器会获取当前集群上所有的资源信息作用于这个全局的queue
优势、劣势:
优势:
无需配置、先到先得、易于执行
劣势:
任务的优先级不会变高,因此高优先级的作业需要等待
不适合共享集群
Capacity Scheduler:
概述:
Capacity Scheduler容量调度是Apache Hadoop3.x默认调度策略。该策略允许多个组织共享整个集群资源,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了
Capacity可以理解成一个个的资源队列,这个资源队列是用户自己去分配的。队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部,资源的调度是采用的是先进先出(FIFO)策略
资源队列划分:
Capacity Scheduler调度器以队列为单位划分资源,简单通俗点来说,就是一个个队列有独立的资源,队列的结构和资源是可以进行配置的
特性优势:
层次化的队列设计(Hierarchical Queues)
层次化的管理,可以更容易、更合理分配和限制资源的使用
容量保证(Capacity Guarantees)
每个队列上都可以设置一个资源的占比,保证每个队列都不会占用整个集群的资源
安全(Security)
每个队列有严格的访问控制。用户只能向自己的队列里面提交任务,而且不能修改或者访问其他队列的任务
弹性分配(Elasticity)
空闲的资源可以被分配给任何队列
当多个队列出现争用的时候,则会按照权重比例进行平衡
Fair Scheduler:
概述:
Fair Scheduler叫做公平调度,提供了YARN应用程序公平地共享大型集群中资源的另一种方式,使所有应用在平均情况下随着时间的流逝可以获得相等的资源份额
Fair Scheduler设计目标是为所有的应用分配公平的资源(对公平的定义通过参数来设置)
公平调度可以在多个队列间工作,允许资源共享和抢占
特性优势:
分层队列:队列可以按层次结构排列以划分资源,并可以配置权重以按特定比例共享集群
基于用户或组的队列映射:可以根据提交任务的用户名或组来分配队列。如果任务指定了一个队列,则在该队列中提交任务
资源抢占:根据应用的配置,抢占和分配资源可以是友好的或是强制的,默认不启用资源抢占
保证最小配额:可以设置队列最小资源,允许将保证的最小份额分配给队列,保证用户可以启动任务。当队列不能满足最小资源时,可以从其它队列抢占。当队列资源使用不完时,可以给其它队列使用。这对于确保某些用户、组或生产应用始终获得足够的资源
允许资源共享:即当一个应用运行时,如果其它队列没有任务执行,则可以使用其它队列,当其它队列有应用需要资源时再将占用的队列释放出来。所有的应用都从资源队列中分配资源
默认不限制每个队列和用户可以同时运行应用的数量:可以配置来限制队列和用户并行执行的应用数量,限制并行执行应用数量不会导致任务提交失败,超出的应用会在队列中等待
数仓概念:
数据仓库(Data Warehouse,简称数仓、DW)是一个用于存储、分析、报告的数据系统
数据仓库的目的是构建面向分析的集成化数据环境,分析结果为企业提供决策支持(Decision Support)
数仓专注分析:
数据仓库不“生产”任何数据,其数据来源于不同外部系统
数据仓库不“消费”任何数据,其结果开放给各个外部应用使用
数仓主要特征:
面向主题性(Subject-Oriented)
主题是一个抽象的概念,是较高层次上企业信息系统中的数据综合、归类并进行分析利用的抽象。在逻辑意义上,它是对应企业中某一宏观分析领域所涉及的分析对象
传统OLTP系统对数据的划分并不适用于决策分析,而基于主题组织的数据则不同,它们被划分为各自独立的领域,每个领域有各自的逻辑内涵但互不交叉,在抽象层次上对数据进行完整、一致和准确的描述
集成性(Integrated)
主题相关的数据通常会分布在多个操作型系统中,彼此分散、独立、异构
因此在数据进入数据仓库之前,必然要经过统一与综合,对数据进行抽取、清理、转换和汇总,这一步是数据仓库建设中最关键、最复杂的一步,所要完成的工作有:1.统一源数据中所有矛盾之处;2.数据综合和计算
非易失性、非异变性(Non-Volatile)
数据仓库是分析数据的平台,而不是创造数据的平台。我们是通过数仓去分析数据中的规律,而不是去创造修改其中的规律,因此数据进入数据仓库后,它便稳定且不会改变
数据仓库的数据反映的是一段相当长的时间内历史数据的内容,数据仓库的用户对数据的操作大多是数据查询或比较复杂的挖掘,一旦数据进入数据仓库以后,一般情况下被较长时间保留
数据仓库中一般有大量的查询操作,但修改和删除操作很少
时变性(Time-Variant)
数据仓库包含各种粒度的历史数据,数据可能与某个特定日期、星期、月份、季度或者年份有关
当业务变化后会失去时效性,因此数据仓库的数据需要随着时间更新,以适应决策的需要
数据仓库主流开发语言SQL:
SQL语言介绍
结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理数据
结构化数据
结构化数据也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理
SQL语法分类
SQL主要语法分为两个部分:数据定义语言 (DDL)和数据操纵语言 (DML)
DDL语法使我们有能力创建或删除表,以及数据库、索引等各种对象,但是不涉及表中具体数据操作:
CREATE DATABASE - 创建新数据库
CREATE TABLE - 创建新表
DML语法是我们有能力针对表中的数据进行插入、更新、删除、查询操作:
SELECT - 从数据库表中获取数据
UPDATE - 更新数据库表中的数据
DELETE - 从数据库表中删除数据
INSERT - 向数据库表中插入数据
Apache Hive概述:
Apache Hive是一款建立在Hadoop之上的开源数据仓库系统,可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表,基于表提供了一种类似SQL的查询模型,称为Hive查询语言(HQL),用于访问和分析存储在Hadoop文件中的大型数据集
Hive核心是将HQL转换为MapReduce程序,然后将程序提交到Hadoop群集执行
Hive利用HDFS存储数据,利用MapReduce查询分析数据
Apache Hive架构、组件:
Hive架构图:
?
Hive组件:
用户接口
包括 CLI、JDBC/ODBC、WebGUI。其中,CLI(command line interface)为shell命令行;Hive中的Thrift服务器允许外部客户端通过网络与Hive进行交互,类似于JDBC或ODBC协议,WebGUI是通过浏览器访问Hive
元数据存储
通常是存储在关系数据库如 mysql/derby中。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等
Driver驱动程序,包括语法解析器、计划编译器、优化器、执行器
完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后有执行引擎调用执行
执行引擎
Hive本身并不直接处理数据文件,而是通过执行引擎处理。当下Hive支持MapReduce、Tez、Spark3种执行引擎
Apache Hive安装部署:
Hive Metadata:
Hive Metadata即Hive的元数据
包含用Hive创建的database、table、表的位置、类型、属性,字段顺序类型等元信息
元数据存储在关系型数据库中,如hive内置的Derby、或者第三方如MySQL等
Hive Metastore:
Metastore即元数据服务。Metastore服务的作用是管理metadata元数据,对外暴露服务地址,让各种客户端通过连接metastore服务,由metastore再去连接MySQL数据库来存取元数据
有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接metastore 服务即可。某种程度上也保证了hive元数据的安全
metastore配置方式:
metastore服务配置有3种模式:内嵌模式、本地模式、远程模式
?
metastore远程模式:
在生产环境中,建议用远程模式来配置Hive Metastore。在这种情况下,其他依赖hive的软件都可以通过Metastore访问hive,还可以完全屏蔽数据库层,带来了更好的可管理性和安全性
Apache Hive部署实战:
安装前准备:
由于Apache Hive是一款基于Hadoop的数据仓库软件,通常部署运行在Linux系统之上。因此不管使用何种方式配置Hive Metastore,必须要先保证服务器的基础环境正常,Hadoop集群健康可用
服务器基础环境:
集群时间同步、防火墙关闭、主机Host映射、免密登录、JDK安装
Hadoop集群健康可用:
启动Hive之前必须先启动Hadoop集群。特别要注意,需等待HDFS安全模式关闭之后再启动运行Hive
Hive不是分布式安装运行的软件,其分布式的特性主要借由Hadoop完成,包括分布式存储、分布式计算
Hadoop与Hive整合:
因为Hive需要把数据存储在HDFS上,并且通过MapReduce作为执行引擎处理数据,因此需要在Hadoop中添加相关配置属性,以满足Hive在Hadoop上运行
修改Hadoop中core-site.xml,并且Hadoop集群同步配置文件,重启生效
?
Step1:MySQL安装
MySQL只需要在一台机器安装并且需要授权远程访问
Step2:上传解压Hive安装包(node1安装即可)
?
Step3:修改hive-env.sh
?
Step4:新增hive-site.xml
?
?
Step5:添加驱动、初始化
上传MySQL JDBC驱动到Hive安装包lib路径下 mysql-connector-java-5.1.32.jar
初始化Hive的元数据
?
metastore服务启动方式:
前台启动,进程会一直占据终端,ctrl + c结束进程,服务关闭。可以根据需求添加参数开启debug日志,获取详细日志信息,便于排错
#前台启动 关闭ctrl+c
/export/server/apache-hive-3.1.2-bin/bin/hive --service metastore
#前台启动开启debug日志
/export/server/apache-hive-3.1.2-bin/bin/hive --service metastore --hiveconf hive.root.logger=DEBUG,console
后台启动,输出日志信息在/root目录下nohup.out
#后台启动 进程挂起 关闭使用jps+ kill -9
nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore &
Apache Hive客户端使用:
Hive自带客户端:
bin/hive、bin/beeline
第一代客户端(deprecated不推荐使用):$HIVE_HOME/bin/hive, 是一个 shellUtil。主要功能:一是可用于以交互或批处理模式运行Hive查询;二是用于Hive相关服务的启动,比如metastore服务
第二代客户端(recommended 推荐使用):$HIVE_HOME/bin/beeline,是一个JDBC客户端,是官方强烈推荐使用的Hive命令行工具,和第一代客户端相比,性能加强安全性提高
关系梳理:
HiveServer2通过Metastore服务读写元数据。所以在远程模式下,启动HiveServer2之前必须先首先启动metastore服务
远程模式下,Beeline客户端只能通过HiveServer2服务访问Hive,而bin/hive是通过Metastore服务访问的
Hive客户端和服务的关系图:
?
bin/beeline客户端使用:
在hive安装的服务器上,首先启动metastore服务,然后启动hiveserver2服务
#先启动metastore服务,然后启动hiveserver2服务
nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore &
nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service hiveserver2 &
hiveserver2服务启动之后需要稍等一会才可以对外提供服务
Beeline是JDBC的客户端,通过JDBC协议和Hiveserver2服务进行通信,协议的地址是:jdbc:hive2://node1:10000
Hive SQL之数据库与建库:
SQL中DDL语法的作用:
数据定义语言 (Data Definition Language, DDL),是SQL语言集中对数据库内部的对象结构进行创建,删除,修改等的操作语言,这些数据库对象包括database、table等
DDL核心语法由CREATE、ALTER与DROP三个所组成,DDL并不涉及表内部数据的操作
数据库database:
在Hive中,默认的数据库叫做default,存储数据位置位于HDFS的/user/hive/warehouse下
用户自己创建的数据库存储位置是/user/hive/warehouse/database_name.db下
create database:
create database用于创建新的数据库
COMMENT:数据库的注释说明语句
LOCATION:指定数据库在HDFS存储位置,默认/user/hive/warehouse/dbname.db
WITH DBPROPERTIES:用于指定一些数据库的属性配置
?
use database:
选择特定的数据库
drop database:
删除数据库
默认行为是RESTRICT,这意味着仅在数据库为空时才删除它
要删除带有表的数据库(不为空的数据库),我们可以使用CASCADE
?
Hive SQL之表与建表:
建表语法:
CREATE TABLE [IF NOT EXISTS] [db_name.]table_name
(col_name data_type [COMMENT col_comment], ... )
[COMMENT table_comment]
[ROW FORMAT DELIMITED …];
注意事项:
[ ]中括号的语法表示可选
建表语句中的语法顺序要和语法中顺序保持一致
分隔符指定语法:
ROW FORMAT DELIMITED语法用于指定字段之间等相关的分隔符
LazySimpleSerDe是Hive默认的,包含4种子语法,分别用于指定字段之间、集合元素之间、map映射 kv之间、换行的分隔符号
?
Hive默认分隔符:
Hive建表时如果没有row format语法指定分隔符,则采用默认分隔符
默认的分割符是' \001 ',是一种特殊的字符,使用的是ASCII编码的值,键盘打不出来
在vim编辑器中,连续按下Ctrl+v/Ctrl+a即可输入'\001' ,显示^A
在一些文本编辑器中将以SOH的形式显示
Hive SQL-DML-Load加载数据:
Load语法功能:
将数据文件移动到与Hive表对应的位置,移动时是纯复制、移动操作
纯复制、移动指在数据load加载到表中时,Hive不会对表中的数据内容进行任何转换,任何操作
Load语法规则:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename;
语法规则之filepath:
filepath表示待移动数据的路径。可以指向文件(在这种情况下,Hive将文件移动到表中),也可以指向目录(在这种情况下,Hive将把该目录中的所有文件移动到表中)
filepath文件路径支持下面三种形式,要结合LOCAL关键字一起考虑:
1.相对路径,例如:project/data1
2.绝对路径,例如:/user/hive/project/data1
3.具有schema的完整URI,例如:hdfs://namenode:9000/user/hive/project/data1
语法规则之LOCAL:
指定LOCAL,将在本地文件系统中查找文件路径
若指定相对路径,将相对于用户的当前工作目录进行解释
用户也可以为本地文件指定完整的URI,例如:file:///user/hive/project/data1
没有指定LOCAL关键字
如果filepath指向的是一个完整的URI,会直接使用这个URI
如果没有指定schema,Hive会使用在hadoop配置文件中参数fs.default.name指定的
LOCAL本地:
本地文件系统指的是Hiveserver2服务所在机器的本地Linux文件系统,不是Hive客户端所在的本地文件系统
Hive SQL -DML -Insert插入数据:
Insert语法功能:
Hive官方推荐加载数据的方式:清洗数据成为结构化文件,再使用Load语法加载数据到表中
也可以使用insert语法把数据插入到指定的表中,最常用的配合是把查询返回的结果插入到另一张表中
insert+select:
insert+select表示:将后面查询返回的结果作为内容插入到指定表中
需要保证查询结果列的数目和需要插入数据表格的列数目一致
如果查询出来的数据类型和插入表格对应的列数据类型不一致,将会进行转换,但是不能保证转换一定成功,转换失败的数据将会为NULL
INSERT INTO TABLE tablename select_statement1 FROM from_statement;
Hive SQL select语法:
Select语法:
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[ORDER BY col_list]
[LIMIT [offset,] rows];
select_expr:
select_expr表示检索查询返回的列,必须至少有一个select_expr
ALL 、DISTINCT:
用于指定查询返回结果中重复的行如何处理
1.如果没有给出这些选项,则默认值为ALL(返回所有匹配的行)
2.DISTINCT指定从结果集中删除重复的行
WHERE:
WHERE后面是一个布尔表达式(结果要么为true,要么为false),用于查询过滤,当布尔表达式为true时,返回select后面expr表达式的结果,否则返回空
在WHERE表达式中,可以使用Hive支持的任何函数和运算符,但聚合函数除外
聚合操作:
SQL中拥有很多可用于计数和计算的内建函数,其使用的语法是:SELECT function(列) FROM 表
聚合函数的最大特点是不管原始数据有多少行记录,经过聚合操作只返回一条数据,这一条数据就是聚合的结果
常见的聚合操作函数:
?
GROUP BY:
概念:
GROUP BY语句用于结合聚合函数,根据一个或多个列对结果集进行分组
如果没有group by语法,则表中的所有行数据当成一组
语法限制:
出现在GROUP BY中select_expr的字段,要么是GROUP BY分组的字段,要么是被聚合函数应用的字段(避免出现一个字段多个值的歧义)
HAVING:
在SQL中增加HAVING子句原因是,WHERE关键字无法与聚合函数一起使用
HAVING子句可以让我们筛选分组后的各组数据,并且可以在Having中使用聚合函数,因为此时where,group by已经执行结束,结果集已经确定
HAVING与WHERE区别:
having是在分组后对数据进行过滤,where是在分组前对数据进行过滤
having后面可以使用聚合函数,where后面不可以使用聚合函数
ORDER BY:
ORDER BY 语句用于根据指定的列对结果集进行排序
ORDER BY 语句默认按照升序(ASC)对记录进行排序,如果希望按照降序对记录进行排序,可以使用DESC关键字
LIMIT:
LIMIT用于限制SELECT语句返回的行数
LIMIT接受一个或两个数字参数,这两个参数都必须是非负整数常量
第一个参数指定要返回的第一行的偏移量(从 Hive 2.0.0开始),第二个参数指定要返回的最大行数,当给出单个参数时,它代表最大行数,并且偏移量默认为0
执行顺序:
在查询过程中执行顺序:from > where > group(含聚合)> having >order > select
聚合语句(sum,min,max,avg,count)要比having子句优先执行
where子句在查询过程中执行优先级别优先于聚合语句(sum,min,max,avg,count)
Hive Join语法规则:
在Hive中,使用最多,最重要的两种join分别是:inner join(内连接)、left join(左连接)
语法:
-- 内连接
join_table:
table_reference [INNER] JOIN table_factor [join_condition]
-- 左连接
join_table:
table_reference {LEFT} [OUTER] JOIN table_reference join_condition
table_reference:是join查询中使用的表名
table_factor:与table_reference相同,是联接查询中使用的表名
join_condition:join查询关联的条件,如果在两个以上的表上需要连接,则使用AND关键字
join_condition: ON expression
inner join 内连接:
inner join == join
只有进行连接的两个表中都存在与连接条件相匹配的数据才会被留下来
left join 左连接:
left join中文为左外连接(Left Outer Join)或者左连接,其中outer可以省略
join时以左表的全部数据为准,右边与之关联,左表数据全部返回,右表关联上的显示返回,关联不上的显示null返回
Hive 函数概述及分类标准:
Hive内建了不少函数,用于满足用户不同使用需求,提高SQL编写效率:
使用show functions查看当下可用的所有函数
通过describe function extended funcname来查看函数的使用方式
分类标准:
Hive的函数分为两大类:内置函数(Built-in Functions)、用户定义函数UDF(User-Defined Functions)
内置函数可分为:数值类型函数、日期类型函数、字符串类型函数、集合函数、条件函数等
用户定义函数根据输入输出的行数可分为3类:UDF、UDAF、UDTF
用户定义函数UDF分类标准:
根据函数输入输出的行数:
UDF(User-Defined-Function):普通函数,一进一出
UDAF(User-Defined Aggregation Function):聚合函数,多进一出
UDTF(User-Defined Table-Generating Functions):表生成函数,一进多出
UDF分类标准扩大化:
UDF分类标准可以扩大到Hive的所有函数中,包括内置函数和用户自定义函数
Hive 常用的内置函数:
String Functions 字符串函数:
?
?
Date Functions 日期函数
?
Mathematical Functions 数学函数
?
Conditional Functions 条件函数
主要用于条件判断、逻辑判断转换这样的场合
?
本文对本专栏之前的几篇从零开始了解大数据的文章进行了总结,希望对大家有所帮助。