达观数据分析平台架构和Hive实践

发表于:2017-8-03 10:11

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:wangjj89621    来源:博客园

分享:
  Hadoop于2006年1月28日诞生,至今已有10年,它改变了企业对数据的存储、处理和分析的过程,加速了大数据的发展,形成了自己的极其火爆的技术生态圈,并受到非常广泛的应用。在2016年Hadoop十岁生日之际,InfoQ策划了一个Hadoop热点系列文章,为大家梳理Hadoop这十年的变化,技术圈的生态状况,回顾以前,激励以后。
  近十年来,随着Hadoop生态系统的不断完善,Hadoop早已成为大数据事实上的行业标准之一。面对当今互联网产生的巨大的TB甚至PB级原始数据,利用基于Hadoop的数据仓库解决方案Hive早已是Hadoop的热点应用之一。达观数据团队长期致力于研究和积累Hadoop系统的技术和经验,并构建起了分布式存储、分析、挖掘以及应用的整套大数据处理平台。
  本文将从Hive原理、数据分析平台架构、数据分析实战、Hive优化等四个方面来分享一些关于系统架构和Hive的心得和实战经验,希望大家有所收获。
  1 Hive原理
  Hadoop是一个流行的开源框架,用来存储和处理商用硬件上的大规模数据集。对于HDFS上的海量日志而言,编写Mapreduce程序代码对于类似数据仓库的需求来说总是显得相对于难以维护和重用,Hive作为一种基于Hadoop的数据仓库解决方案应运而生,并得到了广泛应用。
  Hive是基于Hadoop的数据仓库平台,由Facebook贡献,其支持类似SQL的结构化查询功能。Facebook设计开发Hive的初衷就是让那些熟悉sql编程方式的人也可以更好的利用hadoop,hive可以让数据分析人员只关注于具体业务模型,而不需要深入了解Map/Reduce的编程细节,但是这并不意味着使用hive不需要了解和学习Map/Reduce编程模型和hadoop。对于Hive分析人员来说,深入了解Hadoop和Hive的原理和Mapreduce模型,对于优化查询总有益处。
  1.1 Hive组件与模型
  Hive的组件总体上可以分为以下几个部分:用户接口(UI)、驱动、编译器、元数据(Hive系统参数数据)和执行引擎。Hive中包含4中数据模型:Tabel、ExternalTable、Partition、Bucket。
  图:hive数据模型
  a) Table:每一个Table在Hive中都有一个相应的目录来存储数据;
  b) Partition:表中的一个Partition对应于表下的一个目录,所有的Partition数据都存储在对应的目录中;
  c) Buckets:对指定列计算的hash,根据hash值切分数据,目的是为了便于并行,每一个Buckets对应一个文件;
  d) External Table指向已存在HDFS中的数据,可创建Partition。
  读时验证机制
  与传统数据库对表数据进行写时严重不同,Hive对数据的验证方式为读时模式,即只有在读表数据的时候,hive才检查解析具体的字段、shema等,从而保证了大数据量的快速加载。
  如果表schema与表文件内容不匹配,Hive会尽其所能的去读数据。如果schema中表有10个字段,而文件记录却只有3个字段,那么其中7个字段将为null;如果某些字段类型定位为数值类型,但是记录中却为非数值字符串,这些字段也将会被转换为null。Hive会努力catch读数据时遇到的错误,并努力返回。既然Hive表数据存储在HDFS中且Hive采用的是读时验证方式,定义完表的schema会自动生成表数据的HDFS目录,且我们可以以任何可能的方式来加载表数据或者利用HDFS API将数据写入文件,同理,当我们若需要将hive数据写入其他库(如oracle),也可以直接通过api读取数据再写入目标库。
  再次注意,加载或者写入的数据内容要和表定义的schema一致,否则将会造成字段或者表为空。
  1.2 HQL翻译成MapReduce Job
  Hive编译器将HQL代码转换成一组操作符(operator),操作符是Hive的最小操作单元,每个操作符代表了一种HDFS操作或者MapReduce作业。Hive中的操作符包括:TableScanOperator、ReduceSinkOperator、JoinOperator、SelectOperator、FileSinkOperator、FilterOperator、GroupByOperator、MapJoinOperator等。
  Hive语句
  INSERT OVERWRITE TABLE read_log_tmp
  SELECT a.userid,a.bookid,b.author,b.categoryid 
  FROM user_read_log a JOIN book_info b ON a.bookid = b.bookid;
  其执行计划为:
  图:join的任务执行流程
  1.3 与一般SQL的区别
  Hive 视图与一般数据库视图
  Hive视图只支持逻辑视图,不支持物化视图,即每次对视图的查询hive都将执行查询任务,因此视图不会带来性能上的提升。作为Hive查询优化的一部分,对视图的查询条件语句和视图的定义查询条件语句将会尽可能的合并成一个条件查询。
  Hive索引与一般数据库索引
  Hive1.2.1版本目前支持的索引类型有CompactIndexHandler和Bitmap。
  CompactIndexHandler 压缩索引通过将列中相同的值得字段进行压缩从而减小存储和加快访问时间。需要注意的是Hive创建压缩索引时会将索引数据也存储在Hive表中。对于表tb_index (id int, name string) 而言,建立索引后的索引表中默认的三列一次为索引列(id)、hdfs文件地址(_bucketname)、偏移量(offset)。
  Bitmap 位图索引作为一种常见的索引,如果索引列只有固定的几个值,那么就可以采用位图索引来加速查询。利用位图索引可以方便的进行AND/OR/XOR等各类计算,Hive0.8版本开始引入位图索引,位图索引在大数据处理方面的应用广泛,比如可以利用bitmap来计算用户留存率(索引做与运算,效率远好于join的方式)。如果Bitmap索引很稀疏,那么就需要对索引压缩以节省存储空间和加快IO。Hive的Bitmap Handler采用的是EWAH(https://github.com/lemire/javaewah)压缩方式。
  2 数据分析平台
  2.1 架构与模块
  达观数据分析平台包括数据收集加载模块、数据分析计算模块、任务调度系统以及可视化系统。
  图:数据分析平台基本框架
  数据收集模块
  数据模块负责收集移动端app、网页端以及服务器端大量的日志数据。移动端可自行开发数据上报功能或者使用sdk来上报数据。网页端利用植入的js将用户的行为进行上报,服务器端通过http server来收集上报的数据。服务器端的日志信息可以通过DX模块(一个跨库的数据交换系统)来将待处理数据推入hive数据分析平台。除此之外,数据来源还包括大量的user 、item基本数据等等。数据收集完成将所有需要处理分析的原始数据推入hadoop平台。从物理形式来看,即将待分析数据写入HDFS。
  数据ETL模块
  一般而言,上报的数据都是非结构化或者半结构化的。ETL(抽取、转换、加载)模块负责将所有的非结构或者半结构的数据转换成结构化的数据并加载到hive库表中。例如对于用户访问日志(可能是web server日志),我们需要从每行日志中抽取出用户的标识(cookie、imei或者userid),ip来源、url等。从形式上来看,ETL将HDFS的原始数据结构化,以表的形式提供分析。
  数据分析与计算
  根据业务需求和功能,利用HQL实现各种统计分析。一个Hive任务的来源表可能是多个,结果数据也有可能会写入多张表。
  图:Hive任务执行输入输出
  任务调度系统
  从上图可以看出,Hive任务之间存在依赖关系,不至于Hive任务之间存在依赖,Hive任务与DX任务之间、DX任务之间都可能存在某种依赖关系,达观数据分析平台支持的任务类型还包括MR任务、shell任务等,达观数据分析平台自行开发司南调度系统来完成平台中所有任务的调度。关于司南调度系统可见后续讨论。
  数据分析平台模块
  图:数据分析平台基本模块
  接下来将陆续介绍,数据分析平台中的两个重要模块:DX数据交换系统以及任务调度系统。
  2.2 DX数据交换
  DX系统可以在关系型数据库、Hive、FTP等系统之间实现数据的交换。DX定义了Writer和Reader接口来抽象对数据的读写操作,对于各种存储类型的数据,需定制他们的实现方法。
  关系型数据库利用JDBC实现其读写功能;对于Hive而言,直接利用HDFS API实现对HDFS文件的读写,由于Hive的读时验证机制,需要在读写Hive表文件时,定义其字段个数、名称等信息,保证与表定义一致;FTP文件目前的处理方法是先将数据从FTP服务器拉下来,然后将读取文件内容,写入Hive数据库。
  以上过程是其他数据源到Hive的数据传输过程,Hive数据同样可以通过DX系统写入其他数据源。
  2.3 任务调度
  达观数据分析平台开发的司南调度系统将任务分为资源依赖型和实践依赖型。时间依赖型任务类似于crontab定时任务一样,到时触发其执行。资源依赖型任务需要其依赖的资源都满足时才会触发其执行。可调度的任务类型包括DX任务、Hive任务、MR任务、shell任务等。
  司南系统中最为关键的是dispatcher模块,该模块通过zookeeper来调度任务在agent(执行任务的代理服务器,需要设置多个)上的运行,关于zookeeper如何协调分布式应用的一致性在此不再累述。
  2.4 架构演化
  达观数据分析平台在使用过程中,不断提高其易用性和稳定性。在大量的研究和开发过程中,平台从无到有,走出第一步到功能完善、发挥巨大的业务价值。
  从分散的数据交换到集中的数据交换系统
  在使用统一的数据交换系统DX后,各业务系统的数据可以更好的进行汇聚和打通,进行统一的分析和处理。
  从分散的作业调度到集中的任务调度系统
  每天几千规模的任务数使得任务的调度极其困难,特别是当任务之间存在依赖关系时,显然简单的通过crontab已经无法满足业务的需求。司南调度系统保证所有任务有序正确的运行。
  从批量式处理到集成流式处理
  随着实时统计分析的需求越来越多,hive查询基于MR任务来实现的缺点日益明显(任务启动开销大)。为了提供实时的数据分析请求,平台开始引入storm流式计算模型。Storm以数据流为驱动。触发计算,每来一条数据就产生一次计算结果,时效性非常高,在业界也得到了丰富的应用。
  从关系型数据库到Hbase
  初期,数据分析的结果数据都是通过DX导入关系型数据库,以便数据可视化平台调用或者其他系统使用,大量的数据造成关系数据库的日益庞大,带来严重的性能问题。HBase是一个开源、列式分布式的数据库,基于HDFS文件系统,可以方面的和Hive进行集成。经过集成HBase,为可视化平台和线上系统提供服务,降低DX任务量,降低访问延迟。

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号