最近准备升级将生产环境chd5.7.1升级到cdh5.12.0并同时升级spark1.6到spark2.2.
在cdh5.12.0中可以部署两个spark parcels.输入spark2-shell可以运行spark2.2的程序,输入spark-shell可以运行spark1.6的程序.非常方便测试升级中可能存在的问题.
读完Spark 1.6升级2.x防踩坑指南发现有挺多问题.同时手动测试了cdh版本spark2.2和spark1.6似乎与博文差别较大.可能是cdh已经对某些问题做了升级.大致记录如下.
1.SELECT '0.1' = 0
spark2.2 true
spark1.6 false
hive false
2.查询不存在日期:SELECT year('2015-03-40')
spark 2.2 null
spark1.6 null
hive 2015
3.SELECT 1 FROM tb GROUP BY 1
spark2.2 1
spark1.6 1
hive 1
3.select SIZE(null)
spark 2.2 -1
spark1.6 null
hive -1
4.ROW_NUMBER()必须要在OVER内添加ORDER BY
测试sql: select ROW_NUMBER() OVER(partition by dw_audit_cre_date) from test.p_ip_1
spark 2.2 报错.Window function row_number() requires window to be ordered, please add ORDER BY clause.
spark1.6 正常
hive 正常
5.博文中提到.spark2.0创建出来的分区表spark1.6再次更新数据导致数据丢失.这个问题并没有重现Spark 2.0开始,SQL创建的分区表兼容Hive了,Spark会将分区信息保存到HiveMetastore中,也就是我们可以通过SHOW PARTITIONS查询分区,Hive也能正常查询这些分区表了。如果将Spark切换到低版本,在更新分区表,HiveMetastore中的分区信息并不会更新,需要执行MSCK REPAIR TABLE进行修复,否则再次升级会出现缺数据的现象。
6.复杂的子查询view不能使用的问题,也没有重现Spark 2.0 ~ 2.1创建的VIEW并不会把创建VIEW的原始SQL更新到HiveMetastore,而是解析后的SQL,如果这个SQL包含复杂的子查询,那么切换到1.6后,就有可能无法使用这个VIEW表了
7.spark2.2支持in操作的子查询.spark1.6和hive都不支持.
测试sql:
create or replace view test.v_ip_2 as select * from main.p_ip
where create_d in (
select create_d from main.p_ip where create_d > '2014-07-16 14:42:17'
)
spark 2.2 正常
spark1.6 报错
hive 报错
8.thrift server稳定性.目前还没有办法测试2.x中对于ThriftServer或JobServer这样的长时间运行的服务,稳定性不如1.6,如果您的计算业务复杂、SQL计算任务繁多、频繁的更新数据、处理数据量较大,稳定性的问题更加凸显。稳定性问题主要集中在内存方面,Executor经常出现堆外内存严重超出、OOM导致进程异常退出等问题。Executor进程OOM异常退出后相关的block-mgr目录(也就是SPARK_LOCAL_DIRS)并不会被清理,这就导致Spark Application长时间运行很容易出现磁盘被写满的情况。
9.add columns spark和hive全部都支持
测试sql:alter table test.liz_1 add columns(c5 varchar(20))
总结: cloudera 对spark做了一些可用性的改进.如果spark thrift 2.2稳定性不够,将会导致升级spark2.2滞后