スパークコードの読みやすさとパフォーマンスの最適化 - 10サンプル(プロジェクト構造)

スパークコードの読みやすさとパフォーマンスの最適化 - 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