MapReduce简化大数据编程难度,但对经常需大数据计算的人,如从事研究BI的数据分析师,他们通常使用SQL进行大数据分析和统计,MapReduce编程还是有门槛。且若每次统计和分析都开发相应MapReduce程序,成本确实太高。

是否可直接将SQL运行在大数据平台?

先看如何用MapReduce实现SQL数据分析。

1 MapReduce实现SQL的原理

常见的一条SQL分析语句,MapReduce如何编程实现?

# 统计分析语句
SELECT pageid, age, count(1)
FROM pv_users
GROUP BY pageid, age;

统计不同年龄用户访问不同网页的兴趣偏好:

  • 左边,要分析的数据表
  • 右边,分析结果

把左表相同的行求和,即得右表,类似WordCount。该SQL的MapReduce的计算过程,按MapReduce编程模型

  • map函数的输入K和V,主要看V

    V就是左表中每行的数据,如<1, 25>

  • map函数的输出就是以输入的V作为K,V统一设为1

    比如<<1, 25>, 1>

map函数的输出shuffle后,相同K及对应V放在一起,组成一个<K, V集合>,作为输入交给reduce函数处理。如<<2, 25>, 1>被map函数输出两次,到reduce就变成输入<<2, 25>, <1, 1>>:

  • K=<2, 25>
  • V集合=<1, 1>

在reduce函数内部,V集合里所有的数字被相加,然后输出。所以reduce输出就是<<2, 25>, 2>

如此,一条SQL就被MapReduce计算完成。

数仓中,SQL是最常用的分析工具,既然一条SQL可通过MapReduce程序实现,那有无工具能自动将SQL生成MapReduce代码?这样数据分析师只要输入SQL,即可自动生成MapReduce可执行的代码,然后提交Hadoop执行。这就是Hadoop大数据仓库Hive。

Hive架构

Hive能直接处理我们输的SQL,调用MapReduce计算框架完成数据分析操作。

通过Hive Client向Hive Server提交SQL命令:

  • DDL,Hive会通过执行引擎Driver将数据表的信息记录在Metastore元数据组件,该组件通常用一个关系DB实现,记录表名、字段名、字段类型、关联HDFS文件路径等这些数据库的元信息
  • DQL,Driver会将该语句提交给自己的编译器Compiler进行语法分析、语法解析、语法优化,最后生成一个MapReduce执行计划。然后根据执行计划生成一个MapReduce的作业,提交给Hadoop MapReduce计算框架处理

对简单SQL:

SELECT * FROM status_updates WHERE status LIKE 'michael jackson';

对应的Hive执行计划:

Hive内部预置很多函数,Hive执行计划就是根据SQL语句生成这些函数的DAG,然后封装进MapReduce的map、reduce函数。该案例中的map函数调用三个Hive内置函数就完成map计算,且无需reduce。

Hive join操作

除简单的聚合(group by)、过滤(where),Hive还能执行连接(join on)。

pv_users表的数据无法直接得到,因为pageid来自用户访问日志,每个用户进行一次页面浏览,就会生成一条访问记录,保存在page_view表。而age年龄信息记录在表user。

这两张表有相同字段userid,可连接两张表,生成pv_users表:

SELECT pv.pageid, u.age FROM page_view pv JOIN user u ON (pv.userid = u.userid);

该SQL命令也能转化为MapReduce计算,连接过程:

join的MapReduce计算过程和group by稍不同,因为join涉及两张表,来自两个文件(夹),所以要在map输出时进行标记,如来自第一张表的输出Value就记为<1, X>,这1表示数据来自第一张表。shuffle后,相同Key被输入到同一reduce函数,就可根据表的标记对Value数据求笛卡尔积,用第一张表的每条记录和第二张表的每条记录连接,输出即join结果。

所以打开Hive源码,看join代码,会看到一个两层for循环,对来自两张表的记录进行连接操作。

总结

开发无需经常编写MapReduce程序,因为网站最主要的大数据处理就是SQL分析,因此Hive很重要。

随Hive普及,我们对在Hadoop执行SQL的需求越强,对大数据SQL的应用场景也多样化起来,于是又开发各种大数据SQL引擎。

Cloudera开发Impala,运行在HDFS上的MPP架构的SQL引擎。和MapReduce启动Map、Reduce两种执行进程,将计算过程分成两个阶段进行计算不同,Impala在所有DataNode服务器上部署相同的Impalad进程,多个Impalad进程相互协作,共同完成SQL计算。

Spark诞生,也推出自己的SQL引擎Spark SQL,将SQL语句解析成Spark的执行计划,在Spark执行。由于Spark比MapReduce快很多,Spark SQL也比Hive快很多,随Spark普及,Spark SQL也逐渐被接受。后来Hive推出Hive on Spark,将Hive的执行计划直接转换成Spark的计算模型。

还希望在NoSQL执行SQL,毕竟SQL发展几十年,积累庞大用户,很多人习惯用SQL解决问题。于是Saleforce推出Phoenix,一个执行在HBase上的SQL引擎。

这些SQL引擎只支持类SQL语法,不像DB那样支持标准SQL,特别是数仓几乎必用嵌套查询SQL:在where条件里面嵌套select子查询,但几乎所有大数据SQL引擎都不支持。

Hive技术架构没有什么创新,数据库相关技术架构已很成熟,只要将这些技术架构应用到MapReduce就得到Hadoop大数据仓库Hive。但想到将两种技术嫁接,却极具创新性,通过嫁接产生出的Hive极大降低大数据应用门槛,也使Hadoop普及。

参考

  • https://learning.oreilly.com/library/view/hadoop-the-definitive/9781491901687/ch17.html#TheMetastore

Hive 到底有什么用?相关推荐

  1. 大数据时代的技术hive:hive介绍

    转自:http://www.cnblogs.com/sharpxiajun/archive/2013/06/02/3114180.html 我最近研究了hive的相关技术,有点心得,这里和大家分享下. ...

  2. 数据库实验2Pig、Hive

    4.Pig Exercise 1 Working with Pig Lab 1 Working with Pig 这个练习让您有机会学习一些基本的Pig知识,以便开始熟悉这个环境. 在完成这个动手实验 ...

  3. hive底层与数据库交互原理

    一.Hive到底是什么 数据依然是存储在HDFS中,由HDFS负责管理数据冗余与一致性.Hive只是在此基础上构建了一个表,在进行数据查询时,Hive引擎将SQL语句转化为下层的mr作业,然后在mr的 ...

  4. 史上最详细大数据基础知识

    # **1___Hive** ## 0.0.hive基本命令 ```sql [1.分区表] --创建分区 alter table table_name add partition(分区字段='分区值' ...

  5. 来学习几个简单的Hive函数吧!

    作者 | 石晓文 转载自小小挖掘机(ID:wAIsjwj) 咳咳,今天来介绍一下几个Hive函数吧,先放一张我登哥划水的照片,希望大家也做一只自由的鱼儿,在知识的海洋里游呀游,嘻嘻! 今天我们来介绍几 ...

  6. Hive 数仓中常见的日期转换操作

    (1)Hive 数仓中一些常用的dt与日期的转换操作 下面总结了自己工作中经常用到的一些日期转换,这类日期转换经常用于报表的时间粒度和统计周期的控制中 日期变换: (1)dt转日期 to_date(f ...

  7. hive内部表与外部表区别

    1.创建内部表与外部表的区别是什么? 2.external关键字的作用是什么? 3.外部表与内部表的区别是什么? 4.删除表的时候,内部表与外部表有什么区别? 5.load data local in ...

  8. S3c2440A WINCE平台HIVE注册表+binfs的实现

    今天最大的收获莫过于把binfs和hive注册表同时在三星的平台上实现了,这可是前无古人啊(只是看到好多哥们说找不到三星的HIVE资料),哈哈哈.怕今天的成果日后成炮灰,还是写下来比较好,要养成这样的 ...

  9. hive 行转列和列转行的方法_读离线和实时大数据开发实战,为你揭开 Hive 优化实践的神秘面纱...

    前言 「1024,1GB,一级棒!程序仔们节日快乐!」 ❝ 指尖流动的 1024 行代码,到底是什么? ❞ ❝ 是10行的迷茫?是101行的叛逆?是202行的理性思考?是307行对渴望的冲动?还是40 ...

最新文章

  1. 采访Jesús Fernandes(QA主管)
  2. JS之字符串截取函数substr
  3. 新浪sea增加php,php接口 连接新浪云sea的mysql数据库
  4. 用Google XML Sitemaps为你的网站创建Sitemap
  5. ofo生死局:拿什么续命?
  6. python udp socket通信
  7. 基于HFSS的圆极化阵列天线设计
  8. C++ - Sodoku Killer(DFS) - 实现一个数独解算器
  9. MITK通用插件(四)The Dicom Browser Plugin
  10. Northwind数据库下载地址
  11. 8种编程语言毕业设计参考文献大全(java,jsp,mysql,c#,asp.net,sqlserver,andorid,php)
  12. Py之shap:shap库的简介、安装、使用方法之详细攻略
  13. k8s pod分类、核心组件、网络模型、kubectl常用命令
  14. Java日志框架 -- 日志框架介绍、日志门面技术、JUL日志(JUL架构、JUL入门示例、JUL日志级别、JUL日志的配置文件)
  15. 简述思科、华为交换机型号字母代表的意思
  16. Unity如何将fbx格式模型的材质拆分、编辑模型
  17. python学习之路day06
  18. 为什么uniapp打包会自动获取额外的电话、通讯录、录音权限?
  19. ECC(椭圆曲线密码编码学)简介
  20. COBIT5给企业带来什么样的价值

热门文章

  1. 做为一个好人 你应该看这部电影
  2. PHP 数组定义与基本使用
  3. 机器学习实战 支持向量机SVM 代码解析
  4. 吕本富:中国Web2.0缺乏创新 与美国差距拉大
  5. 微信小程序前端调用python后端的模型
  6. 数据泵 TTS(传输表空间技术)
  7. 最新《python自动化开发网络班项目实战》
  8. 我奋斗了18年才能和你坐在一起喝咖啡
  9. 实现微信支付wxpay
  10. css如何让图片全屏显示?