Hadoop是大数据中一个技术框架,内置了很多组件,解决了很多大数据业务下的数据处理和数据存储的场景。
Hadoop整体四部分组成的:HDFS、MapReduce、YARN、Hadoop Common
修改配置文件:
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
HDFS的命令行操作
HDFS的Java API操作
HDFS的安全模式safemode:开启的时机、关闭的时机
Hadoop集群的新节点的服役和旧节点的退役(HDFS、YARN)
YARN只负责分配资源,不清楚计算程序的运行逻辑,程序运算逻辑YARN要求分布式程序必须启动一个AM来具体负责,YARN不负责,因此,只要一个分布式计算程序满足YARN的运行规则,都可以在YARN上进行运行。
InputFormat
Mapper
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
Job提交资源的流程(源码)
资源提交成功以后,剩余的流程按照组件的顺序依次执行
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
MapReduce虽然是大数据中一个分布式计算框架,确实可以计算海量的数据,但是MR程序在运算过程中涉及到大量的磁盘IO和网络传输,所以导致MR程序的运行效率相比于其他大数据计算框架效率不是很高。
因此开发MapReduce程序的时候,为了让MR效率提高一点,可以对MR程序运行过程中的一些问题进行优化,尽可能的提升MR的计算效率。
MpReduce导致计算运行缓慢的原因
MapReduce的运行优化解决问题
Mapper输入阶段优化的措施
可能产生的问题:小文件过多、数据倾斜、某些大文件不可被切割
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)。
mapreduce.job.reduce.slowstart.completedmaps 0.05
MapReduce的重试问题的优化
MapReduce运行过程中,如果某一个Map任务或者reduce任务运行失败,MR并不会直接终止程序的运行,而是会对失败的map任务和reduce任务进行特定次数的重试,如果特定次数的重试之后Map和reduce都没有运行成功,MR才会认为运行失败。
mapreduce.map.maxattempts 4
mapreduce.reduce.maxattempts 4
mapreduce.task.timeout 600000
Hadoop中历史日志服务器和YARN的日志聚合的配置和使用
Flume、Sqoop、Hive(结构化数据的)、HBase(非结构化数据的)等等技术都是基于(技术底层都是Hadoop的实现)Hadoop技术体系诞生的一系列技术体系。
Hive也是Apache网站开源的一个顶尖项目,官网网址:hive.apache.org
Hive技术通过类SQL语言(HiveQL–HQL)分布式数据的管理、计算、存储的操作。
Hive是基于Hadoop的数据仓库软件,采用了类似于MySQL中数据表的形式进行海量数据的管理和计算。
hive.2.x.x---->hadoop2.x.x hive3.x.x---->hadoop3.x.x
Hive本质上就相当于是Hadoop的一个客户端,而且是一种类似于可以通过SQL操作Hadoop的客户端
Hive相当于Hadoop的一个客户端,可以实现将存储到HDFS上的数据转换成为数据表的形式,同时还可以借助类SQL语言对Hive数据表的数据进行计算,而计算使用的类SQL语句底层又会转换成为MapReduce程序在YARN上运行。
Hive的只所以可以实现以上功能,主要是因为Hive的设计架构,Hive整体主要由以下几部分组成:
Hive的Client:hive的客户端就是编写类SQL语言进行数据库、数据表创建、查询语句的编写的客户端,Hive的客户端有很多种:hive的命令行客户端、hive的Java API的客户端等等。
Hive的Driver(驱动)程序:hive的核心,hive之所以可以实现将类SQL语句转换成为MR程序,主要就是由Driver来负责进行转换的,其中hive的Driver又由以下几部分组成:
Hive的元数据metaStore,Hive不负责存储任何的数据,包括hive创建的数据库、数据表、表结构等等内存,都不是在hive中的存放的,还有表数据(HDFS上),这些信息我们都是在Hive的元数据中进行存放,元数据存放到一个关系型数据库中(比如MySQL、oracle、SQL Server 、Derby数据库)
Hive采用了类SQL语言进行海量数据的计算,看上去操作和数据库还挺像的。但是一定要知道Hive和数据库完全不是一回事,只不过就是Hive借助数据库中的数据表和SQL的思想简化了处理海量数据的操作,除此以外,hive的存储机制、执行机制、执行延迟、存储数据量等等和数据库有本质性的区别
Hive相当于是Hadoop的一个类SQL的客户端,底层的存储和计算都是基于Hadoop运行的,因此Hive安装之前必须先部署安装Hadoop软件(伪分布式、完全分布式、HA高可用)
Hive本身不是一个分布式软件,依赖于Hadoop的分布式存储和分布式计算,Hive就相当于是一个客户端软件,因此不管Hadoop软件安装的是哪种模式,Hive只需要安装到Hadoop集群的任意的一台节点上即可。
安装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的日志依赖重命名或者删除了
env.sh
文件配置关联路径时,路径和=之间不要加空格Hive其实就是一个Hadoop的类SQL客户端,Hive提供了多种方式可以进行类SQL编程:Hive的命令行方式,Java的JDBC操作方式等等
如果我们要使用hive的命令行方式操作hive,那么我们不需要启动任何的hive相关服务,只需要把HDFS和YARN启动即可。
如果我们要使用Java的JDBC方式操作hive,那么必须配置Hive的远程连接服务并且启动hive的远程连接服务,同时还得需要启动HDFS和YARN才能进行操作。
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中初始化,必须先做三件事情
Hive连接MySQL的时候还有一个问题,MySQL连接需要用户名和密码,但是hive默认情况下不知道,需要修改hive的一个配置文件,指定连接的MySQL的用户名和密码、驱动程序等等
需要在hive的安装目录的conf路径创建一个文件hive-site.xml
文件
初始化hive的元数据到MySQL中:schematool -initSchema -dbType mysql -verbose