SPARK是一个分布式的基于内存的大数据执行引擎,最早由加州伯克利大学AMPLab主导开发,后来加入apache社区孵化,进而成为apache顶级大数据项目。目前spark在开源社区和工业界非常火爆,堪称大数据最活跃的开源项目。Spark在大数据领域之所以受到如此青睐,主要源于如下几方面优势:
 
  数据集抽象:提供一个分布式弹式数据集(RDD,ResilientDistributedDataset)抽象,基于RDD的转换操作被翻译为RDD间的有向无环图(DAG),同时RDD的转换算子(transformation)的延迟性使得调度器可以对DAG进行流水线优化,这使得SPARK不再如MR仅仅支持map-reduce两步计算,而是多步的DAG任务。另外RDD提供缓存机制,可将数据集缓存在内存进行重复使用,提升计算性能。
 
  高容错性:RDD抽象记忆了其“血统”信息,即自身RDD与父辈RDD的依赖关系,故SPARK提供了基于依赖关系重计算丢失数据的容错机制,同时也提供checkpoint容错。
 
  多计算范式支持:SPARK对多计算模型的支持,自从SPARK发布以来,SPARK社区逐步开发sparksql,sparkstreaming,sparkmllib、sparkgraghx等多个模型库,从而做到一栈式支持了,sql查询(结构化数据分析)、流计算、机器学习、图计算等多种计算模型。
 
  高易用性:SPARK简洁的API和多语言支持,给上层用户提供了良好的开发体验。
 
  兼容性:SPARK目前越来越壮大的生态系统,以及与hadoop生态系统的完美融合,促使更多的用户拥抱SPARK。
 
  基于SPARK的如上优势,SPARK目前被广泛的应用于机器学习、ETL、商业智能BI、交互式分析等领域。本文主要介绍Spark(SQL)的应用。
 
  从市场分析结果以及专业咨询公司的报告数据中可以了解到,无论是在企业领域还是电信领域,当前的大数据应用,至少一半以上的应用是SQL分析/统计类。SPARK生态栈内的sparksql组件,由于其先天与spark社区高度融合,支持表列式cache,对接多种数据源对接,兼容hive语法/metastore等优势,无疑是sqlonhadoop的优选方案。
 
  SPARKSQL的社区现状
 
  Sparksql是spark社区在1.0版本引入的,关于sparksql和shark,hiveonspark的关系可以参见databricks博客:
 
  https://databricks.com/blog/2014/07/01/shark-spark-sql-hive-on-spark-and-the-future-of-sql-on-spark.html
 
  sparksql架构图
 
  sparksql作为spark社区目前最活跃的组件,已经历经1.0-1.4多个版本的迭代,并在1.3版本从alpha版本毕业,在1.3后sparksql提供稳定的API支持,并保证后续版本的前向兼容性。目前社区sparksql版本功能已经相对比较完善,完成的和正在开展的工作主要有:
 
  ·基于函数式的可扩展的sql优化器catalyst,包括sql解析,分析,优化过程
 
  ·语法方面,支持标准语法并兼容绝大多数hive语法,基本满足业务使用需求,包括cube/rollup,windowfunction,子查询支持,CTE支持,多join类型支持,动态分区支持,同时sparksql也包含一些传统sql支持但hive不支持的语法,比如non-equaljoin、joinonorcondition等。除此之外,sparksql提供插件式的sqlparser支持,用户可以针对自身业务自定义DSL/SQL语法。
 
  ·支持多数据源读和写对接支持,目前内置支持的有JDBC,parquet,json,ORC等
 
  ·复杂数据类型的支持,包括array,map,struct等
 
  ·Hive多版本元数据的对接,无需重编译spark,可做到hive多个版本的元数据切换
 
  ·Codegeneration,提升expressionevaluation效率
 
  ·基于堆外内存的内存管理框架,大大提升sparksql稳定性和性能
 
  ·Sparksql定制化序列化器实现,优化sparksqlshuffle代价,提升sql性能
 
  ·LLVM优化
 
  ·DataFrameAPI,更友好性能更佳的分析型API
 
  总体来看,sparksql已完成功能可用性/易用性相关特性开发,目前主要聚焦于进一步提升sparksql性能和稳定性(https://databricks.com/blog/2015/04/28/project-tungsten-bringing-spark-closer-to-bare-metal.html)。
 
  SPARKSQL的应用场景
 
  SparkSQL由于其语法/优化器的可扩展性,以及优良的分析型API的支持,对多种数据源的标准API支持,适用于[Y(1]如下场景:
 
  ·分析统[Y(2]计类应用,比如在运营商领域,各种维度计算各类KPI指标;
 
  ·分析和挖掘的综合场景,或者是客户当前是查询类分析但有计划在未来进行挖掘类的应用分析,这主要受益于sparksql自身强大的分析能力以及和mllib的同栈整合能力;
 
  ·联邦查询,由于sparksql对多数据源的支持,其足以支持从多个数据源查询数据进行联邦查询分析。
 
  华为在SPARKSQL的增强工作
 
  虽然sparksql具备强大的多数据源整合分析能力,以及性能良好用户友好的API支持,但是sparksql在如下两类应用中还是略显不足:
 
  ·大数据数据仓库应用,这主要受限于sparksql的语法支持度方面,虽然sparksql已基本完成hive语法的兼容性开发,但其在标准语法方面还有较大不足,如子查询(包括相关子查询)的支持度,exist,in的支持,很难做到传统数据库应用到hadoop的平滑过渡;
 
  ·云化大数据查询服务,受限于sparksql的安全、权限方面的不足,目前社区在安全、权限的投入很少,这使得sparksql云化受阻。
 
  除此之外,catalyst优化器在多join等复杂sql下的优化规则较弱,容易导致笛卡尔积生成,造成性能的急剧下降甚至根本无法算出最终结果。
 
  华为大数据团队在社区sparksql上进行了大量插件式的增强,使得增强后的sparksql足以应对企业用户从传统分析数据库向hadoop大数据系统过渡迁移以及基于sparksql提供云化查询分析服务。华为大数据团队在sparksql做的增强有:
 
  ·对hiveql语法以及标准语法特性增强,包括exist/in支持,相关子查询支持,filter中复杂子查询支持,不做任何修改可成功运行TPCDS测试套。如下为华为大数据团队增强版sparksql与hive语法(https://github.com/hortonworks/hive-testbench)[Y(3],标准sql语法(http://www.tpc.org/tpcds/)的兼容性

 
  ·Sql并行度支持,并发运行bug修复,支持多session并发运行sql
 
  ·权限、安全增强,支持角色,可控制用户的创表,查询,更新等的权限,同时提供基于列的权限控制
 
  ·Catalyst优化器增强,在社区的优化器的基础上主要做了如下几方面增强,
 
  1)joinreordering和joinonorcondition优化笛卡尔积,可达到数百倍的性能提升;
 
  2)常数折叠
 
  3)operatorreordering减少节点输入数据和传输代价;
 
  4)表达式优化提升表达式求解效率,特别是一些机器生成的sql,用该优化器规则可以显著提升性能。
 
  5)pre-partial-aggregation,该优化算法可用于优化聚合函数,同时也可以减少joininputsize。
 
  6)removeunnecessaryexchange去除没必要的shuffle过程;
 
  7)[dataskippingonfineblocklevelfilterfeature]基于workload的predict优化;
 
  8)SQL语句共享,这对于复杂的sql比较有用,避免重复分析优化的时间代价.
 
  9)动态分区性能优化,当前社区动态分区代码路径非常耗费内存,并且性能不佳,主要原因是每个task需要对每个分区启动文件流写数据导致系统负载过大。通过数据预先重排可大大减少动态分区的GC压力,提升动态分区性能。
 
  简而言之,华为的catalyst优化器增强基于客户真实应用场景,同时针对不同用户的workload进行数据组织层面的优化建模,从源头就减少数据读取量;
 
  ·Datasource支持度方面,增加了orc、hbase,cube等数据源支持
 
  总结
 
  综上,sparksql的可扩展性使得用户可以方便的嵌入自己的语法解析器或者添加语法特性,同时允许在业务的理解中不停的添加新的优化规则和数据源。正由于sparksql在架构上的优势,sparksql在社区热度不减,拥有数量庞大的贡献者,值得一提的是华为大数据spark团队在社区有10+贡献者,累计贡献patch200+,同时我们的发行版本也通过了Databricks官方认证。我们相信随着后续版本的发布,sparksql在性能和稳定性上都会取得极大的提升,同时华为大数据spark团队后续逐步将内部优化特性和语法特性贡献反馈回社区。