连蒙带猜学习大数据 hive 和 kylin 篇

这里的连蒙带猜学习,是指我先根据一句话的概念了解这是个什么东西,然后如果假设让你搞这么个东西, 你会怎么实现,然后大体验证一下你的思路和官方实现是否一致, 为什么要这样做呢,

  • 分布式中基础理论就那么多,大多数号称很牛逼的大数据框架搞来搞去都是换汤不换药,
  • 我们没有那么多时间学习太多新语言,没那么多时间学习那么多时髦的技术
  • 偶尔不求甚解的感觉也蛮爽

连蒙带猜学 hive

一句话定义: hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。

  • 这个是常见的一个定义, 不是我定义的,

连蒙带猜:

  • hive 是个数据库, 可以存储数据, 可以执行一些 sql, sql 其实就是查询计算
  • 结构化的数据文件, 我们能想到什么, hive 就代表一个转换, 原始数据有可能是用其他的格式存储在别的地方, 然后 hive 知道这个原始格式, 然后可以把原始格式转换为标准格式, 然后就有了自己的 数据库, 表, 和 字段。 如果是一个 hdfs上的文件中的一行数据,怎么转变为数据库中的字段, 如果我来做,应该怎么做最通用, 怎么做最灵活, 我定义一个分隔符,把一行数据分割为多个段, 每个段对应到数据库中的一个字段,
  • 那我应该支持所有常见的存储格式, 和存储数据库, 这样就可以安利更多人用我,反正都是一种转换么, 那么就应该支持 sequenceFile, 其实就是个没有索引的 key value 序列 , 支持hbase, 一个列式存储数据库,
  • sql 代表什么, 代表查询, 那么我来做应该怎么做, 无非用一个工具或者裸写代码把 sql 解析为一个抽象语法树, 搞到 from 语句, where 语句, group by语句, select 语句, aggregate 语句, 然后把每个语句对应到 分布式计算框架的一个算子, 比如如果我们的表在 hdfs上, From 语句对应到 spark 里面就是一个 textFile, 然后按照事先定义的分隔符进行 split, where 对应 spark 中的 filter 算子, group by 就更是现成的算子, select 抽取所有字段中的你需要的个别字段, aggregate 就是进行聚合操作, 也很简单,
  • hive 和 大数据就彻底搞在了一起, hive 就取巧了 hdfs mapreduce 等分布式技术, 立马就高大上起来
  • 如果能来点基于规则的 sql 优化就更厉害了, 比如 位次下推, 常量折叠, 列值裁剪。

上面是假如这个东西是我做的, 我应该怎么搞, 是不是很快, 是不是简单粗暴, 这时候你是不是认为 hive 也不过如此么, 分分钟实现一个,

但是细节是魔鬼, 下面我们进行到最后一个环节,小心求证一下,怎么求证呢,可以看官网或者一些牛人深入剖析的文章,跟自己的假设进行比较,甚至说你那天吹牛被打脸了,那么你让那个打你脸的人给你解释hive 中的原理, 对比跟你设想不一样的地方,慢慢的你被打脸的次数会越来越少,但是我这里的结论我都不负责,

  • 我们看到 官方定义一个表的语法, hive 的表分为内部表和外部表, 外部表是不是就是 存储在 hdfs 上的原始数据, 果然是的, 你会发现里面竟然有 FIELDS TERMINATED BY ‘,’ 这个不就是我猜的 把原始一行数据根据分隔符对应到多个字段, 里面还有怎么分行的关键词, 那这里我们可以进一步猜测是不是可以根据 正则中的分组来抽取对应各个字段呢, google 一下还真有, WITH SERDEPROPERTIES( "input.regex"), 是不是自信起来了

这个就是 hive sql 真实执行的过程,

  • 把sql 使用 antrl 解析为一个 ast , 也就是抽象语法树,
  • AST进入SemanticAnalyzer(核心)变成QB, 一个查询块, 我们上文提到的From 会对应一个 QB, 最终为成为一个 DAG 有向无环图
  • 谓词下推(Predicate Push Down),分区剪裁(Partition Prunner),关联排序(Join Reorder)等等
  • 有向无环图生成物理执行计划, GenTasks, 逻辑执行计划依然没办法真正执行,他们只是逻辑上可行,实际上Spark并不知道如何去执行这个东西。比如Join只是一个抽象概念,代表两个表根据相同的id进行合并,然而具体怎么实现这个合并,逻辑执行计划并没有说明。将逻辑上可行的执行计划变为Spark可以真正执行的计划。比如Join算子,Spark根据不同场景为该算子制定了不同的算法策略,有BroadcastHashJoin、ShuffleHashJoin以及SortMergeJoin等,个过程涉及到基于代价优化策略

是不是跟我们上文推测的设计实现思路也八九不离十,

到这来完了没有, 当然没有, 你可以看看 hive 是怎么动态分区的, hive 是怎么加载 hbase 的数据的, 怎么加载 parquet 格式的数据的, hive 的元数据是怎么存储在 hdfs 中的, 什么是 map join ,
hive sql 中 group by, distinct 等等是怎么转换为底层算子的。

以上都是平时看一些博客, 看到的一些内容, 或者自己想到的问题,

我有一个习惯就是面试一个人的时候, 也问一些自己根本不知道答案的问题,比如上面我们提到的问题,如果你能把我讲懂了, 而且我也觉得很有道理, 那我就赚到了,

这个时候你能吹牛你会 hive 了么, 我觉得还是可以吹一些的, 因为你真正掌握了 hive 最核心的东西, 但是你要记得, 你是连安装都没安装过, 和人辩论的时候,低调一些, 多听, 这样被打脸也不那么疼。

连蒙带猜学 kylin

一句话定义: Apache Kylin,中文名麒(shen)麟(shou) 是Hadoop动物园的重要成员。Apache Kylin是一个开源的分布式分析引擎,最初由eBay开发贡献至开源社区。它提供Hadoop之上的SQL查询接口及多维分析(OLAP)能力以支持大规模数据,能够处理TB乃至PB级别的分析任务,能够在亚秒级查询巨大的Hive表,并支持高并发。

这个也不是我定义的, 别人定义的, 请自动忽略其中的一些废话, 比如 是Hadoop动物园的重要成员等。我们能看到 kylin 最牛逼的点在哪里

  • 多维分析
  • sql 查询
  • 支持 TB PB 亚秒级别的

我刚开始看的时候一脸懵逼, 在 TB PB 上查询, 亚秒级返回, 简直逆了天了, 我也是写过 spark 的人, 实在猜不出来怎么做到的, 让我们带着问题再来近看下

为了更好的适应大数据环境,Kylin从数据仓库中最常用的Hive中读取源数据,使用 MapReduce作为Cube构建的引擎,并把预计算结果保存在HBase中,对外暴露Rest API/JDBC/ODBC sql 的查询接口。

到这来我们就能尽情的猜测了, 让我自问自答

为什么他可以在那么大的数据量上, 那么快的查询出多个维度的聚合数据?
肯定不是查询的时候进行实时聚合的, 以往的经验告诉我无论采用何种处理方式,都不会那么快, 而且定义中提到一个关键词,预计算,那肯定就不是实时的, 是异步的,先把这些指标算出来, 然后你用 sql 查询的时候再对应起来, 以空间换时间来加速查询性能,

kylin 也不过如此呢, 看来牛吹得更大, 上来告诉你我可以以亚秒级别的速度查询 TP PB的数据, 好像有什么大招, 其实都是套路, 就是一个 :

  • 对每批数据, 跟根据你定义好的 维度 和聚合指标, 先进行计算
  • 支持 sql 解析, 把 sql 解析为语法树后, 对应到一个第三方存储中的对应的查询语句

异步肯定有异步的缺点, 就是你每次查询的数据都不包含, 最近一段时间的数据, kylin 还没有来得及累加到落地存储中的, 这种延迟问题, kylin 怎么处理?

如果我来设计, 我就要写一个东西, 可以适配 kafka 等实时数据流, 然后可以让用户定义多长时间执行一次聚会任务, 用户自己可以控制延迟

面对那么多维度的聚合, kylin 有没有什么特别牛叉的地方, 不然就真的什么都没有自己的了。

kylin 对整合的其他大数据框架, 是不是很灵活, 然后我来实现这样一个东西, 肯定都定义成协议接口, 比如我觉得 map reduce 不爽了, 直接把 计算的部分换成 spark

让我们来进一步找找 官网或者其他的博客, 下面有几张图, 首先是一个 kylin 的架构图

这个图里面能看到 kylin 的全部套路, 从 hive 中拿数据, 然后根据你定义的维度, 进行异步计算指标, 把结果存在 hbase 中, 查询的时候, 查询引擎把, 你的sql 解析为对应的 hbase 的查询,
我们来举个例子, 就是 你的 sql 为

select sex, avg(score) from table group by sex

根据不同的性别分组, 然后聚合平均成绩

加入你的原始数据在 hdfs 上, 对应到 hive 中的一个表, 你在 kylin 上启动一个 action 的时候
kylin 是这样玩的

  • 加载 hive 中的数据
  • 在你 build cube 的时候,根据你的定义的sql , 把你的 sql 转为 mapreduce 作业, 生成 mapreduce 任务, 执行
  • 结果 用你的 维度, sex 作为 hbase 的rowKey, 平均成绩, 作为一个 hbase 中的一个列存储下来
  • 你后面使用 sql 查询语句, 都转为 hbase 的一次 get 请求

针对维度特别多的场景, 我们假设上来 groupby a,b,c,d, 联合分组, 然后会分出很多个分组, 这个时候发现你还有 a,b,c 的维度统计, 就可以直接在你上一个 维度的聚合结果的基础上, 进行计算, 忽略 d 这个 维度就好了,

下面就是 kylin 吹的很响亮的 可扩展架构将Kylin的三大依赖(数据源、Cube引擎、存储引擎)彻底解耦
开发者和用户可以通过定制开发,将Kylin接入除Hadoop/HBase/Hive以外的大数据系统,比如用Kafka代替Hive作数据源,用 Spark代替MapReduce做计算引擎,用Cassandra代替HBase做存储,都将变得更为简单。这也保证了Kylin可以随平台技术一起演 进,紧跟技术潮流。

我搜索了一下, kylin 实时流处理, 还真有, ,它打破了以往只能从Apache Hive表构建Cube的局限,将数据从产生到可查询的延迟从小时级降低到了分钟级,满足了一些对实时性要求比较高的场景;Apache Kylin发布新版流处理引擎, 可以在任何时候,以你期望的频率触发构建,例如︰ 在白天每隔 5 分钟触发一次, 在夜间将频率降低到每个小时,

这个时候你可以说你精通 kylin 了么, 如果人家跟你讲原理, 你可以不用害怕, 但是如果人家跟你拼细节,
你听听就好了,

记得低调, 记得你连安装都没有安装过哦。

欢迎大家关注:sunbiaobiao's微信公众号