Spark 2.x自2.0.0发布到目前的2.2.0已经有一年多的时间了,2.x宣称有诸多的性能改进,相信不少使用Spark的同学还停留在1.6.x或者更低的版本上,没有升级到2.x或许是由于1.6相对而言很稳定,或许是升级后处处踩坑被迫放弃。
“专业、务实、高效、创新、把客户的事当成自己的事”是我们每一个人一直以来坚持追求的企业文化。 创新互联是您可以信赖的网站建设服务商、专业的互联网服务提供商! 专注于网站制作、成都网站制作、软件开发、设计服务业务。我们始终坚持以客户需求为导向,结合用户体验与视觉传达,提供有针对性的项目解决方案,提供专业性的建议,创新互联建站将不断地超越自我,追逐市场,引领市场!
Spark SQL是Spark中最重要的模块之一,基本上Spark每个版本发布SQL模块都有不少的改动,而且官网还会附带一个Migration Guide帮忙大家升级。问题在于Migration Guide并没有详尽的列出所有变动,本文以SQL模块为主,扒一扒Spark升级2.x过程中可能会踩到的坑。
[[207387]]
计算准确性
那些升级后,让你感到心中有千万只草泥马奔腾而过的问题
行为变化
那些不算太致命,改改代码或配置就可以兼容的问题。
2.x中默认不支持笛卡尔积操作,需要通过参数spark.sql.crossJoin.enabled开启
OLAP分析中常用的GROUPING__ID函数在2.x变成了GROUPING_ID()
如果你有一个基于Hive的UDF名为abc,有3个参数,然后又基于Spark的UDF实现了一个2个参数的abc,在2.x中,2个参数的abc会覆盖掉Hive中3个参数的abc函数,1.6则不会有这个问题
执行类似SELECT 1 FROM tb GROUP BY 1的语句会报错,需要单独设置spark.sql.groupByOrdinal false类似的参数还有spark.sql.orderByOrdinal false
CREATE DATABASE默认路径发生了变化,不在从hive-site.xml读取hive.metastore.warehouse.dir,需要通过Spark的spark.sql.warehouse.dir配置指定数据库的默认存储路径。
CAST一个不存在的日期返回null,如:year('2015-03-40'),在1.6中返回2015
Parquet文件的默认压缩算法由gzip变成了snappy,据官方说法是snappy有更好的查询性能,大家需要自己验证性能的变化
DESC FORMATTED tb返回的内容有所变化,1.6的格式和Hive比较贴近,2.x中分两列显示
异常信息的变化,未定义的函数,Spark 2.x: org.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..
Spark Standalone的WebUI中已经没有这个API了:/api/v1/applications:https://issues.apache.org/jira/browse/SPARK-12299,https://issues.apache.org/jira/browse/SPARK-18683
版本回退
那些升级到2.x后,发现有问题回退后,让你欲哭无泪的问题。
Spark 2.0开始,SQL创建的分区表兼容Hive了,Spark会将分区信息保存到HiveMetastore中,也就是我们可以通过SHOW PARTITIONS查询分区,Hive也能正常查询这些分区表了。如果将Spark切换到低版本,在更新分区表,HiveMetastore中的分区信息并不会更新,需要执行MSCK REPAIR TABLE进行修复,否则再次升级会出现缺数据的现象。
Spark 2.0 ~ 2.1创建的VIEW并不会把创建VIEW的原始SQL更新到HiveMetastore,而是解析后的SQL,如果这个SQL包含复杂的子查询,那么切换到1.6后,就有可能无法使用这个VIEW表了(1.6对SQL的支持不如2.x)
其他
从2.2.0开始,Spark不在支持Hadoop 2.5及更早的版本,同时也不支持Java 7 了,所以,如果你用的版本比较老,还是尽快升级的比较好。
2.x中对于ThriftServer或JobServer这样的长时间运行的服务,稳定性不如1.6,如果您的计算业务复杂、SQL计算任务繁多、频繁的更新数据、处理数据量较大,稳定性的问题更加凸显。稳定性问题主要集中在内存方面,Executor经常出现堆外内存严重超出、OOM导致进程异常退出等问题。Executor进程OOM异常退出后相关的block-mgr目录(也就是SPARK_LOCAL_DIRS)并不会被清理,这就导致Spark Application长时间运行很容易出现磁盘被写满的情况。
总结
Spark 2.x中为了性能,SQL模块的改动相当大,这也导致Bug变多,稳定性变差。当然,随着Spark的不断改进迭代,这些问题也在逐步缓解。
对于一个计算服务,相比性能,数据计算的正确性及稳定性更加重要。建议尚未升级到2.x的同学,最好使用最新的Spark版本做升级;升级前,务必结合自己的业务场景做好充分的测试,避免踩坑。
本文名称:Spark1.6升级2.x防踩坑指南
网站链接:http://www.shufengxianlan.com/qtweb/news34/154084.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联