私は火花2.11バージョンを使用していますが、私は自分のアプリケーションで唯一の3つの基本的な操作を行っています:パフォーマンスの問題
- は、データベースからレコードを取っ:220万
- は、ファイルからレコードをチェックする(5 000 )
- 含ま書き込みを使用してデータベース(220万)に存在するには、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);
ステップ2:ファイルB(2M)中に存在するファイルAのレコード(5K)チェック使用が含ま
Dataset<Row> NewSet=source.join(target,target.col("ItemIDTarget").contains(source.col("ItemIDSource")),"inner");
ステップ3:書き込みは、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のレコードをDBに書き込んで、DB内でSQL結合を発行するのが最も効率的なアプローチになると思います。 – maasg
このクエリをSparkに具体化するのにどれくらいの時間がかかるのですか?「アイテムからのSELECT *」? – maasg