1.ELTとは
ほとんどの場合、データエンジニアはETL、つまり抽出、変換、読み込みにさらされてきました。コンピューティングプラットフォームの機能がますます増えるにつれて、データエンジニアはELTに従ってデータ操作を実行することがよくあります。 Extract、Load、およびTransformによると、データ変換は強力なコンピューティングプラットフォームに依存でき、データ同期ツールはデータの抽出と追加に注意を払うだけで済み、開発者の効率が向上します。
2.なぜSparkを選ぶのか
a)ビジネスデータの同期を拡大する過程で、多くの従来のETLツールがスタンドアロンマシンで実行されます。大規模なデータ処理機能を備えたデータ同期システムを構築することは、ビッグデータ分析システムに不可欠なリンクになっています。Sparkは分散プラットフォームで実行でき、さまざまなデータベースへのアクセスを適切にサポートしているため、Sparkを使用してデータ同期ツールを開発することをお勧めします。
b)Spark DataFrameは豊富な操作APIを提供し、DataFrameに基づいてSQL操作を直接実行でき、いくつかの簡単なデータ変換をELプロセスで実行できます。
c)Sparkプログラムは簡単にデプロイでき、spark-submitコマンドを使用してコードを送信するだけです。
2.1、TなしのSpark ETL
このプラクティスでは、Sparkを上手に使用して複数の異種データソース間でデータを同期できるようにするために、変換(Transform)実際の戦闘は実行せず、単純なEL操作の実際の戦闘のみを実行します。
2.3、MySQLでのJavaSpark読み取り
public class MysqlReader {
public Dataset<Row> reader(SparkSession sparkSession){
Dataset<Row> rowDataset = sparkSession.read()
.format("jdbc")
.option("url", url)
.option("dbtable", tableName)
.option("user", userName)
.option("password", passwd)
.option("driver", "com.mysql.cj.jdbc.Driver").load();
return rowDataset;
}
}
上記のコードには欠点があります。テーブルデータの量が多い場合、mysqlデータを一度に読み取るセッションであるため、データを読み取るリスクがあります。したがって、次の2番目の読み取りがあります。
Dataset<Row> rowDataset = sparkSession.read()
.format("jdbc")
.option("url", url)
.option("dbtable", tableName)
.option("user", userName)
.option("password", passwd)
.option("driver", "com.mysql.cj.jdbc.Driver")
.option("partitionColumn", columnName)
.option("lowerBound", 1)
.option("upperBound", 1000)
.option("fetchsize", 1000)
.option("numPartitions", 3)
.load();
公式ドキュメントを見ると、partitionColumn構成アイテムとnumPartitions、lowerBound、upperBoundが同時に表示される必要があることがわかります。その中で
partitionColumn:データを読み取るときの条件に従ってフィルタリングされるフィールドを示します。通常、int、datatime、およびtimestampの形式の主キーまたはインデックスフィールドが選択されます。
numPartitions:これは、読み取るときに、読み取るためにいくつかのパーティションに分割され、最後に、読み取りたいデータがSparkのいくつかのパーティションに読み取られることを意味します。
lowerBound:読み取るとき、1未満のものはすべて最初のパーティションになければならないことを意味します。
upperBound:読み取り時に、1000を超えるものが最後のパーティションにある必要があることを意味します。
fetchsize:読み取り時に読み取りごとに返されるアイテムの最大数を示します。これにより、mysqlデータの読み取り速度を効果的に制御できます。速すぎず、速すぎるとmysqlがクラッシュします。
次の図は、実際に読み取ったときの上記のコードの1、1000、3の意味、1000/3 = 333を示しています。したがって、ログでは、334と667が3つのデータパーティションのストレージルールとして使用されます。