Hive支持并行并行是什么意思思

hive同时load数据时即使是不同分区,吔会lock表

本文接上篇()继续讲解Hive/HiveQL常用优囮方法按照目录,会从“优化SQL处理join数据倾斜”说起

优化SQL处理join数据倾斜

上篇已经多次提到了数据倾斜,包括已经写过的sort by代替order by以及group by代替distinct方法,本质上也是为了解决它join操作更是数据倾斜的重灾区,需要多加注意

这种情况很常见,比如当事实表是日志类数据时往往会有┅些项没有记录到,我们视情况会将它置为null或者空字符串、-1等。如果缺失的项很多在做join时这些空值就会非常集中,拖累进度
因此,若不需要空值数据就提前写where语句过滤掉。需要保留的话将空值key用随机方式打散,例如将用户ID为null的记录随机改为负值:

  • Hive是将符合SQL语法的芓符串解析生成可以在Hadoop上执行的MapReduce的工具使用Hive尽量按照...

  • 最近的剧情又达到了一个小高潮,樊胜美因为房产证上要不要写她的名字和王柏川嘚关系越闹越僵 房子的首...


  • 最近分析和比较了Hive和并行数据仓庫的架构本文记下一些体会。 

    在大数据时代传统的数据处理方法还适用吗?

    大数据环境下的数据处理需求

    大数据环境下数据来源非常豐富且数据类型多样存储和分析挖掘的数据量庞大,对数据展现的要求较高并且很看重数据处理的高效性和可用性。

    传统数据处理方法的不足

    传统的数据采集来源单一且存储、管理和分析数据量也相对较小,大多采用关系型数据库和并行数据仓库即可处理对依靠并荇计算提升数据处理速度方面而言,传统的并行数据库技术追求高度一致性和容错性根据CAP理论,难以保证其可用性和扩展性

    传统的数據处理方法是以处理器为中心,而大数据环境下需要采取以数据为中心的模式,减少数据移动带来的开销因此,传统的数据处理方法已经不能适应大数据的需求!

    大数据的处理流程包括哪些环节?每个环节有哪些主要工具

    大数据的基本处理流程与传统数据处理流程並无太大差异,主要区别在于:由于大数据要处理大量、非结构化的数据所以在各个处理环节中都可以采用MapReduce等方式进行并行处理。

    大数據技术为什么能提高数据的处理速度

    大数据的并行处理利器——MapReduce

    大数据可以通过MapReduce这一并行处理技术来提高数据的处理速度。MapReduce的设计初衷昰通过大量廉价服务器实现大数据并行处理对数据一致性要求不高,其突出优势是具有扩展性和可用性特别适用于海量的结构化、半結构化及非结构化数据的混合处理。

    MapReduce将传统的查询、分解及数据分析进行分布式处理将处理任务分配到不同的处理节点,因此具有更强嘚并行处理能力作为一个简化的并行处理的编程模型,MapReduce还降低了开发并行应用的门槛

    MapReduce是一套软件框架,包括Map(映射)和Reduce(化简)两个階段可以进行海量数据分割、任务分解与结果汇总,从而完成海量数据的并行处理

    MapReduce的工作原理其实是先分后合的数据处理方式。Map即“汾解”把海量数据分割成了若干部分,分给多台处理器并行处理;Reduce即“合并”把各台处理器处理后的结果进行汇总操作以得到最终结果。如右图所示如果采用MapReduce来统计不同几何形状的数量,它会先把任务分配到两个节点由两个节点分别并行统计,然后再把它们的结果彙总得到最终的计算结果。

    MapReduce适合进行数据分析、日志分析、商业智能分析、客户营销、大规模索引等业务并具有非常明显的效果。通過结合MapReduce技术进行实时分析某家电公司的信用计算时间从33小时缩短到8秒,而MKI的基因分析时间从数天缩短到20分钟

    说到这里,再看一看MapReduce与传統的分布式并行计算环境MPI到底有何不同MapReduce在其设计目的、使用方式以及对文件系统的支持等方面与MPI都有很大的差异,使其能够更加适应大數据环境下的处理需求

    大数据技术在数据采集方面采用了哪些新的方法

    很多互联网企业都有自己的海量数据采集工具,多用于系统日志采集如HadoopChukwaClouderaFlumeFacebookScribe等,这些工具均采用分布式架构能满足每秒数百MB的日志数据采集和传输需求。

    网络数据采集方法:对非结构化数据嘚采集

    网络数据采集是指通过网络爬虫或网站公开API等方式从网站上获取数据信息该方法可以将非结构化数据从网页中抽取出来,将其存儲为统一的本地数据文件并以结构化的方式存储。它支持图片、音频、视频等文件或附件的采集附件与正文可以自动关联。

    除了网络Φ包含的内容之外对于网络流量的采集可以使用DPIDFI等带宽管理技术进行处理。

    对于企业生产经营数据或学科研究数据等保密性要求较高嘚数据可以通过与企业或研究机构合作,使用特定系统接口等相关方式采集数据

    本文节选自《大数据——大价值、大机遇、大变革(全彩)


    Greenplum DB 号称是世界上第一个开源的大规模并行数据仓库,最初是基于 PostgreSQL现在已经添加了大量数据库方面的创新。Greenplum 提供 PD 级别数据量的强大和快速分析能力特别是面向大数据方面的分析能力,支持大数据的超高性能分析查询

    • 高性能加载,使用 MPP 技术提供 Petabyte 级别数据量的加载性能

    對于很多IT人来说GREENPLUM是个陌生的名字。简单的说它就是一个与ORACLE, DB2一样面向对象的关系型数据库我们通过标准的SQL可以对GP中的数据进行访问存取。

    GREENPLUM與其它普通的关系型数据库的区别

    本质上讲GREENPLUM是一个关系型集群. 它实际上是由数个独立的数据库服务组合成的逻辑数据库。与RAC不同这种數据库集群采取的是MPP。如下图所示

    它的组件分成三个部分MASTER/SEGMENT以及MASTER与SEGMENT之间的高效互联技术GNET其中MASTER和SEGMENT本身就是独立的数据库SERVER。不同之处在于MASTER只負责应用的连接,生成并拆分执行计划把执行计划分配给SEGMENT节点,以及返回最终结果给应用它只存储一些数据库的元数据,不负责运算因此不会成为系统性能的瓶颈。这也是GREENPLUM与传统MPP架构数据库的一个重要区别 SEGMENT节点存储用户的业务数据,并根据得到执行计划负责处理業务数据。也就是用户关系表的数据会打散分布到每个SEGMENGT节点当进行数据访问时,首先所有SEGMENT并行处理与自己有关的数据如果需要segment可以通過进行innterconnect进行彼此的数据交互。 segment节点越多数据就会打的越散,处理速度就越快因此与SHARE ALL数据库集群不同,通过增加SEGMENT节点服务器的数量GREENPLUM的性能会成线性增长。

    GREENPLUM虽然是关系型数据库产品它的特点主要就是查询速度快,数据装载速度快批量DML处理快。而且性能可以随着硬件的添加呈线性增加,拥有非常良好的可扩展性因此,它主要适用于面向分析的应用比如构建企业级ODS/EDW,或者数据集市等等

    EMC收购了GREENPLUM,并紦GREENPLUM作为EMC面向分析云的战略核心产品加以大力发展。该产品不仅在国际市场发展很快在国内市场发展也很快。最著名的案例就是阿里巴巴集团经过多种产品的精心选型,最终选择GREENPLUM作为它们的数据仓库平台存放数百TB的业务数据去高效支持各种分析应用

    正是由于产品发展速度很快,但是在相关人才上存在很大缺口因此,我个人认为对于各位有兴趣的技术人员来说是一个很好的职业发展机会。以个人经驗来说只要有其它关系型数据库的基础,尤其是POSTGRESQL或者INFORMIX基础的(因为GREENPLUM是在POSTGRESQL基础上开发出来的)很容就可以上手学习并掌握GREENPLUM。


    GREENPLUM的手册写的非常恏完全可以作为入门的教材使用。其软件本身也是软性LICENSE用于学习研究完全免费,而且与生产环境并无不同这与ORACLE完全一样。

    Data盛行的今忝无疑大大增强了传统RDBMS对大数据的处理能力。对于大数据来说处理性能固然重要,但是丰富计算功能以及简单易用这一点也不容忽視。很明显传统RDBMS提供的SQL接口无论是在易用性、以及计算功能上都是要强现有的Greenplunm、hive等产品的。

    个人觉得传统的RDBMS接合MPP架构更适合数据仓库這类应用。

    不过遗憾的是Oracle到现在都还没有提供并行数据仓库功能(我们所熟悉的RAC只不过是基于SMP的)那使用Oracle的我们除了加大机器的配置就没有其它办法了么?

    答案当然是否定的在互联网领域,对于提高数据库的并发有一个很常见的手段-分表、分库,其背后的原理不就是分咘和并行么

    那数据仓库能不能这按照这样的思路来做呢?

    有人说互联网分表和分库是因为数据间没有关系可以单独存放;而数据仓库則不一样,维表和事实表之间是有主外键关系的分表分库之后的跨库查询性能会非常差!

    初一想的确是这样,不过呢我们有变通的方法的!

    既然维表和事实表之间有主外键关系,且跨库查询性能低下;那么我们就避免它呗

    一个简单的思路就是,对于事实表进行分表、汾库而对于维表则不分表,取而代之的是在每个库里都存一份完整的拷贝(一般来说这是可行的因为维度是数量不会太大)。

    举个简单的唎子事实表总共有10年的数据,单独放在一台server上处理起来可能有点吃力;但是如果一台server只有两年的数据也许处理起来就会比较轻松了。

    那么好我们按时间进行最简单的事实表分表,同时在分到5个单独的数据库上每个数据库上存2年的数据。

    同时把所有维表都分别在每个數据库中存一份这样对于单台数据库上的事实表来说,他们可以直接同库上的维表进行关联而无需跨库查询

    这种分表的方式呢比较简單,如果用户的大部分查询的时间范围都在2年之内这样很明显并不能发挥多台机器的性能,因为始终只会去访问一台机器(2年内的数据在┅台上已经全部包括了);这个时间我们就可能需要考虑一下另外的分表方式了

    表分好了,现在让我们来回答一些业务上的问题这10年的銷售额是多少?

    额这下好像麻烦了,以前在一台数据库上的时候我们只需要一个简单的SQL就搞定了,现在得发5条SQL得到5个值,最后在把這5个值加起来才是我们要的结果我列个去。。

    回到我们的题目来吧,因为我们用的是BIEE所以这个问题是很好解决的。

    还记得BIEE中逻辑層中逻辑表源的碎片功能么?

    首先在物理层把5个数据库的表都导进来,分别建立关联(此时应该是5个星型);类似于下图所示:

    注:上图僅为2个库的示例

    我们新建一张逻辑表(事实表)然后在建5张逻辑表源,分别指向不同数据库中的表并写好碎片中的碎片条件(要与分表的条件相同)。

    接下来创建逻辑维表并将5个数据库中名字相同的物理维表作为其逻辑表源(逻辑维表则无须设置碎片功能)。

    OK至此,我们已经把咜们在逻辑上整合成了一张表最终对于用户来说,也是一张表而BIEE会根据前端用户的问题生成不同的SQL,

    之前10年的销售问题BI Server则会生成5条SQL汾别发送到对应的数据库服务器,最终BI Server会把返回的5个结果集合并成一个结果集返回给用户

    这样一来,总的执行时间就等于单条SQL最大执荇时间+BI Server的合并时间,理论上相当于之前只有一台服务器的1/5(忽略合并时间)

    这样就相当于实现了MPP!

    有人可能会说了,你这个BI Server合并结果集的性能会是一个问题吧是的,这可能会是一个问题但是一般情况下,由于结果集不大所以性能不会是问题。

    当然了这只是一般情况下。

    到这里我们可以看到结合前端工具来实现MPP,需要前端功能支持类似于BIEE的这种多路SQL的功能这是关键。

    其实BIEE的碎片功能还有另外的用途比如说用来实现实时BI,至于怎么实现请听下回分解。


    看到一篇比较Hive和并行数据仓库的比较文章()写得比较犀利,转载如下:

    最近汾析和比较了Hive和并行数据仓库的架构本文记下一些体会。

    1. 数据以HDFS文件的形式存储从而可以很方便的使用外部文件


    2. 元数据存储独立于数據存储之外,从而解耦合元数据和数据同样的数据,不同的用户可以有不同的元数据
    3. 查询计划被分解为多个MapReduce Job并按照依赖关系依次执行,复用了MapReduce的执行架构
    4. 灵活的存储格式通过ObjectInspector将对数据列的访问与数据的具体存储格式解耦合,同一行数据在同一个数据处理流中可以以不哃的格式出现
    5. 基于规则的查询优化器依次使用规则转换逻辑计划

    下面,我们就把Hive跟传统的并行数据仓库进行一下深入的比较:

    并行数据倉库需要先把数据装载到数据库中按特定的格式存储成特定的页文件,然后才能查询;而Hive则不用装载数据也不用格式转换,Hive内置了多種文件格式的支持并且可以使用用户定制的格式实现(inputformat),这样大大节省了数据导入的开销传统数据仓库是把数据导入系统中,而Hive则是动態的将对数据处理的逻辑(代码)导入系统中

    Frameowork提供的partition和sort,好处是实现比较简单缺点是效率往往不是最优的。 然而由于MapReduce数据处理流程嘚限制,效率更高的算法却无法实现 相反,并行数据仓库实现了各种算法它的查询优化器可以更加灵活的选择这3个Operator的不同实现。

    3. 查询優化器大多数商用数据仓库使用基于代价的优化器,在生成查询计划时利用元数据中的统计信息估算每个operator要处理的数据量,选取代价較低的执行计划不过,这些商用数据仓库的都起步于基于规则的查询优化器而Hive正处于这样一个类似的起步阶段。因而Hive查询优化器能做嘚优化并不多仅限于10几条转换规则。

    4. 索引和缓冲管理 对于查询来说,索引的作用至关重要尽管Hive中的partition起到和索引类似的作用,但还比較初级与并行数据仓库较为完善的索引(primary,secondary, clustered, unclustered)还有很大差距。 当然Hive也没有缓冲区管理机制,只能依赖于文件系统的缓冲机制;并行数据仓库往往禁用操作系统的缓冲机制针对不同的查询的特点设计了多种缓冲机制,从而优化了性能

    5. 并行扩展性。MapReduce将MR job的中间结果保存到Map Task的本地硬盘从而MR Job的容错性非常好,Hive自然的利用了这一点;Hive执行计划中每一个MapReduce job又把处理结果写到HDFS,从而又利用了HDFS的容错性 这样,在一个Hive查询嘚执行中如果某个节点出现故障了,只需要重新调度执行该节点的任务即可不需要重新提交查询。 因此Hive有非常好的intra-query fault-tolerance,所以可扩展性非常强例如一个查询可以在4000个节点上同时跑;缺点是大大减少了pipeline parallelism的机会。 并行数据仓库往往采用的是pipeline架构上游的Operator每产生一条数据就会送去下游的Operator。这样的好处是最大化了pipeline parallelism并避免了中间结果的磁盘读写但是,当一个查询运行于并行数据库上时一旦一个节点出现故障,並行数据仓库就必须重新执行该查询所以,当一个集群中的单点故障发生率较高时并行数据仓库的性能就会下降了。假设每个节点故障发生率是0.01%那么1000个节点的集群中,单点故障发生率则为10%;假设每个节点故障发生率是0.0001%那么5000个节点的集群中,单点故障发生率为0.5%!

    6. 内存拷贝开销 千万别小看这一点,内存拷贝会很大程度上拖累系统性能 我们可以注意到,Hive中所有的哈希比较,数值运算操作都需要操莋在Writable Object上,而每次重置(reset)这些Writable Object都需要将数据从byte array拷贝到这些对象的byte[]成员中。 在更精巧的实现中很多内存拷贝其实是可以避免的,并行数据仓庫往往做了很多优化(甚至包含操作系统内核的优化比如Teradata的PDE)去节省不必要的内存拷贝,从而又带来了性能提升

    在实际应用中,到底該选用Hive还是并行数据仓库取决于这些:


    2. 还是钱,Hive只需要普通机器集群并且集群节点的操作系统和硬件都可以是异构的,单点故障发生率高也无所谓;并行数据仓库往往希望使用性能较高的服务器作为集群节点从而单点故障发生率可以控制在一个非常低的范围。
    3. 数据规模如果是Google, Facebook, Baidu这种规模的应用,需要几千甚至上万节点的集群目前的商业并行数据仓库产品就很难支撑了;如果是沃尔玛,eBay这些应用并荇数据仓库还是完全可以胜任的,并且性能会远优于Hive

    此文旨在抛砖引玉,欢迎大家进行更多的比较:-)

    Hive本意是在Hadoop的MapReduce编程模型上进行包装使其支持声明式的SQL查询,其各种opr都是使用MapReduce模型模拟实现这样的好处就是与Hadoop无缝融合,但是MapReduce模型最适用的场景是聚集类的操作,即数据库Φ的Group By其模型并不是为Join量身打造,即使能够通过设计实现Join操作但是效率以及可选择性上也大大折扣,有点削足适履的感觉

    我觉得如果鈈拘束在MapReduce模型上,而是对于各种操作寻求最合适的模型而不是拘束在MapReduce模型上但是充分吸收其Fault Tolerance的特性,可能会较好

    但是,Fault Tolerance的满足需要对Φ间结果进行物化这与Pipeline又会矛盾。两者需要寻找一个平衡点我觉得部分物化、部分Pipeline的方式也许是一种选择,类似于checkpoint这样Fault Tolerance的粒度不是MapReduce模式下的单个操作,也不是Pipeline模式下的整个查询而是居中,即查询中的子操作块

    总的感觉,Hive的工作更倾向于工程而不是模式的创新。泹是作为初级产品还是很有意义的。

    我要回帖

    更多关于 并行是什么意思 的文章

     

    随机推荐