【发布时间】:2018-05-04 18:29:14
【问题描述】:
我使用的是 spark 2.11 版本,我在我的应用程序中只执行了 3 个基本操作:
- 从数据库中获取记录:220 万条
- 使用包含检查数据库 (220 万) 中存在的文件 (5000) 中的记录
- 将匹配的记录写入 CSV 格式的文件
但是对于这 3 项操作,大约需要 20 分钟。如果我在 SQL 中做同样的操作,不到 1 分钟。
我已经开始使用 spark,因为它会很快产生结果,但它需要太多时间。如何提高性能?
第 1 步:从数据库中获取记录。
Properties connectionProperties = new Properties();
connectionProperties.put("user", "test");
connectionProperties.put("password", "test##");
String query="(SELECT * from items)
dataFileContent= spark.read().jdbc("jdbc:oracle:thin:@//172.20.0.11/devad", query,connectionProperties);
Step2:使用 contains 检查文件 B (2M) 中存在的文件 A (5k) 的记录
Dataset<Row> NewSet=source.join(target,target.col("ItemIDTarget").contains(source.col("ItemIDSource")),"inner");
Step3:将匹配的记录写入CSV格式的文件
NewSet.repartition(1).select("*")
.write().format("com.databricks.spark.csv")
.option("delimiter", ",")
.option("header", "true")
.option("treatEmptyValuesAsNulls", "true")
.option("nullValue", "")
.save(fileAbsolutePath);
为了提高性能,我尝试了几种设置缓存, 数据序列化
set("spark.serializer","org.apache.spark.serializer.KryoSerializer")),
洗牌时间
sqlContext.setConf("spark.sql.shuffle.partitions", "10"),
数据结构调优
-XX:+UseCompressedOops ,
没有一种方法不会产生更好的性能。
【问题讨论】:
-
这个用例是否有理由使用 Spark?在我看来,将 5k 条记录写入数据库并在数据库中发出 SQL 连接将是最有效的方法。
-
我的意思是,将这个查询具体化到 Spark 中需要多长时间:
SELECT * from items)?
标签: java performance apache-spark apache-spark-sql