ApacheDrill大数据处理部—王维成都数联铭品2015.06.15•第一篇:ApacheDrill概述•第二篇:ApacheDrill优势•第三篇:ApacheDrill架构•第四篇:ApacheDrill原理•第五篇:ApacheDrill应用•第六篇:ApacheDrill性能•第七篇:ApacheDrill其他第一篇:概述•ApacheDrill是一个低延迟的分布式海量数据(涵盖结构化、半结构化以及嵌套数据)交互式查询引擎,使用ANSISQL兼容语法,支持本地文件、HDFS、Hive、HBase、MongoDB等后端存储,支持Parquet、JSON、CSV、TSV、PSV等数据格式。受Google的Dremel启发,Drill满足上千节点的PB级别数据的交互式商业智能分析场景。•本质上,ApacheDrill是GoogleDremel的开源实现,本质是一个分布式的mpp(大规模并行处理)查询层,支持SQL及一些用于NoSQL和Hadoop数据存储系统上的语言,将有助于Hadoop用户实现更快查询海量数据集的目的。•Drill的目的在于支持更广泛的数据源、数据格式及查询语言,可以通过对PB字节数据的快速扫描(大约几秒内)完成相关分析,将是一个专为互动分析大型数据集的分布式系统。GoogleDremel设计思想•随着Hadoop的流行,大规模的数据分析系统已经越来越普及。数据分析师需要一个能将数据“玩转”的交互式系统。如此就可以非常方便快捷的浏览数据,建立分析模型。Dremel系统有下面几个主要的特点:•Dremel是一个大规模系统。在一个PB级别的数据集上面,将任务缩短到秒级,无疑需要大量的并发。磁盘的顺序读速度在100MB/S上下,那么在1S内处理1TB数据,意味着至少需要有1万个磁盘的并发读。但是机器越多,出问题概率越大,如此大的集群规模,需要有足够的容错考虑,保证整个分析的速度不被集群中的个别慢(坏)节点影响。•Dremel是MR交互式查询能力不足的补充。和MapReduce一样,Dremel也需要和数据运行在一起,将计算移动到数据上面。所以它需要GFS这样的文件系统作为存储层。在设计之初,Dremel并非是MapReduce的替代品,它只是可以执行非常快的分析,在使用的时候,常常用它来处理MapReduce的结果集或者用来建立分析原型。•Dremel的数据模型是嵌套(nested)的。互联网数据常常是非关系型的。Dremel还需要有一个灵活的数据模型,这个数据模型至关重要。Dremel支持一个嵌套(nested)的数据模型,类似于Json。而传统的关系模型,由于不可避免的有大量的Join操作,在处理如此大规模的数据的时候,往往是有心无力的。•Dremel中的数据是用列式存储的。使用列式存储,可以只扫描需要的那部分数据的时候,减少CPU和磁盘的访问量。同时列式存储是压缩友好的,使用压缩,可以综合CPU和磁盘,发挥最大的效能•Dremel结合了Web搜索和并行DBMS的技术。首先,他借鉴了Web搜索中的“查询树”的概念,将一个相对巨大复杂的查询,分割成较小较简单的查询。大事化小,小事化了,能并发的在大量节点上跑。其次,和并行DBMS类似,Dremel可以提供了一个SQL-like的接口,就像Hive和Pig那样。第二篇:优势•学习成本低•低延迟的SQL查询•动态查询自描述数据文件(如JSON,Parquet,text),MAPR-DB/HBase表,不需要元数据定义的Hive元数据。•ANSISQL•嵌套数据支持•与ApacheHive一体化(Hive表和视图的查询,支持所有Hive文件格式和HiveUDFs)•BI/SQL工具集成使用标准的JDBC驱动程序•访问多个数据源•用户自定义函数(UDF)•高性能(设计上高吞吐量和低延迟,不使用通用的执行引擎,柱形矢量引擎)第三篇:架构•ApacheDrill的核心是DrillBit服务,主要负责接收客户端请求,处理查询,并将结果返回给客户端。•DrillBit能够被安装和运行在hadoop集群中所需要的节点上形成一个分布式环境。当DrillBit运行在集群的每个节点上时,能够最大限度的实现数据的本地化执行,不要进行网络和节点间的数据移动。Drill使用Zookeeper来维护和管理集群节点和节点的健康状况。•尽管Drill运行在hadoop集群中,但是它不依赖hadoop集群,可以运行在任何的分布式集群中。第四篇:原理•当提交一个Drill查询时,客户端或应用程序以SQL语句的方式发送查询给Drill集群中的DrillBit。DrillBit处理运行在每个活动节点上的查询计划和执行查询,以及跨集群分发查询任务以实现数据本地性的最大化。•DrillBit接收来自客户端和应用程序的Drill查询变成驱动整个查询的Foreman。Foreman解析器解析SQL,将自定义规则应用到特定的SQL操作符转换成特定的Drill理解的逻辑操作语法。集合的逻辑运算符形成逻辑的计划。逻辑计划描述了作业所需要生成的查询结果和定义了数据源与应用操作。•Foreman发送逻辑计划到一个基于优化在一个语句和逻辑读计划的SQL操作的顺序的优化器。优化器使用与各种类型规则的重新整理以及函数的最优化方案。优化器将逻辑计划转换成一个描述如何执行查询的物理计划。•Foreman并行化转换的物理计划分为多个阶段,包括主要(Major)和次要(Minor)的Fragment。这些Fragment根据配置的数据源执行并创建多级执行重写查询树,将结果返回给客户端和应用程序。MajorFragment:•MajorFragment是抽象的概念,代表查询执行的一个阶段。这个阶段由一个或多个操作组成。Drill为每个MajorFragment分配一个MajorFragmentID。•例如,执行两个文件的哈希聚合,Drill为这个计划创建两个MajorFragment,第一个Fragment用于扫描两个文件,第二个Fragment用于数据的聚合。•Drill通过一个交换操作符分离两个Fragment。交换的改变发生在数据所在位置或者物理计划的并行化中。交换是由发送器和接收器组成,允许数据在节点之间移动。•MajorFragment不执行任何的查询任务。每个MajorFragment被划分成一个或多个MinorFragment,执行实际所需完成的查询操作并返回结果给客户端。MinorFragments:•每个MajorFragment是由多个minorFragment并行构成的。一个MinorFragment是内部运行线程的逻辑作业单元。在Drill中,一个逻辑作业单元也被称为碎片(slice)。Drill产生的执行计划由MinorFragment组成。Drill为每个MinorFragment分配一个MinorFragmentID。•Foreman的并行器在执行期间从MajorFragment创建一个或多个MinorFragment,分解的MajorFragment与多个MinorFragment一样能同时运行在集群上。•Drill能够尽快的根据上游的数据需求来执行每个MinorFragment。Drill使用节点的本地化调度MinorFragment,然后Drill采用轮训的方式调度存在、可用的DrillBit。•MinorFragment包含一个或多个关系操作,一种操作执行一个关系操作,例如,scan、filter、join、group等。每种操作都有特定的操作类型和一个操作ID。每个操作D定义了它所在的MinorFragment的关系。•例如,当执行两个文件的散列聚集时,Drill拆分第一阶段致力于扫描进两个MinorFragment。每个MinorFragment包含扫描文件的扫描操作符。Drill拆分第二阶段为了聚集进四个MinorFragment。四个MinorFragment都包括散列聚集操作符。ExecutionofMinorFragments:•MinorFragment可以作为root、intermediate、leafFragment三种类型运行。一个执行树只包括一个rootFragment。执行树的坐标编号是从root开始的,root是0。数据流是从下游的leafFragment到rootFragment。•运行在Foreman的rootFragment接收传入的查询、从表读取元数据,重新查询并且路由到下一级服务树。下一级的Fragment包括Intermediate和leafFragment。•当数据可用或者能从其他的Fragment提供时,IntermediateFragment启动作业。他们执行数据操作并且发送数据到下游处理。通过聚合RootFragment的结果数据,进行进一步聚合并提供查询结果给客户端或应用程序。•LeafFragment并行扫描表并且与存储层数据通信或者访问本地磁盘数据。LeafFragment的部分结果传递给IntermediateFragment,然后对Intermediate结果执行合并操作。第五篇:应用•查询JSON:SELECT*FROMcp.`employee.json`LIMIT5;•查询Paquet:SELECT*FROMdfs.`/usr/local/hadoop/drill/sample-data/region.parquet`;查询普通文件:•select*fromdfs.`/usr/local/hadoop/data/plays.csv`;•selectcolumns[0],columns[1]fromdfs.`/usr/local/hadoop/data/plays.csv`;•usedfs;•SELECTCOLUMNS[0]ASNgram,•COLUMNS[1]ASPublication_Date,•COLUMNS[2]ASFrequency•FROM`/data1/bbdhadoop/wangwei/drill/googlebooks-eng-all-5gram-20120701-zo.tsv`•WHERE((columns[0]='ZoologicalJournaloftheLinnean')•AND(columns[2]250))LIMIT10;•查询目录:•selectcolumns[0],columns[1]fromdfs.`/data1/bbdhadoop/wangwei/drill/testdata`orderby1;•查询hbase:•SELECT*FROMstudents;•SELECTCONVERT_FROM(row_key,'UTF8')ASstudentid,•CONVERT_FROM(students.account.name,'UTF8')ASname,•CONVERT_FROM(students.address.state,'UTF8')ASstate,•CONVERT_FROM(students.address.street,'UTF8')ASstreet,•CONVERT_FROM(t.students.address.zipcode,'UTF8')ASzipcode•FROMstudents;•查询Hive:•SELECTfirstname,lastnameFROMhiveremote.`customers`limit10;`•复杂数据:•selectid,type,name,ppufromdfs.`/usr/local/hadoop/data/donuts.json`;•selectid,typefromdfs.`/usr/local/hadoop/data/donuts.json`whereid0orderbyidlimit1;•selecttbl1.id,tbl1.typefromdfs.`/usr/local/hadoop/data/donuts.json`astbl1joi