【CSDN人物访谈】蒋守壮分享他的技术成长之路以及对Hive技术的解读与思考
结缘大数据技术
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微服务化。