实训笔记7.26
7.26笔记
一、Hadoop大数据开发技术
Hadoop是大数据中一个技术框架,内置了很多组件,解决了很多大数据业务下的数据处理和数据存储的场景。
Hadoop整体四部分组成的:HDFS、MapReduce、YARN、Hadoop Common
1.1 Hadoop的安装部署
- 本地安装模式
- 伪分布安装模式
- 完全分布安装模式
- HA高可用安装模式:借助Zookeeper软件才能实现
修改配置文件:
hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-env.sh、mapred-site.xml、yarn-site.xml、yarn-env.sh、workers、log4j.properties、capacity-scheduler.xml、dfs.hosts、dfs.hosts.exclude
1.2 Hadoop的分布式文件存储系统HDFS
1.2.1 HDFS的组成
- NameNode
- DataNode
- block块
- block块的副本数
- SecondaryNameNode
1.2.2 HDFS的操作方式
-
HDFS的命令行操作
-
HDFS的Java API操作
1.2.3 HDFS的流程原理
- HDFS的上传/下载数据的流程和原理
- HDFS的NameNode和SecondaryNameNode的原理
- SNN检查点机制问题:两个触发条件
- edits文件、fsimage文件
- HDFS的NN节点的数据恢复
- HDFS的NameNode和DataNode的工作原理
- 心跳机制问题:默认时间 3s
- NN认为DN断线的机制:掉线超时时长 2心跳的检测时间(5分钟)+10心跳时间
1.2.4 HDFS核心概念
HDFS的安全模式safemode:开启的时机、关闭的时机
Hadoop集群的新节点的服役和旧节点的退役(HDFS、YARN)
1.3 Hadoop的分布式资源调度系统YARN
1.3.1 YARN的组成
- ResourceManager
- NodeManager
- Container
- ApplicationMaster
- Task:申请资源的操作RM封装为Task
1.3.2 YARN的工作流程
1.3.3 YARN的任务调度器
- FIFO调度器
- 容量调度器
- 公平调度器
YARN只负责分配资源,不清楚计算程序的运行逻辑,程序运算逻辑YARN要求分布式程序必须启动一个AM来具体负责,YARN不负责,因此,只要一个分布式计算程序满足YARN的运行规则,都可以在YARN上进行运行。
1.4 Hadoop的分布式计算框架MapReduce
1.4.1 MapReduce的应用场景
- 离线数据处理的场景下:数据对实时性要求不高(MR程序运行中涉及到大量的磁盘IO和网络传输,因此会导致MR程序计算效率“不是很高”)
- 适用于数据量比较庞大的文件,小文件操作不占优势,处理TB/PB级别规模的数据
1.4.2 MapReduce的运行中核心组件
-
InputFormat
- 切片、kv读取
- 常用实现类的切片和KV读取规则
- 如何自定义InputFormat
-
Mapper
- map方法的执行方式:一组kv执行一次,一组kv在常用实现类当中都是一行数据为一组kv
- 环形缓冲区的问题
- maptask的数量和切片的关系
-
Partitioner组件
-
负责进行map输出数据的分区
-
默认分区机制
reduceTask=1
reduceTask>1
-
自定义分区机制
-
-
WritableComparable
负责对map输出的kv数据进行排序的
mr阶段发生几次排序,每次排序的执行时机以及排序使用的算法
-
Combiner组件
对map阶段输出的数据进行局部汇总,Combiner不是所有的MR程序都能添加,Combiner的添加不能影响原先MR程序的执行逻辑
-
WritableComparator组件(可选)
负责分组排序的,reduce在把数据拉取回来以后,需要根据key值来进行分组,哪些key我们认为是一组相同的key,可以通过辅助排序(分组排序)来决定
-
Reduce组件
reduce主要对map输出的数据进行全局汇总,汇总把相同的key值的value数据聚合起来,然后一组相同的key值调用一次reduce方法
reduceTask的数量我们可以手动设置的,设置的时候主要和分区的关系
-
OutputFormat组件
指定了MR程序输出数据时的输出规则
OutputFormat常用实现类
SequenceFile文件的相关概念
自定义OutpoutFormat
1.4.3 MapReduce的详细工作流程
Job提交资源的流程(源码)
资源提交成功以后,剩余的流程按照组件的顺序依次执行
1.4.4 MapReduce中压缩机制问题
MapReduce运行过程中,可以在三个位置对数据进行压缩:Mapper输入阶段,Mapper的输出阶段、Reducer的输出阶段
-
MR程序中提供的压缩机制有哪些(压缩算法)
-
default
-
gzip
-
bzip2
-
LZ4
-
Snappy
1~5:Hadoop的Linux环境都给提供了
-
LZO
没有给提供
-
-
MR程序中如何对三个位置开启压缩机制
-
Map的输入:
io.compression.codecs
-
map的输出:
mapreduce.map.output.compress mapreduce.map.output.compress.codec
-
reduce的输出:
FileOutputFormat.xxxxxx
-
1.4.5 MapReduce的特殊应用
- MapReduce中join操作
- mapjoin
- reducejoin
- MapReduce中计数器的应用
- MapReduce实现数据清洗特殊应用
1.4.6 MapReduce中的优化问题
MapReduce虽然是大数据中一个分布式计算框架,确实可以计算海量的数据,但是MR程序在运算过程中涉及到大量的磁盘IO和网络传输,所以导致MR程序的运行效率相比于其他大数据计算框架效率不是很高。
因此开发MapReduce程序的时候,为了让MR效率提高一点,可以对MR程序运行过程中的一些问题进行优化,尽可能的提升MR的计算效率。
-
MpReduce导致计算运行缓慢的原因
- 硬件受限制
- 内存、CPU、硬盘的IO读写速度
- 掏钱解决
- MR运行机制限制
- 数据倾斜问题
- MapTask、ReduceTask的任务数量设置
- MR运行过程中小文件过多
- MR运行过程中磁盘溢写,磁盘IO次数过多
- 硬件受限制
-
MapReduce的运行优化解决问题
-
Mapper输入阶段优化的措施
可能产生的问题:小文件过多、数据倾斜、某些大文件不可被切割
- 小文件过多的问题:CombinerTextInputFormat实现小文件的合并,减少小切片出现
- 文件不可被切割,可以在MR程序处理之前,对文件数据重新进行压缩,压缩的时候选择可以被切片的压缩机制进行压缩
- map阶段的数据倾斜问题:合理的使用切片机制对输入的数据进行切片
- 合理的使用压缩机制
-
Mapper阶段优化的措施
可能产生的问题:环形缓冲区溢写的次数过多,溢写文件的合并次数过多,溢写和合并都涉及到磁盘IO
-
溢写次数过多,那么加大环形缓冲区的容量以及溢写的阈值。
//环形缓冲区的容量 mapred-site.xml/Configuration mapreduce.task.io.sort.mb //溢写的比例 小数 mapreduce.map.sort.spill.percent
-
溢写的小文件并不是只合并一次,如果溢写的小文件超过设置的指定数量,先进行一次合并
mapreduce.task.io.sort.factor 默认值10
-
可以合理的利用的Mapper输出压缩,减少mapper输出的数据量
-
在不干扰MR逻辑运行的前提下,合理的利用的Combiner组件对Map端的数据进行局部汇总,可以减少Mapper输出的数据量
-
-
Reduce阶段的优化措施
产生的问题:reduce的任务数设置不合理,Reduce端的数据倾斜问题、Reduce阶段拉取数据回来之后先写到内存中,内存放不下溢写磁盘(磁盘IO)。
- 任务书设置和数据倾斜问题:可以通过查看MR程序运行的计数器,自定义分区机制重新指定分区规则
- 尽量不使用Reduce阶段
- MR程序中,默认如果Map任务运行没有结束,那么Reduce任务就无法运行。可以设置map任务和reduce任务共存(map任务没有全部运行结束,reduce也可以开始运行)
mapreduce.job.reduce.slowstart.completedmaps 0.05
- 合理的利用的Reduce端的输出压缩、也可以使用SequenceFile文件格式进行数据输出
-
-
MapReduce的重试问题的优化
MapReduce运行过程中,如果某一个Map任务或者reduce任务运行失败,MR并不会直接终止程序的运行,而是会对失败的map任务和reduce任务进行特定次数的重试,如果特定次数的重试之后Map和reduce都没有运行成功,MR才会认为运行失败。
mapreduce.map.maxattempts 4
mapreduce.reduce.maxattempts 4
mapreduce.task.timeout 600000
Hadoop中历史日志服务器和YARN的日志聚合的配置和使用
二、Hadoop的生态圈技术
Flume、Sqoop、Hive(结构化数据的)、HBase(非结构化数据的)等等技术都是基于(技术底层都是Hadoop的实现)Hadoop技术体系诞生的一系列技术体系。
三、Hadoop生态圈中的Hive数据仓库技术
3.1 Hive数据仓库的基本概念
Hive也是Apache网站开源的一个顶尖项目,官网网址:hive.apache.org
Hive技术通过类SQL语言(HiveQL–HQL)分布式数据的管理、计算、存储的操作。
3.1.1 Hive结构
Hive是基于Hadoop的数据仓库软件,采用了类似于MySQL中数据表的形式进行海量数据的管理和计算。
- Hive存储的数据是类似于数据表Table的形式,但是Hive本身不存储任何数据,只是存储了表格的形式数据,表格的数据最终还是在HDFS上进行存放,只不过Hive通过一种叫做元数据库的操作手段可以实现将HDFS存储的结构化文件转换成为表格形式进行展示。
- Hive的表格中数据可以通过类SQL语句(DQL语言、DDL语言)对数据进行计算,只不过Hive表面上使用的是SQL语言进行计算,但是底层会把SQL语言转换成为MapReduce程序在YARN上运行。(目前Hive1.x版本以后,Hive也支持了可以将类SQL语言转换成为Spark、Tez分布式计算程序运行)
3.1.2 Hive是基于Hadoop的,因此hive对hadoop的版本是有要求的
hive.2.x.x---->hadoop2.x.x hive3.x.x---->hadoop3.x.x
Hive本质上就相当于是Hadoop的一个客户端,而且是一种类似于可以通过SQL操作Hadoop的客户端
3.2 Hive的架构组成
Hive相当于Hadoop的一个客户端,可以实现将存储到HDFS上的数据转换成为数据表的形式,同时还可以借助类SQL语言对Hive数据表的数据进行计算,而计算使用的类SQL语句底层又会转换成为MapReduce程序在YARN上运行。
3.2.1 Hive整体主要由以下几部分组成
Hive的只所以可以实现以上功能,主要是因为Hive的设计架构,Hive整体主要由以下几部分组成:
-
Hive的Client:hive的客户端就是编写类SQL语言进行数据库、数据表创建、查询语句的编写的客户端,Hive的客户端有很多种:hive的命令行客户端、hive的Java API的客户端等等。
-
Hive的Driver(驱动)程序:hive的核心,hive之所以可以实现将类SQL语句转换成为MR程序,主要就是由Driver来负责进行转换的,其中hive的Driver又由以下几部分组成:
- 解析器:将编写的类SQL语言抽象成为一个语法树,检查语法有没有问题
- 编译器:将抽象成为的语法树生成逻辑执行计划
- 优化器:对执行计划进行优化
- 执行器:将优化之后的执行计划转换成为真正的物理执行代码,比如Hive支持的计算程序(MR、TEZ、Spark程序)
-
Hive的元数据metaStore,Hive不负责存储任何的数据,包括hive创建的数据库、数据表、表结构等等内存,都不是在hive中的存放的,还有表数据(HDFS上),这些信息我们都是在Hive的元数据中进行存放,元数据存放到一个关系型数据库中(比如MySQL、oracle、SQL Server 、Derby数据库)
3.3 Hive和数据库的区别
Hive采用了类SQL语言进行海量数据的计算,看上去操作和数据库还挺像的。但是一定要知道Hive和数据库完全不是一回事,只不过就是Hive借助数据库中的数据表和SQL的思想简化了处理海量数据的操作,除此以外,hive的存储机制、执行机制、执行延迟、存储数据量等等和数据库有本质性的区别
3.4 Hive的安装部署
Hive相当于是Hadoop的一个类SQL的客户端,底层的存储和计算都是基于Hadoop运行的,因此Hive安装之前必须先部署安装Hadoop软件(伪分布式、完全分布式、HA高可用)
Hive本身不是一个分布式软件,依赖于Hadoop的分布式存储和分布式计算,Hive就相当于是一个客户端软件,因此不管Hadoop软件安装的是哪种模式,Hive只需要安装到Hadoop集群的任意的一台节点上即可。
3.4.1 Hive的安装分为如下几步
-
安装hive之前必须先把JDK、Hadoop安装配置成功
-
上传、解压、配置环境变量——————安装的大数据软件目录,目录名最好只包含软件名+版本号即可
-
修改hive的配置文件
-
修改hive和hive配置文件的关联
-
修改hive和Hadoop的关联
hive-env.sh
-
配置hive的日志输出文件hive-log4j2.properties
-
-
初始化hive的元数据库metastore:默认情况下使用derby数据库(hive自带的):
schematool -dbType derby -initSchema
初始化会报错一个NoSuchMethod异常:hive的guava的依赖jar包和hadoop的guava的依赖jar包的版本冲突了
解决方案:hive的lib目录把guava,jar包删除了或者重命名了,然后把这个
${HADOOP_HOME}/share/hadoop/common/lib/guava.xxx.jar
给hive的lib目录复制一份
-
hive和hadoop还有一个依赖是冲突的,但是这个冲突不解决不会影响hive的正常使用,给我们报警告:hive和Hadoop的日志输出的依赖
hive中的日志依赖版本低于Hadoop的日志依赖
把hive的日志依赖重命名或者删除了
3.4.2 【注意事项】
- 一定要注意第一次安装hive,一定要初始化hive的元数据库以后,再启动hive的命令行客户端 初始化元数据库之后,再初始化命令执行的工作目录下,创建一个metastore_db文件夹,文件夹就是derby记录的元数据库的文件位置。 如果初始化失败了,一定一定要先把这个创建的目录给删除了再重新初始化。
- 在
env.sh
文件配置关联路径时,路径和=之间不要加空格 - hive和Hadoop有两个依赖包的冲突,分别是guava、log4j的,guava的依赖需要把hive的删除,然后把Hadoop的复制一份给hive,log4j的需要把hive的删除了就行了
3.5 Hive的基本使用
Hive其实就是一个Hadoop的类SQL客户端,Hive提供了多种方式可以进行类SQL编程:Hive的命令行方式,Java的JDBC操作方式等等
如果我们要使用hive的命令行方式操作hive,那么我们不需要启动任何的hive相关服务,只需要把HDFS和YARN启动即可。
如果我们要使用Java的JDBC方式操作hive,那么必须配置Hive的远程连接服务并且启动hive的远程连接服务,同时还得需要启动HDFS和YARN才能进行操作。
3.5.1 Hive的命令行操作方式
- 启动hive的命令行:必须在hive的安装节点上使用 hive
- hive的HQL查询表数据时,设计到聚合函数,或者筛选等等操作才会转换成为MR程序运行
- 支持增加和删除表中的所有数据,不支持修改或者删除表中的部分数据
3.6 Hive的元数据库的配置问题
hive中有一个很重要的概念就是元数据metastore,元数据中记录了hive中创建了哪些数据库和数据表,以及数据表的字段和字段类型、数据表的数据在HDFS上的存储目录等等信息。
而且hive要求,元数据hive本身不负责存储,它要求必须使用一个关系型数据库进行hive元数据的存储,因为hive的元数据其实也是一堆表。hive默认使用的derby数据库进行元数据的存储,但是derby存储元数据有一个非常严重的问题,无法多客户端使用hive命令行
derby数据库同一时刻只允许有一个客户端连接访问元数据库,因此如果hive的元数据初始化到了derby数据库,无法实现多客户端操作hive数据仓库
因此我们建议大家,包括hive官方也建议大家把hive的元数据库初始化到MySQL或者oracle或者SQL Server等关系型数据库当中。
Hive实现初始化元数据库到MySQL等关系型数据库,底层借助了Java的JDBC操作实现,如果想要实现把元数据库在MySQL中初始化,必须先做三件事情
3.6.1 Hive实现初始化元数据库到MySQL
- 把以前在derby元数据库上创建、添加的表文件在HDFS上先删除了,同时把以前derby的元数据库在Linux的目录移除了。
- 在Linux安装MySQL——————linux安装MySQL需要借助yum仓库进行,yum仓库必须先配置阿里云的yum源
- 因为hive初始化元数据到MySQL,使用的是Java的JDBC技术,但是hive中并没有MySQL的JDBC驱动,因此我们需要把MySQL的jdbc驱动给hive的lib目录下上传一份
Hive连接MySQL的时候还有一个问题,MySQL连接需要用户名和密码,但是hive默认情况下不知道,需要修改hive的一个配置文件,指定连接的MySQL的用户名和密码、驱动程序等等
需要在hive的安装目录的conf路径创建一个文件hive-site.xml
文件
初始化hive的元数据到MySQL中:schematool -initSchema -dbType mysql -verbose