编辑推荐

  《Presto技术内幕》由浅入深地详细介绍了Presto的安装过程、内部运行原理机制、功能特性、性能优化方法,以及在应用过程中常见的问题及解决方案等,同时详细介绍了JD-Presto版本的许多新功能及其适用的业务场景,这些功能的成功研发,使得JD-Presto版本不仅仅可用于离线大数据分析计算来提升性能,还可用于多种数据源混合进行实时大数据分析计算,使一些使用其他大数据技术不能解决的业务场景有了一个全新有效的解决方案。

内容简介

  Presto是专门为大数据实时查询计算而设计和开发的产品。由于Presto是基于Java语言开发的,因此,对使用者和开发者而言,Presto极易学习、使用并针对特定的业务场景进行改造开发和性能优化。无论是对多数据源支持,还是高性能、易用性、可扩展性等方面,Presto都是大数据实时查询计算产品中的佼佼者。
  《Presto技术内幕》按照由浅入深的顺序对Presto进行了全方位的细致讲解,具体内容包括Presto概述、Presto安装与部署、PrestoRESTful框架解析、提交查询、生成查询执行计划、查询调度、查询执行、队列、SystemConnector、HiveConnector、KafkaConnector、Connector开发、Functions开发、JD-Presto功能改造、Presto性能调优、Presto应用场景。

目录

第一部分基础篇
第1章Presto概述2
1.1Presto背景及发展2
1.2Presto特点2
1.3基本概念3
1.3.1Presto服务进程3
1.3.2Presto模型4
1.3.3Presto查询执行模型5
1.4Presto整体架构9
1.4.1硬件架构9
1.4.2软件架构9
1.5小结11
第2章Presto安装与部署12
2.1环境说明12
2.2准备工作13
2.2.1建立SSH信任关系13
2.2.2安装Java17
2.2.3安装Maven17
2.2.4安装Hive18
2.3源码编译21
2.3.1下载源码21
2.3.2源码结构说明22
2.3.3编译26
2.4部署30
2.4.1服务部署30
2.4.2客户端部署38
2.4.3JDBC使用40
2.5小结42
第二部分核心设计篇
第3章PrestoRESTful框架解析44
3.1Statement服务接口44
3.2Query服务接口47
3.3Stage服务接口48
3.4Task服务接口49
3.5小结52
第4章提交查询53
4.1提交查询的步骤53
4.2源码解析53
4.3提交查询的流程60
4.4小结61
第5章生成查询执行计划62
5.1基本概念63
5.1.1Node63
5.1.2MetadataAPI67
5.2词法与语法分析68
5.2.1语法规则69
5.2.2词法分析69
5.2.3语法分析71
5.3获取QueryExecution72
5.3.1获取QueryExecutionFactory72
5.3.2创建QueryExecution73
5.3.3启动QueryExecution74
5.4语义分析77
5.4.1Statement分析77
5.4.2Relation分析84
5.4.3表达式分析91
5.5执行计划生成91
5.5.1执行计划节点91
5.5.2SQL执行计划93
5.5.3Relation执行计划95
5.5.4Query执行计划99
5.6执行计划优化102
5.6.1ImplementSampleAsFilter102
5.6.2CanonicalizeExpressions102
5.6.3SimplifyExpressions102
5.6.4UnaliasSymbolReferences103
5.6.5PruneRedundantProjections103
5.6.6SetFlatteningOptimizer103
5.6.7LimitPushDown104
5.6.8PredicatePushDown104
5.6.9MergeProjections104
5.6.10ProjectionPushDown104
5.6.11IndexJoinOptimizer105
5.6.12CountConstantOptimizer105
5.6.13WindowFilterPushDown105
5.6.14HashGenerationOptimizer105
5.6.15PruneUnreferencedOutputs106
5.6.16MetadataQueryOptimizer106
5.6.17SingleDistinctOptimizer106
5.6.18BeginTableWrite106
5.6.19AddExchanges107
5.6.20PickLayout107
5.7执行计划分段107
5.7.1Source107
5.7.2Fixed107
5.7.3Single107
5.7.4Coordinator_only107
5.8示例108
5.8.1Count执行计划108
5.8.2Join执行计划108
5.9小结110
第6章查询调度111
6.1生成调度执行器111
6.2查询调度过程113
6.2.1NodeManager114
6.2.2NodeSelector115
6.3小结118
第7章查询执行119
7.1查询执行逻辑120
7.2Task调度120
7.2.1SourceTask调度120
7.2.2FixedTask调度126
7.2.3SingleTask调度128
7.2.4Coordinator_OnlyTask调度128
7.3Task执行129
7.3.1创建Task129
7.3.2更新Task135
7.3.3运行Task140
7.4小结147
第8章队列148
8.1配置说明148
8.1.1queues队列定义149
8.1.2rules规则定义149
8.2队列加载150
8.3队列匹配151
8.4小结154
第9章SystemConnector155
9.1SystemConnector使用155
9.1.1Information_schema155
9.1.2Metadata157
9.1.3Runtime157
9.2SystemConnector实现159
9.2.1Information_schema实现160
9.2.2SystemConnector实现163
9.3小结168
第10章HiveConnector169
10.1与Hive的结合170
10.2Split分片管理175
10.3数据读取179
10.4CreateTableAsSelect的实现182
10.5小结186
第11章KafkaConnector187
11.1认识KafkaConnector187
11.1.1配置187
11.1.2配置属性187
11.1.3内置字段189
11.1.4表定义文件190
11.1.5Kafka中的key和message191
11.1.6行解码192
11.1.7日期和时间解码器194
11.1.8文本解码器194
11.1.9数值解码器194
11.2Kafka连接器使用教程194
11.2.1安装ApacheKafka195
11.2.2下载数据195
11.2.3在Presto中配置Kafkatopics197
11.2.4基本数据查询197
11.2.5添加表定义文件199
11.2.6将message中所有值映射到不同列200
11.2.7使用实时数据202
11.3KafkaConnector获取数据207
11.3.1Split分片管理207
11.3.2数据读取209
11.4小结210
第12章Connector开发211
12.1创建Maven工程211
12.2注册Plugin213
12.3Connector213
12.4Metadata215
12.5SplitManager217
12.6RecordSetProvider218
12.7小结219
第13章Functions开发220
13.1Function注册220
13.2窗口函数225
13.3聚合函数229
13.4小结232
第三部分高级篇
第14章JD-Presto功能改造234
14.1PDBO功能开发234
14.1.1JDBCSplit剖析235
14.1.2JdbcRecordCursor剖析238
14.1.3分批次读取实现原理240
14.1.4动态步长实现原理243
14.1.5条件下发245
14.1.6PDBO配置定义247
14.2DDL及DML支持250
14.2.1Hive连接器Insert功能250
14.2.2Hive连接器CTAS动态分区表功能252
14.3动态增加、修改、删除Catalog254
14.3.1目的254
14.3.2现状254
14.3.3实现255
14.3.4效果258
14.4小结258
第15章Presto性能调优259
15.1合理设计分区259
15.2GroupBy字句优化259
15.3使用模糊聚合函数259
15.4合并多条Like子句为一条regexp_like子句260
15.5大表放在Join子句左边260
15.6关闭distributedhashjoin261
15.7使用ORC存储261
15.8小结262
第16章Presto应用场景263
16.1ETL263
16.2实时数据计算264
16.3Ad-Hoc查询266
16.4实时数据流分析266
16.5小结268
附录A常见问题及解决办法269
A.1同时访问两个Hadoop集群269
A.2Kafka集群重启后无法获取数据272
A.3Taskexceededmaxmemorysize277
A.4SQL中In子句太长导致栈溢出错误278
A.5高并发导致大量查询出错279
附录BPresto配置参数说明282
附录CPresto执行信息说明289

精彩书摘

  1.3.3Presto查询执行模型
  Presto在执行SQL语句时,将这些SQL语句解析为相应的查询,并在分布式集群中执行这些查询。
  1.Statement
  Statement语句。其实就是指我们输入的SQL语句。Presto支持符合ANSI标准的SQL语句。这种语句由子句(Clause)、表达式(Expression)和断言(Predicate)组成。Presto为什么将语句(Statement)和查询(Query)的概念分开呢?因为在Presto中,语句和查询本身就是不同的概念。语句指的是终端用户输入的用文字表示的SQL语句;当Presto执行输入的SQL语句时,会根据SQL语句生成查询执行计划,进而生成可以执行的查询(Query),而查询代表的是分布到所有的Worker之间执行的实际查询操作。
  2.Query
  Query即查询执行。当Presto接收一个SQL语句并执行时,会解析该SQL语句,将其转变成一个查询执行和相关的查询执行计划。一个查询执行代表可以在Presto集群中运行的查询,是由运行在各个Worker上且各自之间相互关联的阶段(Stage)组成的。
  那么SQL语句与查询执行之间有什么不同呢?
  其实很简单,你可以认为SQL语句就是提交给Presto的用文字表示的SQL执行语句。而查询执行则是为了完成SQL语句所表述的查询而实例化的配置信息、组件、查询执行计划和优化信息等。一个查询执行由Stage、Task、Driver、Split、Operator和DataSource组成。这些组件之间通过内部联系共同组成了一个查询执行,从而得到SQL语句表述的查询,并得到相应的结果集。
  3.Stage
  Stage即查询执行阶段。当Presto运行Query时,Presto会将一个Query拆分成具有层级关系的多个Stage,一个Stage就代表查询执行计划的一部分。例如,当我们执行一个查询,从Hive的一张具有1亿条记录的表中查询数据并进行聚合操作时,Presto会创建一个RootStage(在后面的章节你会知道,该Stage就是SingleStage),该Stage聚合其上游Stage的输出数据,然后将结果输出给Coordinator,并由Coordinator将结果输出给终端用户。Presto技术内幕。
  通常情况下,Stage之间是树状的层级结构。每个Query都有一个RootStage。该Stage用于聚集所有其他Stage的输出数据,并将最终的数据反馈给终端用户。需要注意的是,Stage并不会在集群中实际执行,它只是Coordinator用于对查询执行计划进行管理和建模的逻辑概念。每个Stage(除了SingleStage和SourceStage)都会有输入和输出,都会从上游Stage读取数据,然后将产生结果输出给下游Stage。需要注意的是:SourceStage没有上游Stage,它从Connector获取数据。SingleStage没有下游Stage,它的结果直接输出给Coordinator,并由Coordinator输出给终端用户。
  Presto中的Stage共分为4种,具体介绍如下。
  Coordinator_Only:这种类型的Stage用于执行DDL或者DML语句中最终的表结构创建或者更改。
  Single:这种类型的Stage用于聚合子Stage的输出数据,并将最终数据输出给终端用户。
  Fixed:这种类型的Stage用于接受其子Stage产生的数据并在集群中对这些数据进行分布式的聚合或者分组计算。
  Source:这种类型的Stage用于直接连接数据源,从数据源读取数据,在读取数据的时候,该阶段也会根据Presto对查询执行计划的优化完成相关的断言下发(PredicatePushDown)和条件过滤等。
  说明
  由于一个SQL查询可以被分解为多个前后关联的Stage,在这里我们约定:按照数据的流向,越靠近数据源的Stage越处于上游,越远离数据源的Stage越处于下游。
  4.Exchange
  Exchange的字面意思就是“交换”。Presto的Stage是通过Exchange来连接另一个Stage的。Exchange用于完成有上下游关系的Stage之间的数据交换。在Presto中有两种Exchange:OutputBuffer和ExchangeClient。生产数据的Stage通过名为OutputBuffer的Exchange将数据传送给其下游的Stage(根据数据的流向,分为上下游,你可以将Presto中查询执行过程中的数据比喻成一条河流,那么产生数据的Stage相对于消费数据的Stage来说,就是上游)。消费数据的Stage通过名为ExchangeClient的Exchange从上游Stage读取数据。如果当前的Stage是Source类型的Stage,那么该Stage则是直接通过相应的Connector从数据源读取数据的。而该Stage则是通过名为SourceOperator的Operator与Connector进行交互的。例如,如果一个SourceStage直接从HDFS获取数据,那么这种操作不是通过ExchangeClient来完成的,而是通过运行于Driver中的SourceOperator来完成的。
  5.Task
  从前面的章节我们可以知道,Stage并不会在Presto集群中实际运行,它仅代表针对于一个SQL语句查询执行计划中的一部分查询的执行过程,只是用来对查询执行计划进行管理和的各个Worker节点上的。
  在Presto集群中,一个查询执行被分解成具有层级关系的一系列的Stage,一个Stage又被拆分为一系列的Task。每个Task处理一个或者多个Split。每个Task都有对应的输入和输出。一个Stage被分解为多个Task,从而可以并行地执行一个Stage。Task也采用了相同的机制:一个Task也可以被分解为一个或者多个Driver,从而并行地执行一个Task。同的机制:一个Task也可以被分解为一个或者多个Driver,从而并行地执行一个Task。
  说明
  由于一个SQL查询可以被分解为多个前后关联的Stage,而每个Stage中均含有一个或者多个Task,在这里我们约定:按照数据的流向,越靠近数据源的Task越处于上游,越远离数据源的Ta越处于下游。
  6.Driver
  一个Task包含一个或者多个Driver。一个Driver其实就是作用于一个Split的一系列Operator的集合。因此一个Driver用于处理一个Split,并且生成相应的输出,这些输出由Task收集并且传送给其下游Stage中的一个Task。一个Driver拥有一个输入和一个输出。
  7.Operator
  一个Operator代表对一个Split的一种操作,例如过滤、加权、转换等。一个Operator依次读取一个Split中的数据,将Operator所代表的计算和操作作用于Split的数据上,并产生输出。每个Operator均会以Page为最小处理单位分别读取输入数据和产生输出数据。Operator每次只会读取一个Page对象,相应地,每次也只会产生一个Page对象。
  8.Split
  Split即分片。一个分片其实就是一个大的数据集中的一个小的子集。而Driver则是作用于一个分片上的一系列操作的集合,而每个节点上运行的Task,又包含多个Driver,从而一个Task可以处理多个Split。其中每一种操作均由一个Operator表示。分布式查询执行计划的源Stage(SourceStage)通过Connector从数据源获得多个分片。SourceStage对Split处理完毕之后,会将输出传递给其下游Stage(通常其下游Stage的类型为Fixed或者Single)。
  当Presto执行一个查询的时候,首先会从Coordinator得到一个表对应的所有Split。然后Presto就会根据查询执行计划,选择合适的节点运行相应的Task处理Split。
  ……

前言/序言

序言1
  12年来,京东一直以开源技术作为构建自身核心技术体系的基础,在开源领域深耕多年,积极推动行业分享与交流。JD-Presto是京东首个贡献于开源社区的软件产品,开创了京东回馈开源社区的先河。
  一年前,JD-Presto研发团队是京东众多研发团队中的普通一员,时至今日,他们已成长为京东负有盛名的研发团队之一。一年来,他们忍受着孤独与寂寞,面对着无数困难与挫折,但他们从未放弃,凭着对技术的热爱、对信念的坚守、对优秀产品的执着追求,勇敢面对困难与挑战,历尽艰辛,终于迎来胜利的曙光。目前JD-Presto在京东内部已成功应用于精准营销、安全识别、商家后台、财务报表等十多个生产系统。京东为拥有JD-Presto研发团队而骄傲!
  与书店里的Hadoop书籍不同的是,《Presto技术内幕》是市面上第一本详细介绍Presto的书籍。它由浅入深地详细介绍了Presto的安装过程、内部运行原理机制、功能特性、性能优化方法,以及在应用过程中常见的问题及解决方案等,同时详细介绍了JD-Presto版本的许多新功能及其适用的业务场景。这些功能的成功研发,使得JD-Presto版本不仅可用于离线大数据分析计算来提升性能,还可用于多种数据源混合进行实时大数据分析计算,使一些使用其他大数据技术不能解决的业务场景有了一个全新有效的解决方案。同时,他们维护着Presto在中国社区的建设,鼓舞着和培养了一群Presto的爱好者。
  今天,国内已有越来越多的技术人员与公司在使用JD-Presto版本,相信《Presto技术内幕》能对读者学习和使用JD-Presto版本提供很大的帮助。《Presto技术内幕》不仅仅满足了初学者对技术书籍的渴求,也适合对JD-Presto版本有一定使用经验的人员学习参考使用。希望它能成为你在Presto技术旅程中的一个朋友,点亮你前进的道路。
  张晨
  京东集团CTO
  

序言2
  记得我刚加入京东的时候,Hadoop的集群建设方兴未艾,大数据计算纷纷被转到Hadoop中进行处理。然而,以前做数据挖掘的同学并不十分精通Java语言。他们更擅长于业务和SQL语言。为了让他们的工作更有效率、更得心应手,有必要找寻一个像GoogleDremel一样,以SQL为驱动的交互式Ad-hoc查询工具。于是我花了一些时间进行评估,包括Hive、Spark、Impala等,后来Facebook刚开源不久的Presto便映入眼帘。Presto设计简单精巧,可以处理海量数据,最大化地利用硬件性能,计算全部在内存中完成,很好地利用高速网络来进行数据调度,其编码风格一致,易于掌握和改进。虽然在当时Presto的数据源和SQL的支持度还有待丰富,但已经初步展示了发展的潜力,很适合京东的应用。Presto就这样在京东找到了家。JD-Presto研发团队成员具有多年JAVA编程和分布式并行处理经验,他们工作兢兢业业,在原先开源的基础上,丰富了多种数据源的处理接口,并且通过对任务调度的追踪和分析,改进并提升了并行处理任务的吞吐量。我们积极和Facebook的Presto团队合作,成为Presto在国内的首批贡献者,建立并运行Presto的中国社区。我们也和CSDN的同仁建立了Presto的开发者论坛,在国内积极推广,普及Presto知识,让更多的开发人员受益。
  京东是开源社区的受益者,也是开源开放文化的拥护者。我们将自己取得的点点滴滴毫无保留地回馈于开源社区,与大家共享,和大家一起进步。为了更好地服务于对Presto有兴趣的研发人员,京东的同事们将平时工作中的积累和认识编辑成书,奉献给大家,希望他们的努力有助于读者学习和掌握Presto。在此,我特别感谢为此书出版而辛勤工作的同事,他们是吕信、郭李明、袁安峰、孔云龙、戴东东等人。
  翁志
  京东集团首席技术顾问
  

序言3
  Prestoisanopensource,highlyscalable,distributedSQLenginewedevelopedatFacebook.Sincereleasingittwoyearsago,wehavewitnessedatremendousamountofcommunityinterestandadoption.Inthelasttwelvemonths,thePrestocommunityhasgrownfromtechnologyfirmsinSiliconValleytoabroadvarietyoforganizationsworldwide.Today,NASDAQ,thesecondlargeststockexchangeintheUnitedStates,runsPrestotopowertheiranalyticalusecases.
  (Presto是我们在Facebook开发的开源、高度可扩展的分布式SQL引擎。Presto在两年前发布后,大量的社区开始关注和后续应用Presto。在最近的12个月里,Presto社区已经一家硅谷科技公司成长为全球性的生态圈,涵盖一批多样化的组织。如今,全美第二大证券交易所纳斯达克也在使用Presto来驱动他们的案例分析业务。)
  AsorganizationsadoptPresto,manyarecontributingbacktoit.Teradata,aleaderindatawarehousingtechnology,maintainsagroupofengineerswhocontributetoPresto.WehavealsocollaboratedwithengineersatJD.comsince2014tomakePrestobetter.Prestoearnedan"OpenSourceOutstandingProject"awardatthe2015ChinaOpenSourceWorldSummit.
  (组织机构们不仅在应用Presto,他们中的一部分也在回馈Presto。Teradata,数据仓库技术领域内的引领者之一,拥有一支专门为Presto贡献力量的工程师团队。从2014年起,我们与中国电商领域引领者京东公司的开发人员展开合作,精益求精地打造Presto产品。随后Presto在2015年“第十届开源中国开源世界高峰论坛”上获取“2015COPU开源优秀项目大奖”。)
  WehopeyouwilllearnmoreaboutPrestothroughthisbookdevelopedbyengineersatJD.com,andweencourageyoutoworkwiththecommunitytoimprovePresto.
  (我们真诚地希望你通过这本由京东工程师们撰写的书更深入地了解Presto引擎,也鼓励并期待你携手社区,改善Presto引擎。)
  JayTang
  ManagerofPrestoproduct,BigData

前言
  为什么要写这《Presto技术内幕
  相信很多软件开发人员在遇到应用系统涉及需要多种数据源、多种字符集下的混合计算时,都被数据的准确性和查询性能所困扰,一直以来都没有一个有效的技术方案能解决这个问题。2014年7月,京东CTO体系首席技术顾问翁志先生把Presto引入京东,数据准确性验证表明,Presto在多种数据源、多种字符集下的混合计算均表现优异,数据准确性符合财务标准。我们认识到,Presto是一个非常优秀的产品,尽管它有许多不足,我们决心把它打造为一个介于T+1计算和生产实时报表之间混合计算的大数据产品,支持秒级、分钟级获取查询结果、支持多并发的交互式Ad-Hoc查询与分析。Presto是一个较为完美的大数据实时计算解决方案,而市面上这类产品太少了,我们将经过生产环境验证的JD-Presto版本源给业内使用,主导Presto中国社区的推广工作。应广大Presto技术爱好者的要求,我们编写了这《Presto技术内幕》,以帮助更多的初学者、大数据领域的从业者学习及使用JD-Presto。和其他许多调研过Presto的部门或公司一样,我们最初搭建的Presto测试集群在京东这种大数据量的环境下复杂计算任务几乎运行不起来,JOIN查询也比较弱,集群时常宕机。同时,在测试过程中我们也发现,与Spark、Impala相比,Presto使用更为简单、易用、高效,这让我们深感振奋,一致认为这个产品值得团队花大力气去研究和优化。因此,我们专门申请了上百台高性能服务器来搭建性能测试集群环境,随后在几百TB级数据量下进行大规模的测试与验证,完全证实了Presto的平均性能是Hive等离线数据分析产品性能的10倍,并且支持ANSI标准SQL、数据源完全解耦等一系列优势。在之后一年多的时间中,我们研发了众多实用功能,着力修复了许多Bug,大幅提升了Presto的查询性能和并发执行性能,如重写了数据库驱动,使得Presto连接数据库进行海量数据查询的性能提升了几百倍;优化了内存使用效率,使查询性能对内存大小的依赖大幅降低;支持分布式数据库的分库分表设计;优化数据存储算法。通过上述一系列新功能的成功研发和对性能的大幅改进,使得JD-Presto的性能稳定是是Hive的10倍以上,是Spark的3倍以上,集群成本节省一半,在一个大规模的大数据集群中,这种技术优势可带来显著的经济效益。
  

Presto技术内幕》读者对象
  Java研发工程师;
  在大数据技术领域从业的研发工程师、运维工程师、架构师;
  对大数据研究方向感兴趣的大学老师和学生、以及大数据技术的入门学者;
  从事海量数据分析应用的开发者、研究者。
  

如何阅读《Presto技术内幕
  《Presto技术内幕》按照由浅入深的顺序对大数据实时计算产品Presto进行了全方位的细致讲解,从基本的安装部署与使用到源码解析,以及根据实际业务需求进行新功能改造开发和性能优化。
  若你从来没有使用过Presto,那么完全可以按照由浅入深的顺序从头开始阅读此书。
  若你已经成功地使用了Presto一段时间,想要深入地了解Presto的设计思想并希望从源码级别了解Presto的实现思路,那么可以直接从核心设计篇进行阅读。
  若你本来就是Presto的贡献者,苦于Presto不能满足你的实际业务问题,想要对Presto进行功能改造但是还没有明确的思路;又或者你在使用Presto的过程中发现其性能没有达到你的预期,而又找不到优化的方案,那么高级篇会给你提供一些建议。
  在《Presto技术内幕》最后的附录部分不仅对Presto使用过程中出现的各种问题给出了明确的解决方案,还对Presto中的各个配置参数的含义和作用进行了详细的说明并给出了推荐配置值。
  相信此书会为广大大数据爱好者提供一个新的视角,思考并解决大数据相关问题。
  

勘误和支持

由于作者水平和能力有限,编写时间仓促,《Presto技术内幕》存在不妥之处在所难免,我们真诚希望同行和广大读者朋友们不吝赐教。另外,如果你有关于JD-Presto的任何问题,可以加入我们的QQ群:141254058,与我们在线交流,或者访问网站:http://prestodb-china.com/,期待你的反馈意见,我们将不胜感激。
  

致谢

感谢现任京东CTO体系首席技术顾问、信息安全部、京东硅谷研发中心负责人翁志先生,在产品研发和推广使用的过程中给予了我们极大的支持和鼓励。同时在《Presto技术内幕》出版的过程中,从选题、审稿到出版无不得到他的热心帮助,在此致以深深的谢意!
  感谢京东云平台——数据研发运营部的负责人樊建刚先生给予我们充分的授权和支持,他鼓励我们将产品开源、组建技术交流群和中文社区,使得JD-Presto成为京东第一个开源的软件产品,开创京东回馈开源社区的先河。
  感谢研发团队的兄弟们,他们酷爱技术、注重团队协作、深入理解客户需求,能从一个较为全面的角度考虑产品的架构设计与功能研发,这是产品成功的基石,也是最关键的因素。
  回首这一路的艰辛,无以表达此时的心情,只能说,兄弟们所做的一切都让我心怀崇敬!
  戴东东
  2016


其他推荐