我需要使用spark sql分析10亿(100GB +)数据并坚持使用mongo db或弹性搜索。
来源是RDBMS。我们将逐列从RDBMS(Sql Server或oracle)中获取10亿(100GB +)数据(一次只分析一列)。
在分析过程中,我将在特定列上执行分组,在逐个输出上应用一些udf转换并将其保存到目标数据库中(Mongo DB或弹性搜索)
配置有3个从站的火花簇:
Spark版本:2.1.0
群集类型:独立。
主配置:
操作系统:Cent OS 7
处理器类型:i5
核心:4
RAM:16 GB
从属配置:
操作系统:Cent OS 7
处理器类型:i5
核心:4
RAM:16 GB
spark submit命令:
spark-submit --class com.poc.Client --master spark://datanode1:7077 --num-executors 9 --executor-cores 3 --executor-memory 9G "AnalysisPOC-1.0.jar"
conf.set("spark.shuffle.compress", "false");
conf.set("spark.broadcast.compress", "true");
conf.set("spark.sql.inMemoryColumnarStorage.compressed", "true");
conf.set("spark.sql.inMemoryColumnarStorage.batchSize", "10000");
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer");
conf.set("spark.kryo.referenceTracking", "false");
conf.set("spark.kryoserializer.buffer", "4000");
conf.set("spark.io.compression.codec", "org.apache.spark.io.SnappyCompressionCodec");
阅读表单spark :
数据集columnDataset = sparkSession.read()。format(" jdbc")。options(sourceDbProps).load()。groupBy(" someColumnName")。count()。persist(StorageLevel。 MEMORY_AND_DISK());
写给mongodb :
MongoSpark.write(columnDataset)可供选项(道具).mode(SaveMode.Append).save();
在提交10亿个数据之前,我按如下方式测试了我的代码:
案例 - 1:
专栏:7
数据集:500k
现状:成功
火花工作时间:
Mongo DB:6分15秒
弹性搜索:8分25秒
案例 - 2:
专栏:7
数据集:100万
现状:成功
火花工作时间:
Mongo DB:13分50秒
弹性搜索:20分30秒
案例 - 3:
专栏:7
数据集:1000万
现状:成功
火花工作时间:
Mongo DB:50分钟10秒
弹性搜索:1小时5分4秒
案例 - 4:
专栏:7
数据集:1亿
状态:失败
火花工作时间:
Mongo DB:失败了
弹性搜索:失败
例外:线程中的异常" main" org.apache.spark.SparkException:作业因阶段失败而中止:阶段0.0中的任务0失败4次,最近失败:阶段0.0中失去的任务0.3(TID 3,192.168.1.70,执行者0):java.lang。 IllegalStateException:没有新记录的空间
我需要帮助以有效的方式调整火花作业,我的工作必须处理10亿个数据。
我需要帮助以使用out分区键尽快获取rdbms数据。因为我一次只会分析一列。