Spark本地测试Hive数据时,报错:
java.lang.outofmemoryerror: java heap space
因为是本地测试,内存足够,所以IDEA中增大内存。Run/Bebug Configurations 中 VM options 设置 -Xmx2048m,问题同样。
基本排除了是内存不足的问题,可能存在问题的地方。
1. AppName
检查 Spark 配置,因为偷懒配置是直接拷贝其他类的,发现 appName 设置错误,改成当前类。
读简单的表没有问题了,但是读复杂的表问题同样。
SparkSession.builder().appName(s"${this.getClass.getSimpleName}")
2. Master
继续检查。因为本地测试,master 为 local 模式,直接调用了常量类设置的好的 Constants.SPARK_LOCAL_MODE。
查看设置成了 local[4],删除,使用全部核心进程处理。再运行,问题解决。
val SPARK_LOCAL_MODE = "local"
可以看出,有时候报内存堆栈问题并非都是内存不足。
object SdkUserBehaviorDaily {
private val warehouseLocation: String = new File("spark-warehouse").getAbsolutePath
def main(args: Array[String]): Unit = {
Logger.getLogger("org.apache.hadoop").setLevel(Level.WARN)
Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
Logger.getLogger("org.spark_project.jetty").setLevel(Level.WARN)
// 数据分析日期,格式为2019-09-19,默认为当日
var time = DateUtils.getYesterdayDate
if (args.length == 1) {
time = args(0)
}
val spark = initSparkSession
val db = "sm_data"
val table = "ods_tb_sdk_user_behavior_log"
val sqlStr =
s"""
| select
| `PACKAGE_ID`,`GAME_ID`,`SDK_VERSION`,`PAGE`,`EVENT_ID`,`RESULT`,`REASON`,
| COUNT(`TIME`) AS `TIME_COUNT`,
| COUNT(DISTINCT `DEVICE_CODE`) AS `DEVICE_COUNT`,
| COUNT(DISTINCT `CORE_ACCOUNT`) AS `ACCOUNT_COUNT`
| from $db.$table
| WHERE `DATE`= $time
| GROUP BY `PACKAGE_ID`,`GAME_ID`,`SDK_VERSION`,`PAGE`,`EVENT_ID`,`RESULT`,`REASON`
""".stripMargin
import spark.sql
sql(sqlStr).show()
spark.stop()
}
def initSparkSession:SparkSession = SparkSession.builder()
.appName(s"${this.getClass.getSimpleName}")
.master(Constants.SPARK_LOCAL_MODE)
.config("spark.sql.warehouse.dir", warehouseLocation)
.config("hive.exec.dynamic.partition", "true")
.config("hive.exec.dynamic.partition.mode", "nonstrict")
.config("hive.exec.max.dynamic.partitions", 2000)
.config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
.config("spark.kryoserializer.buffer", "1024m")
.config("spark.kryoserializer.buffer.max", "2046m")
.config("spark.io.compression.codec","snappy")
.config("spark.sql.codegen", "true")
.config("spark.sql.unsafe.enabled", "true")
.config("spark.shuffle.manager", "tungsten-sort")
.enableHiveSupport()
.getOrCreate()
}