MapReduce和Hive工作流程

Hive 执行流程

  1. (执行查询操作)Execute Query
    命令行或Web UI之类的Hive接口将查询发送给Driver(任何数据库驱动程序,如JDBC、ODBC等)以执行。

  2. (获取计划任务)Get Plan
    Driver借助查询编译器解析查询,检查语法和查询计划或查询需求

  3. (获取元数据信息)Get Metadata
    编译器将元数据请求发送到Metastore(任何数据库)。

  4. (发送元数据)Send Metadata
    Metastore将元数据作为对编译器的响应发送出去。

  5. (发送计划任务)Send Plan
    编译器检查需求并将计划重新发送给Driver。到目前为止,查询的解析和编译已经完成

  6. (执行计划任务)Execute Plan
    Driver将执行计划发送到执行引擎。

  7. (执行Job任务)Execute Job
    在内部,执行任务的过程是MapReduce Job。执行引擎将Job发送到ResourceManager,
    ResourceManager位于Name节点中,并将job分配给datanode中的NodeManager。在这里,查询执行MapReduce任务.
    (元数据操作)Metadata Ops
    在执行的同时,执行引擎可以使用Metastore执行元数据操作。

  8. (拉取结果集)Fetch Result
    执行引擎将从datanode上获取结果集;

  9. (发送结果集至driver)Send Results
    执行引擎将这些结果值发送给Driver

  10. (driver将result发送至interface)Send Results
    Driver将结果发送到Hive接口

Hadoop 执行流程

输入 –> map –> shuffle –> reduce –>输出

输入文件会被切分成多个块,每一块都有一个map task

map 阶段的输出结果会先写到内存缓冲区,然后由缓冲区写到磁盘上。默认的缓冲区大小是100M,溢出的百分比是0.8,也就是说当缓冲区中达到80M的时候就会往磁盘上写。如果map计算完成后的中间结果没有达到80M,最终也是要写到磁盘上的,因为它最终还是要形成文件。那么,在往磁盘上写的时候会进行分区和排序。一个map的输出可能有多个这个的文件,这些文件最终会合并成一个,这就是这个map的输出文件。

  1. 输入文件分片,每一片都由一个MapTask来处理

  2. Map输出的中间结果会先放在内存缓冲区中,这个缓冲区的大小默认是100M,当缓冲区中的内容达到80%时(80M)会将缓冲区的内容写到磁盘上。也就是说,一个map会输出一个或者多个这样的文件,如果一个map输出的全部内容没有超过限制,那么最终也会发生这个写磁盘的操作,只不过是写几次的问题。

  3. 从缓冲区写到磁盘的时候,会进行分区并排序,分区指的是某个key应该进入到哪个分区,同一分区中的key会进行排序,如果定义了Combiner的话,也会进行combine操作

  4. 如果一个map产生的中间结果存放到多个文件,那么这些文件最终会合并成一个文件,这个合并过程不会改变分区数量,只会减少文件数量。例如,假设分了3个区,4个文件,那么最终会合并成1个文件,3个区

  5. 以上只是一个map的输出,接下来进入reduce阶段

  6. 每个reducer对应一个ReduceTask,在真正开始reduce之前,先要从分区中抓取数据

  7. 相同的分区的数据会进入同一个reduce。这一步中会从所有map输出中抓取某一分区的数据,在抓取的过程中伴随着排序、合并。

  8. reduce输出


有限自动机

说起这个都是泪啊。

在学校搞了有一年的机器人,阅读了一些 BHuman 的源码,只是会用罢了。对于思想没有深入学习和没有总结与思考。上次魔门塔面试,面试官一直追问关于有限自动机的事情(为什么要用有限状态自动机?他比 if else or switch case 好在哪里?),我却支支吾吾回答不上来。我陷入了对自己学习方式的思考中。

学习一个东西,要多问一个 WHY?

有限自动机(finite automata)亦称时序机,有限离散数字系统的抽象数学模型。一个有限自动机M由五元组(X,Y,S,δ,λ)给定,其中X,Y和S都是非空有限集,分别称为M的输入集、输出集和状态集;δ是笛卡儿积集合S×X到S的映射,称为M的下一状态函数;λ是S×X到Y的单值映射,称为M的输出函数。当δ是单值映射时,称M为确定型有限自动机;当δ是多值映射时,称M为非确定型有限自动机。有限自动机有三种功能:作为序列转换器,将输入序列变换为输出序列;作为序列识别器,识别输入的序列是否具有某种性质;作为序列产生器,产生具有所要求性质的序列。

上面的引用来自百度百科),巴拉巴拉说了一顿,没接触过的同学可能很懵逼。

简单的说一下就是:有限自动机(有穷状态的机器),由一个有限的内部状态集和一组控制规则组成,这些规则是用来控制在当前状态下读入输入符号后应转向什么状态。对应在 BHuman 中的 CABSL 状态就是:options、states、transition、actions。这些可以参考我之前的博客)

那么回到那个问题上:有限状态机比 if else or switch case 好在哪里?

  1. 状态可控
  2. 上下文有关
  3. 抽象、封装

继续学习。


Hive学习笔记

hive 1.2.1

阅读更多
Hadoop学习笔记

你好,Hadoop

为什么不能用配有大量硬盘的数据库来进行大规模数据分析?为什么需要用 Hadoop?

  • 如果数据访问模式中包含大量的硬盘寻址,那么读取大量数据集就会必然会花更长的时间(相较于流数据读取模式,流读取主要取决于传输速率)。
  • 如果数据库系统只更新一小部分记录,那么传统的 B 树更有优势。但数据库系统中如果有大量数据更新时,B 树的效率就明显落后于 MapReduce,因为需要使用“排序/合并”(sort/merge)来重建数据库。

Hadoop 相关开源项目

  • 数据格式:Avro、Parquet
  • 数据读取:Flume、Sqoop
  • 数据处理:Pig、Hive、Crunch、Spark
  • 存储:HBase
  • 协作:ZooKeeper

学习Cpp-从C到Cpp

从了解 Cpp 已经有一点时间了,然后就转用了 Python 和 Vue 做项目。

好久不见,甚是想念。

阅读更多
OpenCV-图片几何变换

缩放、裁剪、平移、镜像、旋转、仿射变换、透视变换。

阅读更多
Django-Cookie和Session

all right,Cookie🍪 和 Session 并不是 Python 中特有的东西,只是我在学习 Django 框架的时候才搞清楚了其工作方式,所以记录在此。

在和学长写项目的过程中,只是有所了解,并不知道这是哪块小饼干,什么味道。

一直在用 GitHub,发现 GitHub 可以好久不用登陆,今天搞清楚了 Cookie 和 Session 的方式后打开 GitHub 看了下,明白liao~

访问 GitHub

阅读更多
Django-模型

Python=3.7.3 Django=2.2.3 MySQL=5.7 PyMySQL=0.9.3

阅读更多
OpenCV-仿射变换、图片旋转

图片仿射变换、图片旋转。

阅读更多
OpenCV-图片移位

cv2 的图片移位操作原理和实现。

阅读更多