原创文章,谢绝转载html
Spark 2.x自2.0.0发布到目前的2.2.0已经有一年多的时间了,2.x宣称有诸多的性能改进,相信很多使用Spark的同窗还停留在1.6.x或者更低的版本上,没有升级到2.x或许是因为1.6相对而言很稳定,或许是升级后到处踩坑被迫放弃。git
Spark SQL是Spark中最重要的模块之一,基本上Spark每一个版本发布SQL模块都有很多的改动,并且官网还会附带一个Migration Guide帮忙你们升级。问题在于Migration Guide并无详尽的列出全部变更,本文以SQL模块为主,扒一扒Spark升级2.x过程当中可能会踩到的坑。github
那些升级后,让你感到心中有千万只草泥马奔腾而过的问题算法
SELECT '0.1' = 0
返回的是true!Spark 2.2中,0.1会被转换为int,若是你的数据类型所有是文本类型,作数值计算时,结果极有可能不正确。以前的版本中0.1会被转换为double类型绝大多数场景下这样的处理是正确的。目前为止,社区尚未很好的处理这个问题,针对这个问题,我给社区提交过一个PR,想要本身解决这个问题的同窗,能够手动合并下:https://github.com/apache/spark/pull/18986SELECT 1 > 0.0001
会报错,这个问题已在2.1.2及2.2.0中修复:https://issues.apache.org/jira/browse/SPARK-20211INNER JOIN
涉及到常量计算结果不正确,后续版本已修复:https://issues.apache.org/jira/browse/SPARK-19766GROUPING SET(col)
,若是col列数据为null,会报空指针异常,后续版本已修复:https://issues.apache.org/jira/browse/SPARK-19509那些不算太致命,改改代码或配置就能够兼容的问题。sql
spark.sql.*
相关属性的操做,明明存在的属性,使用SHOW TBLPROPERTIES tb("spark.sql.sources.schema.numParts")
没法获取到,同理也没法执行ALTER TABLE tb SET TBLPROPERTIES ('spark.sql.test' = 'test')
进行修改ALTER TABLE tb SET TBLPROPERTIES ('test' = 'test')
这里假设tb是EXTERNAL类型的表AnalysisException: Cannot drop a table with DROP VIEW
,在2.x如下不会报错,因为咱们指定了IF EXISTS关键字,这里的报错显然不合理,须要作异常处理。Table not found
变成了Table or view not found
,若是你的代码里依赖这个异常信息,就须要注意调整了。spark.sql.crossJoin.enabled
开启GROUPING__ID
函数在2.x变成了GROUPING_ID()
SELECT 1 FROM tb GROUP BY 1
的语句会报错,须要单独设置spark.sql.groupByOrdinal false
相似的参数还有spark.sql.orderByOrdinal false
hive.metastore.warehouse.dir
,须要经过Spark的spark.sql.warehouse.dir
配置指定数据库的默认存储路径。ROW_NUMBER() OVER()
执行会报错SIZE(null)
返回-1,以前的版本返回nullorg.apache.spark.sql.AnalysisException: Undefined function: 'xxx’.
, Spark 1.6: AnalysisException: undefined function xxx
,参数格式错误:Spark 2.x:Invalid number of arguments
, Spark 1.6: No handler for Hive udf class org.apache.hadoop.hive.ql.udf.generic.GenericUDAFXXX because: Exactly one argument is expected..
/api/v1/applications
:https://issues.apache.org/jira/browse/SPARK-12299,https://issues.apache.org/jira/browse/SPARK-18683那些升级到2.x后,发现有问题回退后,让你欲哭无泪的问题。数据库
MSCK REPAIR TABLE
进行修复,不然再次升级会出现缺数据的现象。从2.2.0开始,Spark不在支持Hadoop 2.5及更早的版本,同时也不支持Java 7 了,因此,若是你用的版本比较老,仍是尽快升级的比较好。apache
2.x中对于ThriftServer或JobServer这样的长时间运行的服务,稳定性不如1.6,若是您的计算业务复杂、SQL计算任务繁多、频繁的更新数据、处理数据量较大,稳定性的问题更加凸显。稳定性问题主要集中在内存方面,Executor常常出现堆外内存严重超出、OOM致使进程异常退出等问题。Executor进程OOM异常退出后相关的block-mgr目录(也就是SPARK_LOCAL_DIRS)并不会被清理,这就致使Spark Application长时间运行很容易出现磁盘被写满的状况。api
Spark 2.x中为了性能,SQL模块的改动至关大,这也致使Bug变多,稳定性变差。固然,随着Spark的不断改进迭代,这些问题也在逐步缓解。微信
对于一个计算服务,相比性能,数据计算的正确性及稳定性更加剧要。建议还没有升级到2.x的同窗,最好使用最新的Spark版本作升级;升级前,务必结合本身的业务场景作好充分的测试,避免踩坑。app
本文同步更新到微信公众号,欢迎扫码关注。