避免在Spark 2.x版本中使用sparkSQL,关于CTAS bug的发现过程

原创 2017年07月17日 17:03:38

避免在Spark 2.x版本中使用sparkSQL,关于CTAS bug的发现过程

标签(空格分隔): Spark2.x sparkSQL CTAS


1. 背景

CTAS就是create table as select的简称。

最近在使用SparkSQL来进行快速的自定义SQL分析,因为需要把分析的结果保存下来,所以一定要使用CTAS功能,然而在使用的时候发现了一个bug,当然这个bug已经被报告了,状态依然是unresolved。

如果有下面几个标题的,一般和该问题关系密切

  • Thrift Server - CTAS fail with Unable to move source
  • Replace hive.default.fileformat by spark.sql.default.fileformat
  • Spark sql 2.1.1 thrift server - unable to move source hdfs to target
  • SparkSQL cli throws exception when using with Hive 0.12 metastore in spark-1.5.0 version

2. 问题发现过程

2.1 问题发现

最开始的我们使用beeline登录

beeline -u jdbc:hive2://xxx.xxx.xxx.xxx:10000 -n user_name

然后使用一个库

use test;

查看一下表

show tables;
+-----------+-------------------------+--------------+--+
| database  |        tableName        | isTemporary  |
+-----------+-------------------------+--------------+--+
| test      | test                    | false        |
| test      | test2                   | false        |
+-----------+-------------------------+--------------+--+

然后我们drop掉该表

drop table test;

然后再创建

create table test as select * from test2;

创建成功,反复几次,也没有问题,一开始我以为好了,我们可以放心使用了,好开心!!

但是不放心,多做几轮测试。于是,我重新使用了我的JAVA的代码执行了这个语句,报错了,这个让我很疑惑,明明什么都一样。

错误如下:

Error: org.apache.spark.sql.AnalysisException:
org.apache.hadoop.hive.ql.metadata.HiveException: Unable to move
source hdfs://ns1/tmp/hive/spark-test_hive_2017-07-12_15-38-
47_540_4854595148769740436-6/-ext-10000/part-00000 to destination
hdfs://ns1/user/test/hive/test/part-00000; (state=,code=0)

2.2 问题重现

刚开始打算看看是不是那个地方配置问题,心想再用beeline试试,于是重新使用beeline进行JDBC连接。
上来没有drop表,直接使用CTAS试试,发现直接报上面的错误。

然后使用sparkSQL试试,发现报OOM错误,以为是SparkSQL启动不合理,重新调整了一个配置,再启动,然后再用beeline连接,drop后建表,好了,试验了三次,以为该问题解决,再次非常开心!!!

但是问题重大,仍不放心,因为感觉不是OOM问题,因为毕竟查了一些资料,都是指向文件系统关闭的问题。

这次重启直接让我们发现了这个bug。

于是再次使用jdbc连接,这次果然报错了!原来JDBC只有第一次连接,可以反复drop反复创建,第二次再连接就报错。这个过程我们重现了若干次,已经非常确信。

于是继续在网上搜索资料。

3. 尝试解决问题

3.1 网上建议1

第一个参考是这个:
https://stackoverflow.com/questions/44233523/spark-sql-2-1-1-thrift-server-unable-to-move-source-hdfs-to-target

这个回答如下:

 Try setting hive.exec.staging-dir in your hive-site.xml like this:
 <property>
   <name>hive.exec.stagingdir</name>
   <value>/tmp/hive/spark-${user.name}</value>
</property>

 This worked for a customer who upgraded from 1.6.2 to 2.1.1 and who had that same problem
with CTAS. On our dev cluster, doing this got us past your particular error, but we still have some HDFS permission issues we are working through.

然而,试验过发现这个配置没有任何用途 ,SparkSQL根本不读这个配置。这个答案的来源最早应该是源于
下面的SparkSQL cli throws exception when using with Hive 0.12 metastore in spark-1.5.0 version。

其实如果细心一点,会发现这个问题中包含了几个回答,和后面的建议直接相关,

  • 第一个回答后的回复和建议2是一样的。
  • 第二个回答则和我们的结论直接一致,最开始看的时候其实并没有明白,因为问题还不太清晰。

3.2 网上建议2

然后继续搜索,发现标题如下的JIRA列表

Thrift Server - CTAS fail with Unable to move source

地址如下:
https://issues.apache.org/jira/browse/SPARK-21067

描述如下:

Description

After upgrading our Thrift cluster to 2.1.1, we ran into an issue where CTAS would fail, sometimes…

Most of the time, the CTAS would work only once, after starting the thrift server. After that, dropping the table and re-issuing the same CTAS would fail with the following message (Sometime, it fails right away, sometime it work for a long period of time):

这个就和我的问题是一模一样了,Spark版本一样,问题症状一样,报的错误也一样。
刚开始的回答和上面的一样,其实是没用的,后面有一句话:

We are either looking for a fix or for a property to set hive.default.fileformat in Spark 2 to have it use parquet instead of textfile, since the issue is not present when the fileformat is set to “parquet”.

他们说Parquet格式没问题,于是我把文件类型设置为Parquet,但是仍然没有用,设置的命令如下:

set spark.sql.default.fileformat=Parquet;

由于该问题仍然属于Open状态,可以肯定的是这个bug仍然没有修复。

3.3 组合方案

更改文件类型为Parquet、包括更改staging目录,两者的组合也试验过(在hive-site.xml里面也配置了)

set hive.exec.stagingdir=/tmp/hive/spark-test;

结果都是一样。

这个Parquet设置,在https://issues.apache.org/jira/browse/SPARK-16825里面也提到过,标题是:
Replace hive.default.fileformat by spark.sql.default.fileformat
这个里面提出了在hive-site.xml里面配置staging目录是无效的,因为根本不会去读。

在下面这个地方,对这个问题也有讨论
https://github.com/apache/spark/pull/14430

4 解决方案

在一个客户端上将Spark版本回退到Spark1.5.x,问题解决,另外一个客户端使用Spark2.1.1,继续使用机器学习的Spark MLlib。

5 最后结论

Spark2.1.1以及后续的版本在CTAS问题上存在严重bug,暂未修复,无法使用,此处为坑,慎重。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

从B树、B+树、B*树谈到R 树

http://blog.csdn.net/v_JULY_v/article/details/6530142/ 目录(?)[+] 从B 树、B+ 树、B* 树谈到R 树   作者...

Spark笔记三之RDD,算子

spark中RDD,算子简介
  • ty4315
  • ty4315
  • 2017年04月23日 22:55
  • 249

Cocos2d-x 2.2.2版本CCEditbox 遇到的bug

Cocos2d-x 2.2.2 CCEditbox 遇到的bug 汇总了自己遇到的问题和解决办法,如果有不对的地方,还请大家指正 1.CCEditbox 虚拟键盘弹出的问题 ...

ASE15.x之前版本中查看设备剩余空间以及设备上数据库分配信息的存储过程sp_helpdevice2

来源于:http://www.dbainfo.net/get-free-space-of-device-and-database-allocation-prior-to-ase12-5.htm ...

cocos2d-x 3.4版本游戏打包AKP (重点记录如何解决打包过程中遇到的各种问题)

主要记录下打包遇到的各种问题,主要讲解打包中遇到的问题如何解决.如果大家有何我同样的问题,希望能够帮到你. 过程 一 : 1. 配置环境变量 2.下载 ADT包含(eclipse和SDK)   ...

使用Spark core和SparkSQL的窗口函数分别实现分组取topN的操作

在spark 1.4及以上版本中,针对sparkSQL,添加了很多新的函数,进一步扩展了SparkSQL对数据的处理能力。 本篇介绍一个强大的窗口函数 row_number()函数,常用于对数据进行...

Spark-Avro学习1之使用SparkSQL读取AVRO文件

更多Spark学习examples代码请见:https://github.com/xubo245/SparkLearning 1.安装: https://repo.maven.apac...

在自定义数据源中使用sparksql(Spark2.0+)带示例

主要原理spark sql 核心: ParseInterface: 专门负责解析外部数据源SQL的SqlParser。目前自带的parser已经能满足各种需求 RunnableC...

Zeppelin 0.6.2 使用spark2.x 的一些错误处理

zeppelin 从 0.6.1 开始支持 spark2.x ,从0.6.2编译时引入了hadoop-common包用于权限认证,所以会存在一些包冲突导致异常的问题。 编译错误zeppelin-web...
  • lsshlsw
  • lsshlsw
  • 2016年12月20日 20:28
  • 1479
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:避免在Spark 2.x版本中使用sparkSQL,关于CTAS bug的发现过程
举报原因:
原因补充:

(最多只允许输入30个字)