避免在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,暂未修复,无法使用,此处为坑,慎重。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bon_mot/article/details/75256525

hive添加完hive.exec.stagingdir参数,有的SQL报FileNotFoundException错

 事件: 在调整参数hive.exec.stagingdir之后,有的SQL报错,有的SQL可以正常运行。      截屏如下: | 处理方法:              hi...
  • houzhizhen
  • houzhizhen
  • 2016年09月02日 10:59
  • 919

hive任务中MoveTask的策略

Hive版本:1.2.1         hive将sql转换为mapreduce任务,最后结束的时候可能涉及到将临时文件存到目标目录中。         hive1.2.1版本临时文件有可能是存...
  • zhoudetiankong
  • zhoudetiankong
  • 2016年07月01日 14:39
  • 1787

太多的.hive-stagingxxx文件的处理

跑一段时间的HIVE程序之后,偶尔打开对应的HDFS文件夹,才发现在其目录下,产生了太多的.hive-staging_hive_date-time_ XXX文件。 仔细一看,才发现几乎每个H...
  • sparkexpert
  • sparkexpert
  • 2016年07月15日 16:34
  • 2666

[备忘]CDH5.3 Hive FAILED: RuntimeException Cannot create staging directory 报错原因

最近在从CDH5.2升级到CDH5.3后,发现启动Hive执行查询语句时报以下错误: hive> select count(1) from ht_payment; FAILED: RuntimeExc...
  • cnweike
  • cnweike
  • 2015年02月05日 11:43
  • 3700

Hive 优化参数

HIVE优化参数 hive> set; _hive.hdfs.session.path=/tmp/hive/root/bd4f450f-2f3f-460d-8539-5ee573701e5...
  • xfg0218
  • xfg0218
  • 2017年03月13日 21:49
  • 4272

CentOS7伪分布式下 hive安装过程中遇到的问题及解决办法

hive 安装容易出现的错误及其解决办法
  • BIT_SKY
  • BIT_SKY
  • 2015年10月24日 16:04
  • 3586

hive MV速度慢的问题

 事件: 执行一个HIVE查询,在执行到 hive 的 moving data 过程就卡住了,早上来的时候看执行还在那个位置。      截屏如下: 运行程序服务器: hadoop@s...
  • houzhizhen
  • houzhizhen
  • 2016年09月02日 10:26
  • 798

Spark性能调优2-总结分享

1、Spark调优背景 目前Zeppelin已经上线一段时间,Spark作为底层SQL执行引擎,需要进行整体性能调优,来提高SQL查询效率。本文主要给出调优的结论,因为涉及参数很多,故没有很细粒度调...
  • xwc35047
  • xwc35047
  • 2017年05月01日 09:43
  • 2238

org.apache.spark.sql.AnalysisException: Table or view not found: `traintext`.`train`; line 1 pos 14;

恭喜老铁,跟我遇到了一样的问题,接下来是解决方法: 遇到的问题: org.apache.spark.sql.AnalysisException: Table or view not found...
  • pan_haufei
  • pan_haufei
  • 2017年09月20日 16:29
  • 997

spark 2.X 疑难问题汇总

当前spark任务都是运行在yarn上,所以不用启动长进程worker,也没有master的HA问题,所以主要的问题在任务执行层面。 作业故障分类 故障主要分为版本,内存和权限三方面。 - ...
  • xwc35047
  • xwc35047
  • 2016年12月29日 23:39
  • 4400
收藏助手
不良信息举报
您举报文章:避免在Spark 2.x版本中使用sparkSQL,关于CTAS bug的发现过程
举报原因:
原因补充:

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