Spark读取Hive报错:java.lang.outofmemoryerror: java heap space

- 日理万妓 2021-09-23 08:00 658阅读 0赞

Spark本地测试Hive数据时,报错:

java.lang.outofmemoryerror: java heap space

因为是本地测试,内存足够,所以IDEA中增大内存。Run/Bebug Configurations 中 VM options 设置 -Xmx2048m,问题同样。

基本排除了是内存不足的问题,可能存在问题的地方。

1. AppName

检查 Spark 配置,因为偷懒配置是直接拷贝其他类的,发现 appName 设置错误,改成当前类。

读简单的表没有问题了,但是读复杂的表问题同样。

  1. SparkSession.builder().appName(s"${this.getClass.getSimpleName}")

2. Master

继续检查。因为本地测试,master 为 local 模式,直接调用了常量类设置的好的 Constants.SPARK_LOCAL_MODE。

查看设置成了 local[4],删除,使用全部核心进程处理。再运行,问题解决。

  1. val SPARK_LOCAL_MODE = "local"

可以看出,有时候报内存堆栈问题并非都是内存不足。

  1. object SdkUserBehaviorDaily {
  2. private val warehouseLocation: String = new File("spark-warehouse").getAbsolutePath
  3. def main(args: Array[String]): Unit = {
  4. Logger.getLogger("org.apache.hadoop").setLevel(Level.WARN)
  5. Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
  6. Logger.getLogger("org.spark_project.jetty").setLevel(Level.WARN)
  7. // 数据分析日期,格式为2019-09-19,默认为当日
  8. var time = DateUtils.getYesterdayDate
  9. if (args.length == 1) {
  10. time = args(0)
  11. }
  12. val spark = initSparkSession
  13. val db = "sm_data"
  14. val table = "ods_tb_sdk_user_behavior_log"
  15. val sqlStr =
  16. s"""
  17. | select
  18. | `PACKAGE_ID`,`GAME_ID`,`SDK_VERSION`,`PAGE`,`EVENT_ID`,`RESULT`,`REASON`,
  19. | COUNT(`TIME`) AS `TIME_COUNT`,
  20. | COUNT(DISTINCT `DEVICE_CODE`) AS `DEVICE_COUNT`,
  21. | COUNT(DISTINCT `CORE_ACCOUNT`) AS `ACCOUNT_COUNT`
  22. | from $db.$table
  23. | WHERE `DATE`= $time
  24. | GROUP BY `PACKAGE_ID`,`GAME_ID`,`SDK_VERSION`,`PAGE`,`EVENT_ID`,`RESULT`,`REASON`
  25. """.stripMargin
  26. import spark.sql
  27. sql(sqlStr).show()
  28. spark.stop()
  29. }
  30. def initSparkSession:SparkSession = SparkSession.builder()
  31. .appName(s"${this.getClass.getSimpleName}")
  32. .master(Constants.SPARK_LOCAL_MODE)
  33. .config("spark.sql.warehouse.dir", warehouseLocation)
  34. .config("hive.exec.dynamic.partition", "true")
  35. .config("hive.exec.dynamic.partition.mode", "nonstrict")
  36. .config("hive.exec.max.dynamic.partitions", 2000)
  37. .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
  38. .config("spark.kryoserializer.buffer", "1024m")
  39. .config("spark.kryoserializer.buffer.max", "2046m")
  40. .config("spark.io.compression.codec","snappy")
  41. .config("spark.sql.codegen", "true")
  42. .config("spark.sql.unsafe.enabled", "true")
  43. .config("spark.shuffle.manager", "tungsten-sort")
  44. .enableHiveSupport()
  45. .getOrCreate()
  46. }

发表评论

表情:
评论列表 (有 0 条评论,658人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java heap space

    摘要: > 因为项目涉及到的数据较,对象较多,所以在执行时遇到了这个错误 > > 通过搜索,应该不能找到这种错误出现的原因,伴随这个错误的一般还有如下错误: > >