在towards data science看到这篇帖子,简单对比了spark和drill的SQL引擎。
从我个人经验看,只看SQL引擎,spark当然不如drill。因为后者实现了完整的ANSI SQL 2003标准,而spark受Hive SQL影响,只实现了一个子集。
在使用方式上,drill的交互式shell可以直接像Mysql一样,运行查询语句。spark并不能这样,它的交互式shell里要编写简单的程序,才能运行SQL查询。
比如,查询同样的外部csv数据源,如下是drill的方式:
apache drill (dfs.pyh)> select * from `people.csv` order by born desc, name limit 5;
+---------------+----------+--------+---------+-------------------------+
| name | born | sex | tel | job |
+---------------+----------+--------+---------+-------------------------+
| Ashley T.T. | 1999-9-9 | Female | 6862502 | Management Analyst |
| Charlie M.F. | 1999-9-8 | Female | 3333064 | Teacher Assistant |
| Daniel F.Y. | 1999-9-8 | Male | 5160463 | Real Estate Agent |
| Daniella G.R. | 1999-9-8 | Female | 5477888 | Radiologic Technologist |
| Ford H.U. | 1999-9-8 | Male | 5888765 | Bus Driver |
+---------------+----------+--------+---------+-------------------------+
5 rows selected (0.584 seconds)
如下是spark的方式:
scala> val df = spark.read.format("csv").option("inferSchema", "true").option("header", "true").load("tmp/people.csv")
scala> df.createOrReplaceTempView("peopleView")
scala> spark.sql("select * from peopleView order by born desc, name limit 5").show(false)
+-------------+--------+------+-------+-----------------------+
|name |born |sex |tel |job |
+-------------+--------+------+-------+-----------------------+
|Ashley T.T. |1999-9-9|Female|6862502|Management Analyst |
|Charlie M.F. |1999-9-8|Female|3333064|Teacher Assistant |
|Daniel F.Y. |1999-9-8|Male |5160463|Real Estate Agent |
|Daniella G.R.|1999-9-8|Female|5477888|Radiologic Technologist|
|Ford H.U. |1999-9-8|Male |5888765|Bus Driver |
+-------------+--------+------+-------+-----------------------+
从上述对比可以看出,dirll的SQL查询要直接的多,上手即用。spark要写几句代码,将外部文件加载到dataframe目标,再把dataframe另存为一个临时表,最后才去查询这个临时表。
性能上,两者差不多,都挺快的,远快于Hive,这个性能差异之前我写过一篇博客。
在架构上,如果采用分布式部署,spark和drill的架构和工作原理都高度类似,我上一篇博客也略有阐述。它们都同时支持数据分区和shuffle。也就是说,把数据分拆到不同的节点上进行分布式计算,并且根据需要来进行shuffle操作。
spark还有一点不如drill的地方,在于它支持的外部数据源没有drill那么多。drill支持的外置数据源相当丰富,比如NoSQL databases, Parquet files, S3 files等等。这些数据直接拉进来,用SQL就可以解析,十分的方便。而spark支持的数据源要少一些。
不过,虽然SQL引擎略微逊色,但spark还有其他几个牛叉的功能。比如RDD计算,这个功能虽然古老,但对处理非结构化数据,以及做数据transform,它是非常方便的。再比如streaming和MLlib,这俩都是spark的核心功能,但drill没有的。
综上,如果单纯选择SQL引擎,那我建议drill。但如果你还需要其他大数据处理功能,那spark当仁不让。