我正在尝试加入2个机器(5台计算机)的2个大数据集(2GB JSON文件/10.000.000元组),但我总是会遇到相同的错误
java.lang.OutOfMemoryError: GC overhead limit exceeded
火花脚本是
public static void main(String[] args) throws Exception {
SparkSession spark = SparkSession
.builder()
.appName("Java Spark Translator")
.master("local")
.getOrCreate();
StructType rainSchema = new StructType().add("id","integer").add("altitude","double").add("city_name","string").add("latitude","double").add("longitude","double").add("rainfall","double").add("station_name","string").add("time","timestamp");
Dataset<Row> s1 = spark.read().schema(rainSchema).json("dataset/rainfall.json");
StructType humiditySchema = new StructType().add("id","integer").add("altitude","double").add("city_name","string").add("latitude","double").add("longitude","double").add("humidity","double").add("station_name","string").add("time","timestamp");
Dataset<Row> s2 = spark.read().schema(humiditySchema).json("dataset/humidity.json");
Dataset<Row> j1 = s1.join(s2, s2.col("station_name").equalTo(s1.col("station_name")), "inner");
j1.show();
我做错了什么吗?解决方案是什么?
谢谢
您配置了火花将"本地"用作主人。这意味着您不是真正使用群集,而是只使用一个节点。此外,如果您还没有为执行程序的默认大小设置Spark默认值,则只有一个很小的遗嘱执行人(默认为1 GB)。
这意味着Spark将开始阅读数据并将其扔掉,最终会因为缺乏内存或GC而崩溃(如果它只是创建并破坏数据太快)。
因此,您应该做的第一件事是将主人设置为所使用的任何资源管理器(这意味着您需要先设置它)。
您还需要配置不同的执行者(您正在使用多少,每个内存等等。)
)此外,JSON不是可以使用的有效格式。这意味着,如果您没有内存来处理所有内容,则可能会驱逐一些元素,并且需要重新读取(或只是崩溃)会很慢。更糟糕的是,如果您有问题,您总是从头开始。
我将首先写入dataframes(数据集)将其写入Parquet文件,然后从Parquet读取并进行加入。这样,即使生成木木木文件后发生了什么崩溃的,下一步的步骤也会更快。