スパークコードの読みやすさとパフォーマンスの最適化 - 10サンプル(プロジェクト構造)
その他
2020-01-11 00:31:48
訪問数: null
スパークコードの読みやすさとパフォーマンスの最適化 - 10サンプル(プロジェクト構造)
序文
各パッケージのカテゴリの下にアレンジ
- 各パッケージの機能のための手配、あなたは簡単にプロジェクトコードの構造を表示し、クリア機能、混沌の有利な発展の度合いを軽減することができます
- ここでは、例えば、参照リフトは、次の通り
- 説明
- スパークのために開発されたアプリケーションストアアプリケーション
- 共通の構成を格納するために使用される一般的な、またはエンジンの機能
- データソースを格納するためのdata.in取得機能
- データ出力を格納するためのdata.out
- データ処理機能を格納するためのdata.process
- 登録KYRO各構成対応する、KYRO火花
- utilのためのツールキット
スパークは、テンプレートベースのアプリケーションの設計クラスです
- メンテナンスプロジェクトの後半部分の賛成で、コードの構造を区別するために、より優れたプロセス制御コードを実行し、読みやすさを向上させることができ、テンプレートの基本クラスを設計します
- だから、例のように、基準Aのためにここに引用しました
- AppTrait
/**
* Spark应用Trait
* <p>
* Date: 2018/3/2 9:49
* @author ALion
*/
trait AppTrait {
/**
* 初始化,应用运行前
*/
protected def onInit(): Unit
/**
* 应用开始运行
*/
protected def onRun(): Unit
/**
* 应用结束
*/
protected def onStop(): Unit
/**
* 应用销毁后调用
*/
protected def onDestroyed(): Unit
}
- BaseSparkApp
import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession
/**
* Spark应用基类
* <p>
* Date: 2018/1/19 15:06
*
* @author ALion
*/
abstract class BaseSparkApp extends AppTrait {
protected final val appName = getClass.getSimpleName
protected final var spark: SparkSession = _
/**
* 启动应用
*/
final def startApp(): Unit = {
val time1 = System.currentTimeMillis()
println("-------> " + appName + " start ")
onInit()
createSession()
onRun()
onStop()
val time2 = System.currentTimeMillis()
println("-------> " + appName + " end costTime=" + (time2 - time1) / 1000 + "s")
}
/**
* 手动停止应用
*/
final def stopApp(): Unit = {
onStop()
}
/**
* 创建 SparkSession
*/
private def createSession(): Unit = {
spark = SparkSession.builder()
.config(getConf)
.enableHiveSupport()
.getOrCreate()
}
/**
* Spark应用配置
*
* @return SparkConf
*/
protected def getConf: SparkConf = {
new SparkConf()
.setAppName(appName)
.set("spark.network.timeout", "300")
.set("spark.shuffle.io.retryWait", "30s")
.set("spark.shuffle.io.maxRetries", "12")
.set("spark.locality.wait", "9s")
}
/**
* 初始化,应用运行前
*/
override protected def onInit(): Unit = {}
/**
* 应用运行
*/
override protected def onRun(): Unit
/**
* 应用结束
*/
override protected def onStop(): Unit = {
if (spark != null) spark.stop()
}
/**
* 应用销毁后调用
*/
override protected def onDestroyed(): Unit = {}
}
- 説明します
- ときスパーク開いているアプリケーション、BaseSparkAppから継承する必要
- アプリケーションはAppTraitのための基本的な機能について説明します
- BaseSparkAppは、プロセス制御アプリケーションのための実際のテンプレートクラスであります
- アプリケーションを起動する方法にstartApp呼び出し
- プロセスが最終であるが、不正操作後続プロセスを防止するために、コードを変更し、制御コードを流れ
- こうしたここで時間統計などの追加機能
- アプリケーションが起動する前に呼ばれるように使用さoninitを
- あなたはSparkSessionコールを作成する前に、オーバーライド使用するために必要な
- 初期化コードブロックは、例えば、格納することができ、他のソースから得られるデータの初期化ここにしてください。プログラマはありません再起動スパーク後に、不慮の間違ったコードの位置を防ぐだけでなく、他のコード、クラスタリソースの無意味な浪費を実行するための時間がかかります。
- SparkSessionを作成するために使用されるのCreateSession
- oninitを後に呼び出されます
- あなたはgetConfにだけ複製方法、SparkConfを作成するように変更する必要があります
- onRun実際のビジネス処理コード
- CreateSessionを呼び出した後
- グローバル変数スパークの使用を提供し、ここであなたのビジネスロジックのコードを書きます
- 自動的にonStop閉じるためのスパークアプリケーション
- onRun後に自動呼び出し
- 近くスパークに強制サービス、後(スパークは時々ためにいくつかの問題で立ち往生、またはシャットダウンする前にしばらく待つか、スパークでアプリケーションは、時間がかかるように他のコードがあります)
- しかし、また)(あなたはspark.stopを呼び出すことを忘れ防ぎます
- onDestroyedアプリケーションの破壊
- onStop呼び出した後
- 一部の企業は、常にクラスタリソースを占有していない、スパーク環境に従う必要はありません
- 例えば、事業開発、実行した後にスパークアプリケーションが他のサービスへの通知を行うことが必要になることがあり、それが何をすべき(onDestroyedで、である)停止後
公開された128元の記事
・
ウォン称賛45
・
ビュー15万+
転載: blog.csdn.net/alionsss/article/details/103809483