Apache Spark对比Apache Drill

在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当仁不让。

Print this entry