用yarn cluster方式提交spark任务时,有时会报错,报错几率是40%,报错如下:

18/03/15 21:50:36 116 ERROR ApplicationMaster91: User class threw exception: org.apache.spark.sql.AnalysisException: java.lang.NoSuchFieldError: HIVE_MOVE_FILES_THREAD_COUNT;

org.apache.spark.sql.AnalysisException: java.lang.NoSuchFieldError: HIVE_MOVE_FILES_THREAD_COUNT;

at org.apache.spark.sql.hive.HiveExternalCatalog.withClient(HiveExternalCatalog.scala:106)

at org.apache.spark.sql.hive.HiveExternalCatalog.loadTable(HiveExternalCatalog.scala:766)

at org.apache.spark.sql.hive.execution.InsertIntoHiveTable.sideEffectResult$lzycompute(InsertIntoHiveTable.scala:374)

at org.apache.spark.sql.hive.execution.InsertIntoHiveTable.sideEffectResult(InsertIntoHiveTable.scala:221)

at org.apache.spark.sql.hive.execution.InsertIntoHiveTable.doExecute(InsertIntoHiveTable.scala:407)

at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:114)

at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:114)

at org.apache.spark.sql.execution.SparkPlan$$anonfun$executeQuery$1.apply(SparkPlan.scala:135)

at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)

at org.apache.spark.sql.execution.SparkPlan.executeQuery(SparkPlan.scala:132)

at org.apache.spark.sql.execution.SparkPlan.execute(SparkPlan.scala:113)

at org.apache.spark.sql.execution.QueryExecution.toRdd$lzycompute(QueryExecution.scala:92)

at org.apache.spark.sql.execution.QueryExecution.toRdd(QueryExecution.scala:92)

at org.apache.spark.sql.Dataset.(Dataset.scala:185)

at org.apache.spark.sql.Dataset$.ofRows(Dataset.scala:64)

at org.apache.spark.sql.SparkSession.sql(SparkSession.scala:592)

at scala.util.control.Breaks.breakable(Breaks.scala:38)

at app.package.APPClass$.main(APPClass.scala:177)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:497)

at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$2.run(ApplicationMaster.scala:637)

Caused by: java.lang.NoSuchFieldError: HIVE_MOVE_FILES_THREAD_COUNT

at org.apache.hadoop.hive.ql.metadata.Hive.trashFilesUnderDir(Hive.java:1389)

at org.apache.hadoop.hive.ql.metadata.Hive.replaceFiles(Hive.java:2873)

at org.apache.hadoop.hive.ql.metadata.Hive.loadTable(Hive.java:1621)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:497)

at org.apache.spark.sql.hive.client.Shim_v0_14.loadTable(HiveShim.scala:728)

at org.apache.spark.sql.hive.client.HiveClientImpl$$anonfun$loadTable$1.apply$mcV$sp(HiveClientImpl.scala:676)

at org.apache.spark.sql.hive.client.HiveClientImpl$$anonfun$loadTable$1.apply(HiveClientImpl.scala:676)

at org.apache.spark.sql.hive.client.HiveClientImpl$$anonfun$loadTable$1.apply(HiveClientImpl.scala:676)

at org.apache.spark.sql.hive.client.HiveClientImpl$$anonfun$withHiveState$1.apply(HiveClientImpl.scala:279)

at org.apache.spark.sql.hive.client.HiveClientImpl.liftedTree1$1(HiveClientImpl.scala:226)

at org.apache.spark.sql.hive.client.HiveClientImpl.retryLocked(HiveClientImpl.scala:225)

at org.apache.spark.sql.hive.client.HiveClientImpl.withHiveState(HiveClientImpl.scala:268)

at org.apache.spark.sql.hive.client.HiveClientImpl.loadTable(HiveClientImpl.scala:675)

at org.apache.spark.sql.hive.HiveExternalCatalog$$anonfun$loadTable$1.apply$mcV$sp(HiveExternalCatalog.scala:768)

at org.apache.spark.sql.hive.HiveExternalCatalog$$anonfun$loadTable$1.apply(HiveExternalCatalog.scala:766)

at org.apache.spark.sql.hive.HiveExternalCatalog$$anonfun$loadTable$1.apply(HiveExternalCatalog.scala:766)

at org.apache.spark.sql.hive.HiveExternalCatalog.withClient(HiveExternalCatalog.scala:97)

... 25 more

大概流程是spark sql在执行InsertIntoHiveTable时会调用loadTable,这个操作最终会通过反射调用hive代码的loadTable方法

1 org.apache.spark.sql.hive.execution.InsertIntoHiveTable.doExecute(InsertIntoHiveTable.scala:407)

2 org.apache.spark.sql.hive.HiveExternalCatalog.loadTable(HiveExternalCatalog.scala:766)

3 org.apache.spark.sql.hive.client.Shim_v0_14.loadTable(HiveShim.scala:728)

4 java.lang.reflect.Method.invoke(Method.java:497)

5 org.apache.hadoop.hive.ql.metadata.Hive.loadTable(Hive.java:1621)

6 org.apache.hadoop.hive.ql.metadata.Hive.trashFilesUnderDir(Hive.java:1389)

在第6步中报错 java.lang.NoSuchFieldError: HIVE_MOVE_FILES_THREAD_COUNT

这个问题通常会认为是hive-site.xml缺少配置

hive.mv.files.thread

15

但是查看代码会发现spark2.1.1依赖的是hive1.2.1,在hive1.2.1中是没有hive.mv.files.thread这个配置的,这个配置从hive2才开始出现,而且报错的类org.apache.hadoop.hive.ql.metadata.Hive在hive1.2.1和hive2的相关代码完全不同,

在hive1.2.1的代码是:(trashFilesUnderDir方法是FileUtils类的)

if (FileUtils.isSubDir(oldPath, destf, fs2)) {

FileUtils.trashFilesUnderDir(fs2, oldPath, conf);

}

在hive2的代码是:(trashFilesUnderDir方法是Hive类的)

private boolean trashFilesUnderDir(final FileSystem fs, Path f, final Configuration conf)

throws IOException {

FileStatus[] statuses = fs.listStatus(f, FileUtils.HIDDEN_FILES_PATH_FILTER);

boolean result = true;

final List> futures = new LinkedList<>();

final ExecutorService pool = conf.getInt(ConfVars.HIVE_MOVE_FILES_THREAD_COUNT.varname, 25) > 0 ?

Executors.newFixedThreadPool(conf.getInt(ConfVars.HIVE_MOVE_FILES_THREAD_COUNT.varname, 25),

new ThreadFactoryBuilder().setDaemon(true).setNameFormat("Delete-Thread-%d").build()) : null;

所以第6步的报错,执行的应该是hive2的代码,所以猜测问题可能是:

1)由于jar包污染,启动jvm的时候classpath里同时有hive1和hive2的jar,有时加载类用到hive1的jar(可以正常运行),有时用到hive2的jar(会报错);

2)集群服务器环境配置差异,有的服务器classpath中没有hive2的jar(可以正常运行),有的服务器classpath有hive2的jar(可能报错);

对比正常和报错的服务器的环境配置以及启动命令发现都是一样的,没有发现hive2的jar,

通过在启动任务时增加-verbose:class,发现正常和报错的情况下,Hive类都是从Hive1.2.1的jar加载出来的,

[Loaded org.apache.hadoop.hive.ql.metadata.Hive from file:/export/Data/tmp/hadoop-tmp/nm-local-dir/filecache/98/hive-exec-1.2.1.spark2.jar]

否定了上边的两种猜测;

分析提交任务命令发现,用到了spark.yarn.jars,避免每次都上传spark的jar,这些jar会被作为filecache缓存在yarn.nodemanager.local-dirs下,

反编译正常和报错服务器上filecache里的hive-exec-1.2.1.spark2.jar最终发现问题,

正常服务器上Hive类代码是:

if (FileUtils.isSubDir(oldPath, destf, fs2))

FileUtils.trashFilesUnderDir(fs2, oldPath, conf);

报错服务器上的Hive类代码是:

private static boolean trashFilesUnderDir(final FileSystem fs, Path f, final Configuration conf) throws IOException {

FileStatus[] statuses = fs.listStatus(f, FileUtils.HIDDEN_FILES_PATH_FILTER);

boolean result = true;

List> futures = new LinkedList();

ExecutorService pool = conf.getInt(ConfVars.HIVE_MOVE_FILES_THREAD_COUNT.varname, 25) > 0 ? Executors.newFixedThreadPool(conf.getInt(ConfVars.HIVE_MOVE_FILES_THREAD_COUNT.varname, 25), (new ThreadFactoryBuilder()).setDaemon(true).setNameFormat("Delete-Thread-%d").build()) : null;

报错服务器上的Hive类用到ConfVars.HIVE_MOVE_FILES_THREAD_COUNT,但是在hive-common-1.2.1.jar中的ConfVars不存在这个属性,所以报错java.lang.NoSuchFieldError,

所以问题应该是hdfs上的hive-exec-1.2.1.spark2.jar一开始是对的,然后所有nodemanager下载到本地作为filecache,后来这个jar被改错了(使用hive2编译spark),然后新加的nodemanager会下载有问题的jar作为filecache,这样结果就是有的服务器执行正常,有的服务器执行报错;

yarn中的filecache清理有两个配置

yarn.nodemanager.localizer.cache.cleanup.interval-ms:600000  Interval in between cache cleanups.

yarn.nodemanager.localizer.cache.target-size-mb:10240    Target size of localizer cache in MB, per local directory.

每隔cleanup.interval-ms会检查本地filecache大小是否超过target-size-mb,超过才清理,不超过就一直使用filecache;

java 报错 定位,问题定位分享(2)spark任务一定几率报错java.lang.NoSuchFieldError: HIVE_MOVE_FILES_THREAD_COUNT...相关推荐

  1. 【软件创新实验室2021年寒假集训】Java后端开发漫谈及感悟分享

    系列文章目录 [软件创新实验室2021年寒假集训]汇总篇 20级Java培训 第一天:[软件创新实验室2021年寒假集训]Java技术培训--Java前置知识学习 第二天:Java基础(一) 第三天: ...

  2. Appinum:在使用安卓模拟器定位页面元素时启动uiautomatorviewer.bat ,但是报错: Error while obtaining UI hierarchy XML file: c

    在使用安卓模拟器定位页面元素时启动uiautomatorviewer.bat ,但是报错: Error while obtaining UI hierarchy XML file: com.andro ...

  3. vs2019报错:无法定位程序输入点于动态链接库的XXX.dll文件的解决方法

    项目场景 vs2019报错:无法定位程序输入点于动态链接库XXX.dll文件上 我的上述问题是在VS 2019 中 用c++处理点云时遇到的. 解决方案: 在网上查阅了相关的解决方法,总结如下: 1. ...

  4. 当在Ubuntu系统下使用apt-get命令下载依赖包时,报错“E: 无法定位软件包”

    当在Ubuntu系统下使用apt-get命令来安装所需依赖包时,可能会报错"E: 无法定位软件包问题" 由于centos中的yum和ubuntu中的apt-get命令下载的依赖包名 ...

  5. poi jar包报错:java.lang.NoSuchFieldError:Factory

    1.报错现象: 2.解决方法: 删除poi-ooxml-schemas jar包 <exclusion><artifactId>poi-ooxml-schemas</ar ...

  6. Java服务CPU高如何定位解决

    原生系统命令排查的方法 分别分享下Linux和Windows系统下的排查方法 首先是Linux系统下 如果不借助工具,使用Linux和jdk自带命令的话,步骤是这样的: top命令查出占用最高的进程: ...

  7. 配置gradle时,一直报错提示:ERROR: JAVA_HOME is set to an invalid directory: D:\Java\jdk1.8.0_144;

    配置gradle失败,一直报错提示:ERROR: JAVA_HOME is set to an invalid directory: D:\Java\jdk1.8.0_144; 报错的原因是因为配置的 ...

  8. 【错误记录】Groovy 报错 ( Execution failed for task ‘:compileGroovy‘. > org/apache/tools/ant/taskdefs/Java )

    文章目录 一.报错信息 二.问题分析 三.解决方案 一.报错信息 编译 Groovy 代码时 , 报如下错误 , 该错误不是代码错误 , 而是 Groovy 工程的环境配置错误 ; 相同的环境 , 昨 ...

  9. java生产问题快速定位_生产环境如何快速跟踪、分析、定位问题-Java

    我相信做技术的都会遇到过这样的问题,生产环境服务遇到宕机的情况下如何去分析问题?比如说JVM内存爆掉.CPU持续高位运行.线程被夯住或线程deadlocks,面对这样的问题,如何在生产环境第一时间跟踪 ...

最新文章

  1. 网络工程师中级2018 2019 2004-2017年真题+答案【结构介绍】
  2. nginx 超时时间_我眼中的 Nginx(四):是什么让你的 Nginx 服务退出这么慢?
  3. JS移动客户端--触屏滑动事件 banner图效果
  4. python两个二维数组加法_对二维数组的多个列进行Numpy平均
  5. IP/TCP/UDP/RTP/RTCP 包结构图
  6. document.compatMode的CSS1compat
  7. Android Retrofit框架请求复杂json数据
  8. 互联网大佬为什么爱唱歌?
  9. 关于解决keil4和mdk共存后51不能使用go to definition Of 'XXXXXX'问题
  10. FME入门视频教程:第三节 FME界面及常用设置
  11. Linux 指令篇:档案目录管理--ls
  12. yolov3 原理代码复现2
  13. 【0704】HL普及组模拟赛题解及反思
  14. 怎么用计算机把浓度转换成PH,ph浓度换算(ph怎么换算OH浓度)
  15. get请求获取淘宝吱口令
  16. C++ Learning
  17. 大厂常考机器学习面试题
  18. 话费充值 php,首信易支付,电话费充值接口
  19. 【编程】shell和python实现:如何做到让一个程序每1秒去做一件事情
  20. 什么是非同质化代币(NFT)?

热门文章

  1. node爬取app数据_使用node.js如何爬取网站数据
  2. Elasticsearch:什么是相关性
  3. 王爽汇编语言 实验15
  4. 13k 的 macOS 窗口管理工具
  5. 杭电acm 1001
  6. webug3.0安装
  7. 俺是东北人,俺骄傲!
  8. jdk1.6,1.7,1.8解压版无需安装(64位)
  9. oracle11g导入或导出dump文件
  10. linux 上安装显卡驱动