实训笔记7.26

7.26笔记

一、Hadoop大数据开发技术

Hadoop是大数据中一个技术框架,内置了很多组件,解决了很多大数据业务下的数据处理和数据存储的场景。

Hadoop整体四部分组成的:HDFS、MapReduce、YARN、Hadoop Common

1.1 Hadoop的安装部署

  1. 本地安装模式
  2. 伪分布安装模式
  3. 完全分布安装模式
  4. 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的组成
  1. NameNode
  2. DataNode
    1. block块
    2. block块的副本数
  3. SecondaryNameNode
1.2.2 HDFS的操作方式
  1. HDFS的命令行操作

  2. HDFS的Java API操作

1.2.3 HDFS的流程原理
  1. HDFS的上传/下载数据的流程和原理
  2. HDFS的NameNode和SecondaryNameNode的原理
    1. SNN检查点机制问题:两个触发条件
    2. edits文件、fsimage文件
    3. HDFS的NN节点的数据恢复
  3. HDFS的NameNode和DataNode的工作原理
    1. 心跳机制问题:默认时间 3s
    2. NN认为DN断线的机制:掉线超时时长 2心跳的检测时间(5分钟)+10心跳时间
1.2.4 HDFS核心概念

HDFS的安全模式safemode:开启的时机、关闭的时机

Hadoop集群的新节点的服役和旧节点的退役(HDFS、YARN)

1.3 Hadoop的分布式资源调度系统YARN

1.3.1 YARN的组成
  1. ResourceManager
  2. NodeManager
  3. Container
  4. ApplicationMaster
  5. Task:申请资源的操作RM封装为Task
1.3.2 YARN的工作流程
1.3.3 YARN的任务调度器
  1. FIFO调度器
  2. 容量调度器
  3. 公平调度器

YARN只负责分配资源,不清楚计算程序的运行逻辑,程序运算逻辑YARN要求分布式程序必须启动一个AM来具体负责,YARN不负责,因此,只要一个分布式计算程序满足YARN的运行规则,都可以在YARN上进行运行。

1.4 Hadoop的分布式计算框架MapReduce

1.4.1 MapReduce的应用场景
  1. 离线数据处理的场景下:数据对实时性要求不高(MR程序运行中涉及到大量的磁盘IO和网络传输,因此会导致MR程序计算效率“不是很高”)
  2. 适用于数据量比较庞大的文件,小文件操作不占优势,处理TB/PB级别规模的数据
1.4.2 MapReduce的运行中核心组件
  1. InputFormat

    1. 切片、kv读取
    2. 常用实现类的切片和KV读取规则
    3. 如何自定义InputFormat
  2. Mapper

    1. map方法的执行方式:一组kv执行一次,一组kv在常用实现类当中都是一行数据为一组kv
    2. 环形缓冲区的问题
    3. maptask的数量和切片的关系
  3. Partitioner组件

    1. 负责进行map输出数据的分区

    2. 默认分区机制

      reduceTask=1

      reduceTask>1

    3. 自定义分区机制

  4. WritableComparable

    负责对map输出的kv数据进行排序的

    mr阶段发生几次排序,每次排序的执行时机以及排序使用的算法

  5. Combiner组件

    对map阶段输出的数据进行局部汇总,Combiner不是所有的MR程序都能添加,Combiner的添加不能影响原先MR程序的执行逻辑

  6. WritableComparator组件(可选)

    负责分组排序的,reduce在把数据拉取回来以后,需要根据key值来进行分组,哪些key我们认为是一组相同的key,可以通过辅助排序(分组排序)来决定

  7. Reduce组件

    reduce主要对map输出的数据进行全局汇总,汇总把相同的key值的value数据聚合起来,然后一组相同的key值调用一次reduce方法

    reduceTask的数量我们可以手动设置的,设置的时候主要和分区的关系

  8. OutputFormat组件

    指定了MR程序输出数据时的输出规则

    OutputFormat常用实现类

    SequenceFile文件的相关概念

    自定义OutpoutFormat

1.4.3 MapReduce的详细工作流程

Job提交资源的流程(源码)

资源提交成功以后,剩余的流程按照组件的顺序依次执行

1.4.4 MapReduce中压缩机制问题

MapReduce运行过程中,可以在三个位置对数据进行压缩:Mapper输入阶段,Mapper的输出阶段、Reducer的输出阶段

  1. MR程序中提供的压缩机制有哪些(压缩算法)

    1. default

    2. gzip

    3. bzip2

    4. LZ4

    5. Snappy

      1~5:Hadoop的Linux环境都给提供了

    6. LZO

      没有给提供

  2. MR程序中如何对三个位置开启压缩机制

    1. Map的输入: io.compression.codecs

    2. map的输出:

      mapreduce.map.output.compress mapreduce.map.output.compress.codec

    3. reduce的输出: FileOutputFormat.xxxxxx

1.4.5 MapReduce的特殊应用
  1. MapReduce中join操作
    1. mapjoin
    2. reducejoin
  2. MapReduce中计数器的应用
  3. MapReduce实现数据清洗特殊应用
1.4.6 MapReduce中的优化问题

MapReduce虽然是大数据中一个分布式计算框架,确实可以计算海量的数据,但是MR程序在运算过程中涉及到大量的磁盘IO和网络传输,所以导致MR程序的运行效率相比于其他大数据计算框架效率不是很高。

因此开发MapReduce程序的时候,为了让MR效率提高一点,可以对MR程序运行过程中的一些问题进行优化,尽可能的提升MR的计算效率。

  1. MpReduce导致计算运行缓慢的原因

    1. 硬件受限制
      1. 内存、CPU、硬盘的IO读写速度
      2. 掏钱解决
    2. MR运行机制限制
      1. 数据倾斜问题
      2. MapTask、ReduceTask的任务数量设置
      3. MR运行过程中小文件过多
      4. MR运行过程中磁盘溢写,磁盘IO次数过多
  2. MapReduce的运行优化解决问题

    1. Mapper输入阶段优化的措施

      可能产生的问题:小文件过多、数据倾斜、某些大文件不可被切割

      1. 小文件过多的问题:CombinerTextInputFormat实现小文件的合并,减少小切片出现
      2. 文件不可被切割,可以在MR程序处理之前,对文件数据重新进行压缩,压缩的时候选择可以被切片的压缩机制进行压缩
      3. map阶段的数据倾斜问题:合理的使用切片机制对输入的数据进行切片
      4. 合理的使用压缩机制
    2. Mapper阶段优化的措施

      可能产生的问题:环形缓冲区溢写的次数过多,溢写文件的合并次数过多,溢写和合并都涉及到磁盘IO

      1. 溢写次数过多,那么加大环形缓冲区的容量以及溢写的阈值。

        //环形缓冲区的容量
        mapred-site.xml/Configuration mapreduce.task.io.sort.mb 
        //溢写的比例 小数
        mapreduce.map.sort.spill.percent   
        
      2. 溢写的小文件并不是只合并一次,如果溢写的小文件超过设置的指定数量,先进行一次合并

        mapreduce.task.io.sort.factor 默认值10

      3. 可以合理的利用的Mapper输出压缩,减少mapper输出的数据量

      4. 在不干扰MR逻辑运行的前提下,合理的利用的Combiner组件对Map端的数据进行局部汇总,可以减少Mapper输出的数据量

    3. Reduce阶段的优化措施

      产生的问题:reduce的任务数设置不合理,Reduce端的数据倾斜问题、Reduce阶段拉取数据回来之后先写到内存中,内存放不下溢写磁盘(磁盘IO)。

      1. 任务书设置和数据倾斜问题:可以通过查看MR程序运行的计数器,自定义分区机制重新指定分区规则
      2. 尽量不使用Reduce阶段
      3. MR程序中,默认如果Map任务运行没有结束,那么Reduce任务就无法运行。可以设置map任务和reduce任务共存(map任务没有全部运行结束,reduce也可以开始运行) mapreduce.job.reduce.slowstart.completedmaps 0.05
      4. 合理的利用的Reduce端的输出压缩、也可以使用SequenceFile文件格式进行数据输出
  3. 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中数据表的形式进行海量数据的管理和计算。

  1. Hive存储的数据是类似于数据表Table的形式,但是Hive本身不存储任何数据,只是存储了表格的形式数据,表格的数据最终还是在HDFS上进行存放,只不过Hive通过一种叫做元数据库的操作手段可以实现将HDFS存储的结构化文件转换成为表格形式进行展示。
  2. 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整体主要由以下几部分组成:

  1. Hive的Client:hive的客户端就是编写类SQL语言进行数据库、数据表创建、查询语句的编写的客户端,Hive的客户端有很多种:hive的命令行客户端、hive的Java API的客户端等等。

  2. Hive的Driver(驱动)程序:hive的核心,hive之所以可以实现将类SQL语句转换成为MR程序,主要就是由Driver来负责进行转换的,其中hive的Driver又由以下几部分组成:

    1. 解析器:将编写的类SQL语言抽象成为一个语法树,检查语法有没有问题
    2. 编译器:将抽象成为的语法树生成逻辑执行计划
    3. 优化器:对执行计划进行优化
    4. 执行器:将优化之后的执行计划转换成为真正的物理执行代码,比如Hive支持的计算程序(MR、TEZ、Spark程序)
  3. 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的安装分为如下几步
  1. 安装hive之前必须先把JDK、Hadoop安装配置成功

  2. 上传、解压、配置环境变量——————安装的大数据软件目录,目录名最好只包含软件名+版本号即可

  3. 修改hive的配置文件

    1. 修改hive和hive配置文件的关联

    2. 修改hive和Hadoop的关联

      hive-env.sh

    3. 配置hive的日志输出文件hive-log4j2.properties

  4. 初始化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目录复制一份

  5. hive和hadoop还有一个依赖是冲突的,但是这个冲突不解决不会影响hive的正常使用,给我们报警告:hive和Hadoop的日志输出的依赖

    hive中的日志依赖版本低于Hadoop的日志依赖

    把hive的日志依赖重命名或者删除了

3.4.2 【注意事项】
  1. 一定要注意第一次安装hive,一定要初始化hive的元数据库以后,再启动hive的命令行客户端 初始化元数据库之后,再初始化命令执行的工作目录下,创建一个metastore_db文件夹,文件夹就是derby记录的元数据库的文件位置。 如果初始化失败了,一定一定要先把这个创建的目录给删除了再重新初始化。
  2. env.sh文件配置关联路径时,路径和=之间不要加空格
  3. 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的命令行操作方式
  1. 启动hive的命令行:必须在hive的安装节点上使用 hive
  2. hive的HQL查询表数据时,设计到聚合函数,或者筛选等等操作才会转换成为MR程序运行
  3. 支持增加和删除表中的所有数据,不支持修改或者删除表中的部分数据

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
  1. 把以前在derby元数据库上创建、添加的表文件在HDFS上先删除了,同时把以前derby的元数据库在Linux的目录移除了。
  2. 在Linux安装MySQL——————linux安装MySQL需要借助yum仓库进行,yum仓库必须先配置阿里云的yum源
  3. 因为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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cai-4

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值