現在、sparksqlでscala言語で書かれたパフォーマンスの問題が発生しています。申請の流れは以下の通りです。collectメソッドのSparkSQLパフォーマンスの問題
- スパークアプリケーションは、入力からテキストファイルがディレクトリ
プログラムでスキーマを指定使用して、ファイルの先頭にデータフレームを作成しHDFS読み出します。このデータフレームは、メモリに保持された入力ファイルの正確な複製になります。データフレーム
var eqpDF = sqlContext.createDataFrame(eqpRowRdd, eqpSchema)
に約18の列を持つことになりますと、手順2の異なるキーワードの助けを借りて、独自の口座番号が含まれています。このデータフレームで構成された第1のデータフレームからのフィルタリングデータフレームを作成します。ステップ2 & 3で構築さ2つのデータフレームを使用して
var distAccNrsDF = eqpDF.select("accountnumber").distinct().collect()
、我々は1つの口座番号に属しているすべてのレコードを取得し、フィルタリングされたデータの上にいくつかのJSONの解析ロジックを行います。
var filtrEqpDF = eqpDF.where("accountnumber='" + data.getString(0) + "'").collect()
最後にJSONはデータがデータフレームの上に収集メソッドの呼び出し中にここでは、パフォーマンスの問題に直面しているHBaseのテーブルに
を置かれる解析されました。 collectはすべてのデータを単一のノードにフェッチしてから処理を行うため、並列処理の利点が失われるためです。 実際のシナリオでも、私たちが期待できる100億レコードのデータがあります。したがって、ドライバーノードにすべてのレコードを収集すると、メモリーまたはディスクスペースの制限のためにプログラム自体がクラッシュする可能性があります。
私たちのケースでは、一度に限られた数のレコードをフェッチするtakeメソッドは使用できないと思います。データ全体から一意の口座番号をすべて取得する必要があるため、一度に レコードを取得するテイクメソッドが、私たちの要件に合っているかどうかはわかりません。
収集方法を呼び出すのを避け、何か他のベストプラクティスに従う。誰もが直面した同様の問題
があった場合は、コードスニペット/提案/ gitのリンクがあるコードは通常、このような状況で取る
val eqpSchemaString = "acoountnumber ....."
val eqpSchema = StructType(eqpSchemaString.split(" ").map(fieldName =>
StructField(fieldName, StringType, true)));
val eqpRdd = sc.textFile(inputPath)
val eqpRowRdd = eqpRdd.map(_.split(",")).map(eqpRow => Row(eqpRow(0).trim, eqpRow(1).trim, ....)
var eqpDF = sqlContext.createDataFrame(eqpRowRdd, eqpSchema);
var distAccNrsDF = eqpDF.select("accountnumber").distinct().collect()
distAccNrsDF.foreach { data =>
var filtrEqpDF = eqpDF.where("accountnumber='" + data.getString(0) + "'").collect()
var result = new JSONObject()
result.put("jsonSchemaVersion", "1.0")
val firstRowAcc = filtrEqpDF(0)
//Json parsing logic
{
.....
.....
}
}
実際に何をしたいですか?ちょうどHbaseテーブルに書き込みますか?それが事実なら、なぜあなたはテイクを収集したいのですか?採取と採取はサンプルデータを見るためだけに使用されます。それ以外には、回収または取る必要はありません。 – Phoenix
基本的には、同じアカウント番号に属するすべてのデータを(ソースファイル内で)グループ化し、グループ化されたデータをhbaseにプッシュする必要があります。グローバルに異なる口座番号を見つけるために、私たちが使っているものを集めてください。収集しないと、複数のノードに広がっているユニークなアカウント番号をグローバルに見つけることができます。 – afzal