阅读更多

1顶
0踩

互联网
【编者按】Hive作为Hadoop家族的重要一员,具有学习成本低,开发者可通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用。在攒库中,Hive也不负众望,得到了非常高的票数。为此,CSDN知识库特邀社区专家蒋守壮(博客:http://blog.csdn.net/jiangshouzhuang)绘制了Hive技术图谱,帮助广大开发者更加系统、全面的学习直播技术。

Hive知识库发布,速来关注!

与此同时,我们还采访了蒋守壮老师,分享他的技术成长之路以及对Hive技术的解读与思考。



CSDN社区专家、知识库特邀编辑蒋守壮

结缘大数据技术
CSDN:请简单地介绍一下自己。

蒋守壮:首先非常感谢CSDN能够给我这次被专访的机会,可以让我重新审视自己的职业发展历程,也希望能够帮助一些同行的朋友们。目前就职万达网络科技集团有限公司,是一名大数据分析师和大数据平台架构师。

我是电子专业出身,但自己对软件行业非常感兴趣,所以大学里一边学习本专业课程,一边到图书馆或活跃在相关技术网站上学习计算机专业课程。虽然累点苦点,但是为自己职业生涯打下了扎实的基础。

从毕业后至今,我已经在IT圈跌打滚爬5年多了,经历了很多,有苦有乐,这些都丰富了自己的阅历。工作以来,我一直热爱分享和交流技术,热衷于写博客(CSDN),参与开源社区(Apache一些顶级项目),也乐于在Github上开源自己的软件产品。慢慢地,我从一名菜鸟,成长为资深工程师和架构师,但是我要学习的东西太多了,我会一直坚持下去。

CSDN:你是如何与计算机结缘,踏上大数据开发之路的,能否跟我们分享一下。

蒋守壮:其实我与计算机结缘的原因,可能会和一些朋友相似,是因为黑客,觉得很酷,也很有挑战性的。这是一个启蒙阶段,于是我开始漫长的探索,学习汇编,C语言,C++,Java;学习计算机原理,Linux内核;学习网络,TCP/IP;学习密码学;学习各种主流数据库;学习脚本,Perl,Python,Shell等等。为了测试一些病毒,因为不可能用自己笔记本的操作系统测试,于是就开始研究虚拟化技术,使用虚拟机搭建各种Linux操作系统进行模拟测试,就这样,走上了一条不归路(是技术研究不归路,不是进局里了)。在这个探索的过程中,发现自己对Linux和数据库方面特别感兴趣,于是2011年毕业后就从事了Linux和数据库方面的工作。

从2012年底开始,我开始接触MPP(大规模并行处理)架构的关系型数据库,使用和维护过Vertica和Greenplum等MPP架构的数据库。在电信行业分析TB和PB级别海量数据时性能还是非常不错的。但是随着业务的发展,处理非结构化和半结构化数据的需求迫在眉睫。我一直关注和参与Apache开源社区,见证了Hadoop生态圈的快速发展,Hadoop非常方便处理非结构化和半结构化数据,于是我们的大数据平台架构开始融合Hadoop,形成混合架构。随着Hadoop生态圈家族不断壮大,支持各种场景的组件出现,SQL支持也非常完善,于是大数据平台架构就逐渐以Hadoop为核心来构建。尤其这两年来,Spark,Flink等通用并行框架不断发展壮大,集成批处理,流计算,实时分析,机器学习和图计算,为企业级构建大数据平台提供更多的选择。

CSDN:分享一下你最近使用的框架,它们都解决了哪些方面的问题。

蒋守壮:前段时间,我使用Kafka,Spark Streaming和HBase来进行实时数据计算分析,将保险用户相关的数据发送到Kafka消息队列,后端将从Kafka消费数据,并使用Spark Streaming进行流数据实时分析,然后将处理后的数据写入HBase集群中,最后用户从HBase中获取分析好的数据。

现阶段,我们基于现有的Hadoop大数据平台,集成Apache Kylin组件,Kylin可以对Hive中的表进行关联后多维度处理,并将结果写入HBase,其与Hadoop生态圈整合非常完善,非常适合用来做海量数据规模下的OLAP分析,进行实时或准实时查询上百亿数据。另外,Kylin和BI工具也可以很好的集成,比如Tableau,Saiku等。

Hive痛点直击&经验分享
CSDN:hive的使用场景有哪些?适合实时性强的分析场景使用么?

蒋守壮:Hive是建立在Hadoop上的数据仓库基础构架,它的最佳使用场合是大数据集的批处理作业,一般延迟性比较高,并不能够在大规模数据集上实现低延迟快速的查询,所以不适合实时性强的分析场景。不过目前Hive底层的计算框架除了支持原生的MapReduce,还支持Tez和Spark,这对提升Hive的查询处理性能帮助很大,从Hive 2.0版本开始,推荐使用Tez或Spark作为Hive的计算引擎。

如果希望实时查询分析,可以结合Impala,Presto,Drill等开源的交互式、实时的查询引擎使用,它们能够访问Hive中的表进行数据查询分析。

CSDN:hive的技术特点有哪些? 类sql操作啊,内置大量用户函数udf等等。

蒋守壮:Hive应该是第一个出现的SQL on Hadoop的产品,技术特点如下:
  • 类SQL查询方式,支持标准SQL也比较全面;
  • 支持索引,加快数据查询;
  • 元数据保存在关系型数据库中,比如MySQL,可以减少查询过程中执行语义检查的时间;
  • 支持多种数据存储格式类型,比如Text,Sequence,RCFile,Parquet和ORC等,针对不同的场景进行选择;
  • 数据存储在HDFS分布式文件系统中,实现冗余高可用;
  • 内置常用的基本函数,以及窗口分析型函数,同时支持用户自定义UDF,UDAF,UDTF函数;
  • 底层计算引擎支持MapReduce,Tez和Spark,根据需要进行动态选择。

CSDN:Hive创建的内部表和外部表有何异同?

蒋守壮:这个其实和很多传统数据库中的内部表和外部表一样,没有什么差别。

我将从表的创建和删除两方面简单介绍一下:
  • Hive 创建内部表时,后面执行导入操作时会将用户数据移动到表所在的数据仓库指向的路径;
  • 若创建外部表时,只会记录表对应的用户数据所在的路径,不对用户数据的位置做任何改变。
  • 在删除表的时候,内部表的元数据和用户数据会被一起删除;
  • 而外部表只会删除元数据,不删除用户数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。


CSDN:Hive的优化技巧有哪些?比如如何处理数据倾斜、大表与小表join时,如何优化性能。

蒋守壮:Hive优化其实涉及到几方面,其中一方面是计算引擎方面的优化,比如你使用MapReduce作为计算引擎,那么就需要优化MapReduce;如果你选择Spark作为计算引擎,那么需要对Spark进行优化。

这里我仅从Hive这一层面介绍该如何优化,基本内容如下:

(1)表设计层面优化
  • 合理利用中间结果集,避免查过就丢的资源浪费,减低Hadoop的IO负载
  • 合理设计表分区,包括静态分区和动态分区
  • 尽量不使用复杂或低效函数,比如count(distinct),可以使用其他方式实现
  • 选择合适的表存储格式和压缩格式
  • 如果某些逻辑使用系统函数可能嵌套好几层,那么可以使用自定义函数实现
  • 适当使用索引

(2)语法和参数层面优化
  • 合理控制mapper和reducer数
  • 设置map和reduce的内存大小
  • 合并小文件
  • 避免数据倾斜,解决数据倾斜问题

处理数据倾斜的方法其实有很多,不论是Group by还是Join时出现数据倾斜,其实都是数据热点的问题,即某些Key值太多,导致都分发到一个节点执行,那么我们可以将数据量比较大的Key拿出来单独处理,最后再合并到结果集中。如果出现数据倾斜的Key值对结果无关紧要,比如空值,那么我们可以过滤处理,或者将空值加上随机数,进行分发到集群的所有节点并行处理。当然也可以利用Hive自带的参数进行优化,设置当分组或关联的Key值超过多少数量时,进行单独处理,即额外启动一个MapReduce作业处理。
这方面的具体优化过程,请参考我的技术博客
  • 减少Job数
  • Join优化

尽量将小表放到join的左边。小表和大表join时,如果差一个以及以上数量级并且小表数据量很小,可以使用mapjoin方式,将小表全部读入内存中,在map阶段进行表关联匹配。大表和大表进行关联时,要注意数据倾斜的问题。如果两个表以相同Key进行分桶,以及表的桶个数是倍数关系,可以使用bucket join,加快关联查询。
  • 避免笛卡尔积
  • 提前裁剪数据,减少处理的数据量,避免资源浪费

(3)Hive Job优化
  • 并行化执行——每个查询被Hive转化成多个阶段,有些阶段关联性不大,则可以并行化执行,减少执行时间。
  • 本地化执行
  • JVM重利用——JVM重利用可以是Job长时间保留slot,直到作业结束,这在对于有较多任务和较多小文件的任务是非常有意义的,减少执行时间。
  • 推测执行——所谓的推测执行,就是当所有的task都开始运行之后,Job Tracker会统计所有任务的平均进度,如果某个task所在的节点配置内存比较低或者CPU负载很大,导致任务执行比总体任务的平均执行要慢,此时Job Tracker就会在其他节点启动一个新的相同的任务,原有任务和新任务哪个先执行完就把其他节点的另外一个任务kill掉。
  • Hive中间结果压缩数据——中间压缩就是处理Hive查询的多个job之间的数据,对于中间压缩,最好选择一个节省CPU耗时的压缩方式


CSDN:分享一下Hive数据仓库经验。

蒋守壮:由于Hive的类SQL和类数据库功能,它向非编程人员开放了大数据Hadoop生态系统,Hive也推动了Hadoop的普及和发展。

企业使用Hive来构建数据仓库,一是可以节约成本,二是基于SQL开发,将传统数据库迁移到Hadoop平台上分析也相关方便,三是支持和Hive集成的Hadoop生态圈的产品也丰富,满足架构扩展。

在使用Hive来构建企业级数据仓库时要注意以下几点:
  • 根据不同业务数据来源,在Hive创建不同的数据库,方便分类管理;
  • 表的文件存储格式尽量采用Parquet或ORC,不仅降低存储量,还优化了查询,压缩,表关联等性能;
  • Hive的计算引擎,推荐使用Tez或Spark;
  • 实现用户权限的控制,针对不同项目设置相应的用户,相互之间权限独立,实现数据安全,也可以根据需要,授予相应表权限。


学习心得
CSDN:关于技术学习您有什么心得?我们上线了知识库系统化学习的方法,您会怎么应用呢?

蒋守壮:其实我学习任何一门新技术的过程都比较相似,可以总结为以下几点:
  • 俗话说,工欲善其事,必先利其器,首先我一般都会根据官方文档将环境搭建起来,然后运行官方的示例,先从整体上感受一下。
  • 阅读该新技术比较好的书籍或博客文档,最好结合官方文档一起阅读,一定要记得做笔记或写博客。与此同时,可以多加入一些技术群或公众号。
  • 当对该技术的原理,架构,基本操作都熟练时,就开始寻找好的项目进行实战,现在Github上开源项目很多,可以学习别人的思路或开发过程。
  • 源码分析,这个是加深理解该技术的关键步骤。如果你只希望达到应用的水平,可以不用分析源码;但是如果你希望能够优化或者定制该技术某些方面,那么分析源码是必经的过程。
  • 对于源码分析,一定不要漫无目的的查看源码,因为现在很多开源软件的代码比较多,这样你将很容易进入黑洞,不可自拔,回头一看,可能啥都不知道了。源码分析先挑选简单的模块分析,搭建好调测平台,进行代码跟踪,这样可以增加自信心。假如我要分析Spark源码,我首先查看Spark启动、客户端访问部分的源码,看一下RDD底层源码如何实现,也就是你要选择一个主题去分析源码并跟踪调测,久而久之,我就会将很多模块内容串联起来,也慢慢加深对Spark源码的理解。
  • 最后,对修改的源码进行重新编译打包,然后部署环境进行验证,体会激动的时刻。

上面的过程是交互循环的,不是一蹴而就的,你将需要经历时间的磨练,而且在这过程中,你会遇到很多问题,一定要对每个问题刨根问底,从根本上解决,并且坚持做好笔记或写博客,方便后续查看。

另外,CSDN推出的知识库,给我们提供了系统学习的方法。如果我要学习一门新技术,比如Docker,我可以进入Docker知识库,里面列出了Docker的每个知识点,并且每个知识点下面都会有该领域的专家精选的博客文章。此外,还可以把其它平台上看到的干货添加到自己的个人图谱当中,创建你的专属知识库。选择自己感兴趣的知识点进行系统学习,效率非常高。

CSDN:听说你在10月份即将推出自己的第一本技术书籍,请简单介绍一下。

蒋守壮:Apache的顶级项目Apache Kylin,这是一个开源的分布式分析引擎,是由eBay研发并贡献给开源社区,其提供Hadoop之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据。书的名字暂定为《基于Apache Kylin构建企业级大数据分析平台》,预计10月份底左右出版,该书比较全面地介绍Apache Kylin的各方面,以及集成到现有的大数据平台中进行多维数据分析。

关注Kylin项目很久了,也见证了第一个由中国团队完整贡献到Apache的顶级项目。尤其这一年多,Kylin快速发展,功能和稳定性不断提升,我也积极地参与Kylin开源社区,同时也希望借助自己的微薄力量来推广Kylin的使用,帮助更多的朋友认识和使用Kylin来解决企业中基于Hadoop的多维数据分析的需求。

CSDN:你最近关注的技术有哪些?

蒋守壮:这段时间研究的技术,大体上有三方面,这里我就简单描述一下,具体大家可以访问官网查询更多内容:

第一方面:自动化运维工具Ansible。Ansible算是比较新的自动运维工具,基于Python开发,集合了众多运维工具的优点,实现了批量系统配置,批量程序部署和批量运行命令等功能。研究这方面内容,主要是因为项目组已经实现基于Ansible快速部署高可用并且安全的大数据平台,提升用户的体验效果和满意度。

第二方面:Flink实时流处理框架。个人一直觉得Flink在实时流方面的架构非常优秀,而且只需要很少的配置就能够实现高吞吐率和低延迟。将来希望在项目中更多地实战Flink实时流处理应用。

第三方面:Docker容器技术。深入研究Docker在分布式和大数据架构中的应用,比如基于Docker构建企业的私用镜像仓库,方便企业能够快速部署大数据平台,也可以将企业中的一些应用实现Docker微服务化。

推荐阅读:
  • 大小: 88.4 KB
1
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 索引介绍聚集索引和非聚集索引

    关于索引的介绍,以及b+树结构图,两种索引性能比较,索引优化建议

  • [Oracle]索引

    (这篇文章有几个地方的阐述略有问题,正在修改。。。) oracle索引的数据结构基于 B+ 树,纯阐述,0 示例,因此在理解方面可能有难度,望对大家有帮助! 如果文中阐述不全或不对的,多多交流。

  • 关于索引的详细使用

    1、索引介绍索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息,与在表中搜索的所有行相比,索引有助于更快地获取信息2、索引分类(1)聚簇索引与数据存放一起,与数据...

  • 关于索引的重新理解

    4.主键索引(一张表,以主键排序(主键字段+其他字段)),这张表都是按顺序来的,也就是说先从主表中,将id排序,然后,插到索引表中,所以索引表,都是1,2,3全部在树的右边,如果走这张索引表,就会很快,找到id ...

  • 关于索引的最左前缀原则

    索引的最左前缀

  • SqlServer关于索引创建和删除

    增删索引易,使用难、选择难

  • mysql索引详解

    五、如何触发联合索引 1、对user表建立联合索引username、password 2、触发联合索引 (1)使用联合索引的全部索引键可触发联合索引 (2)使用联合索引的全部索引键,但是用or连接的,不可触发联合索引 (3)单独...

  • Oracle数据库关于索引的使用详细介绍

    索引是由Oracle维护的可选结构,为数据提供快速的访问。准确地判断在什么地方需要使用索引是困难的,使用索引有利于调节检索速度。 当建立一个索引时,必须指定用于跟踪的表名以及一个或多个表列。一旦建立了索引,...

  • 关于索引的sql语句

    关于索引的sql语句 一 创建索引 1.1 ALTER TABLE 用来创建普通索引,UNIQUE索引,PRIMARY KEY索引 ALTER TABLE table_name ADD INDEX index_name (column_list) ALTER TABLE table_name ADD UNIQUE (column_list) ...

  • mysql datetime列索引_关于索引:在mysql中索引datetime字段是个好主意吗?

    在mysql数据库中索引datetime字段是一个好主意吗?我试图让我的数据库运行良好,查询运行顺利更多,您认为我应该创建一个高效数据库的想法是什么?什么是field 20?MySQL建议使用索引有多种原因,包括消除条件之间...

  • 关于索引的降序排列

    创建索引:利用SQL*Plus为医院表的医院名称创建索引,并以降序排列,索引名为“hospital_name_index”。

  • 关于mysql数据库索引 说法正确的是_关于MySQL索引 ,下面说法正确的是() (1)B+...

    1)B+Tree和BTree不是一个概念,大多数 MySQL 存储引擎的默认索引类型是BTree B树 即二叉搜索树:1.所有非叶子结点至多拥有两个儿子(Left和Right);2.所有结点存储一个关键字;3.非叶子结点的左指针指向小于其关键字...

  • mysql关于or的索引问题_mysql关于or的索引问题

    起问:一条sql语句只能用一个索引么?SELECT * FROM `comment` WHERE `toconuid` = '10' or `tocomuid` = '10'其中 toconuid列 和 tocomuid列 分别为单列索引explain后 显示两个索引都用了,extra为 Using union...

  • 关于索引cardinality的知识

    关于索引cardinality的知识

  • 索引详解

    1.什么是索引? 1.索引是一种能提高数据库查询效率的数据结构。它可以比作一本字典的目录,可以帮你快速找到对应的记录。 2.索引一般存储在磁盘的文件中,它是占用物理空间的。 3.适当的索引能提高查询效率,过多的...

  • Mysql索引详解

    Mysql索引相关总结(一): 1. 什么是索引 2. 索引有什么用 3. 如何创建索引 4. 如何查看索引 5. 索引的分类 6. 索引的数据结构浅析 7. 什么情况下需要索引 8. 什么情况下不会走索引 9. 索引相关补充 10. 索引常见...

  • 索引总结大全 (史上最详细)

    1、[为什么索引能提高查询速度] 1、为什么索引能提高查询速度 先从 MySQL 的基本存储结构说起 MySQL的基本存储结构是页(记录都存在页里边): MySQL的基本存储结构是页 各个数据页可以组成一个双向链表 每个数据页...

  • 索引的原理

    索引原理,为什么是B+ 树, 为什么会有做前缀法则,索引为什么会失效

  • Oracle关于重建索引争论的总结

    主要介绍了Oracle关于重建索引争论的总结,本文总结了重建索引的理由、重建索引的本质、反对重建索引的理由等内容,需要的朋友可以参考下

  • mysql主键索引和普通索引区别_mysql中,主键与普通索引

    一、什么是索引?索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量...

Global site tag (gtag.js) - Google Analytics