Spark SQL java.lang.*Error 异常处理
程序员文章站
2022-07-15 14:46:54
...
前言
之前写了一个hive业务数据ETL后导出的程序,通过通过SparkSQL实现的,当时的需求是每天导出前一天的数据。数据在hive中是有年月日分区的,为了提高效率,所以我在where条件里面每天动态生成了需要的分区条件。一直运行都没什么问题。最近需要一次导出一年的数据,我就在担心这下动态生成的分区条件肯定特别长。哈哈,果然,程序一跑在spark解析SQL的时候就报错了,错误如下:
Exception in thread "main" java.lang.*Error
at org.apache.spark.sql.hive.HiveQl$Token$.unapply(HiveQl.scala:360)
at org.apache.spark.sql.hive.HiveQl$.nodeToExpr(HiveQl.scala:1489)
at org.apache.spark.sql.hive.HiveQl$.nodeToExpr(HiveQl.scala:1599)
at org.apache.spark.sql.hive.HiveQl$.nodeToExpr(HiveQl.scala:1599)
at org.apache.spark.sql.hive.HiveQl$.nodeToExpr(HiveQl.scala:1599)
at org.apache.spark.sql.hive.HiveQl$.nodeToExpr(HiveQl.scala:1599)
at org.apache.spark.sql.hive.HiveQl$.nodeToExpr(HiveQl.scala:1599)
at org.apache.spark.sql.hive.HiveQl$.nodeToExpr(HiveQl.scala:1599)
at org.apache.spark.sql.hive.HiveQl$.nodeToExpr(HiveQl.scala:1599)
at org.apache.spark.sql.hive.HiveQl$.nodeToExpr(HiveQl.scala:1599)
at org.apache.spark.sql.hive.HiveQl$.nodeToExpr(HiveQl.scala:1599)
at org.apache.spark.sql.hive.HiveQl$.nodeToExpr(HiveQl.scala:1599)
at org.apache.spark.sql.hive.HiveQl$.nodeToExpr(HiveQl.scala:1599)
at org.apache.spark.sql.hive.HiveQl$.nodeToExpr(HiveQl.scala:1599)
at org.apache.spark.sql.hive.HiveQl$.nodeToExpr(HiveQl.scala:1599)
at org.apache.spark.sql.hive.HiveQl$.nodeToExpr(HiveQl.scala:1599)
at org.apache.spark.sql.hive.HiveQl$.nodeToExpr(HiveQl.scala:1599)
at org.apache.spark.sql.hive.HiveQl$.nodeToExpr(HiveQl.scala:1599)
at org.apache.spark.sql.hive.HiveQl$.nodeToExpr(HiveQl.scala:1599)
at org.apache.spark.sql.hive.HiveQl$.nodeToExpr(HiveQl.scala:1599)
at org.apache.spark.sql.hive.HiveQl$.nodeToExpr(HiveQl.scala:1599)
*Error异常介绍
Java虚拟机中,内存结构大致分为 堆(heap),Java栈(Java stack), 本地方法栈(Native Method Stack), 方法区(Method Area), 程序计数器(Program Counter Register),如下图所示:
其中java栈和本地方法栈是线程私有的,区别是java栈为执行的java方法服务,而本地方法栈是为本地方法服务。
只有这两个地方会抛出*Error,当栈深度超过Java虚拟机分配给线程的栈大小时就会出现这种错误。
解决方案
知道报错的原因,那么就把线程栈大小调大就可以了。
Java虚拟机有几个参数可以做调整:
-Xms 为JVM启动时分配的内存,比如-Xms512m,表示启动分配512MB内存。
-Xmx 为JVM运行过程中分配的最大内存,比如-Xms2048m,表示JVM进程最多只能够占用2GB内存。
-Xss 为JVM启动的每个线程分配的栈内存大小,JDK1.5以后默认的是1MB。
那么我们用 -Xss 就可以了。先看一下目前默认的栈大小。
[aaa@qq.com ~]# java -XX:+PrintFlagsFinal -version | grep ThreadStackSize
intx CompilerThreadStackSize = 0 {pd product}
intx ThreadStackSize = 1024 {pd product}
intx VMThreadStackSize = 1024 {pd product}
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)
可见目前如果程序不配置,会使用默认配置,为1MB,那么我们手动设置下栈大小。增加至6MB
如果是本地模式运行,用
java -Xss6m -jar xxxx.jar
如果是SparkSubmit 方式运行,加上以下选项
--driver-java-options "-Xss6m"
问题成功解决!
推荐阅读
-
Spark异常:A master URL must be set in your configuration处理记录
-
PL/SQL运行异常处理方法
-
Spark SQL java.lang.*Error 异常处理
-
org.apache.spark.sql.AnalysisException: Try to map struct<>to Tuple1 异常
-
SQL Server 2005 中使用 Try Catch 处理异常
-
Spark异常:A master URL must be set in your configuration处理记录
-
SQL Server异常代码处理的深入讲解
-
spark streaming连接kafka引发"partition.assignment.strategy"异常处理
-
PL/SQL基础-异常处理
-
PL/SQL中错误的异常处理