我试图在一组机器(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();
我做错了吗?可能是什么解决方案?
由于
答案 0 :(得分:0)
您可以将spark配置为使用“local”作为主服务器。这意味着您实际上并未使用群集,而只使用单个节点。此外,如果您没有为执行程序的默认大小设置spark默认值,那么您将只有一个非常小的执行程序(默认为1 GB)。
这意味着火花将开始读取数据并将其丢弃,最终导致内存不足或GC崩溃(如果它只是过快地创建和销毁数据)。
所以你要做的第一件事就是将你的主人设置为你正在使用的资源管理器(这意味着你需要先设置它)。
您还需要配置不同的执行程序(您使用了多少个,每个执行程序的内存等)。
此外,json不是一种有效的格式。这意味着如果你没有内存来处理所有内容,那么某些元素可能被驱逐并需要重新读取(或者只是崩溃的东西),这会很慢。更糟糕的是,如果你有问题,你总是从头开始。
我会首先将数据帧(数据集)写入镶木地板文件,然后从镶木地板中读取并进行连接。这样,即使生成镶木地板文件后出现问题,接下来的步骤也会快得多。