PySparkの原理 - エンドでのドライバー、Py4j実装によって方法は、PythonでのJava .pyspark.executor最後はエグゼキュータのタスクの数で同時に実行、pyspark.workerプロセスを対応する番号が存在します呼び出します。

PySparkの原理

スパーク Scalaの言語発達により主として、スカラ関連依存を導入することなく、他のシステムとの統合を容易にするために、部分的にように、外部シャッフルサービスとして、Java言語の発達を使用して実施しました。全体的に、スパークは、JVM言語で実装され、それはJVMで実行されます。しかし、スパークのScala / Java開発インターフェースを提供するだけでなく、スパークのコア実装の独立性を確保するために、開発・インタフェース・パイソン、Rおよび他の言語を提供することに加えて、異なる言語の開発サポートを実現するために、周囲に梱包を行うだけスパーク、本論文導入のPythonスパーク実装原則、アプリケーションが稼働しているかpysparkを分析します。

スパークランタイムアーキテクチャ

まず、オレンジ色の部分はJVMとして表される場合、以下に示すようにのは、スパークアーキテクチャの時に基本動作を確認しましょう、スパークアプリケーションの実行時には、ドライバとエグゼキュータ、ドライバのロードスケジューリングと全体的なUI表示、実行するタスクの担当執行、スパークに分けスパーク自体はシンプルなスタンドアロン(独立した展開)資源管理システムは、他の資源管理システムの助けを借りずに実行することができます実装しながら、それは、など糸、Mesos、などのリソース管理システム、各種ので展開することができます。詳細については、を参照してください分析のスケジューラ内部原則をスパーク

スパーク構造

スパークユーザドライバ上で実行しているアプリケーション(ある程度、ユーザプログラムは、プログラムスパークドライバである)、1つのパッケージにスパークタスクスケジュールした後、次に情報タスク実行エグゼキュータに、タスク情報は、コードロジックを含みますデータは、エグゼキュータは、直接ユーザーコードを実行しません。

PySparkランタイムアーキテクチャ

既存のランタイム・アーキテクチャスパークを破壊しないために、パッケージ層のPython APIの周囲にスパーク、補助Py4jは、図2に示すようなPythonアプリケーションによって書き込まれたスパーク、そのランタイム・アーキテクチャを実現し、PythonとJavaの相互作用を達成します。

pyspark構造

新しいPythonのプロセスの白い部分、どれを介してドライバ側、Py4jは、PythonのJava実装を呼び出す JVMに、ユーザー作成PySpark番組「マップ」へについては、例えば、ユーザーPySparkは、Python SparkContextをインスタンス化し、オブジェクト、JVM Scalaで最終的SparkContextオブジェクトのインスタンス、実行中のタスクエグゼキュータロジックの終了が送信されるので、端に執行が、Py4jによって必要とされない、ドライバは、それがあるがあり、シリアル化されたバイトコードでありますユーザー定義関数またはPythonのラムダ式を含むことができ、Py4jとメソッド呼び出しは、Java、Pythonで実現することができない、Pythonのラムダ式やユーザ定義のエグゼキュータのエンドランで機能することができるようにするために、あなたは、タスクごとに別々のスタートを必要としますPythonのプロセス、ソケット通信機能やPython Pythonのラムダ式分散処理の実行を介し。以下に示すように、全体的なプロセスレベルの対話型言語は、実線、破線は、結果が返さ示し、メソッド呼び出しを表します。

pysparkコール

ここでPySparkドライバが起動して、どのようにタスクエグゼキュータを実行することですかの詳細な分析があります。

ドライバ側の動作原理

私たちが火花submmit pysparkプログラムが提出したとき最初にPythonスクリプトと依存をアップロードして、ドライバを適用し、我々は、ドライバのリソースに適用する場合、(mainメソッドを含む)になるだろう以下に示すように、PythonRunnerによってJVMを引っ張りました。

pysparkドライバ - ランタイム

PythonRunner入り口主な機能は、主に二つのことを実行します。

  • オープンPy4j GatewayServer
  • 通过Java Process方式运行用户上传的Python脚本

用户Python脚本起来后,首先会实例化Python版的SparkContext对象,在实例化过程中会做两件事:

  • 实例化Py4j GatewayClient,连接JVM中的Py4j GatewayServer,后续在Python中调用Java的方法都是借助这个Py4j Gateway
  • 通过Py4j Gateway在JVM中实例化SparkContext对象

经过上面两步后,SparkContext对象初始化完毕,Driver已经起来了,开始申请Executor资源,同时开始调度任务。用户Python脚本中定义的一系列处理逻辑最终遇到action方法后会触发Job的提交,提交Job时是直接通过Py4j调用Java的PythonRDD.runJob方法完成,映射到JVM中,会转给sparkContext.runJob方法,Job运行完成后,JVM中会开启一个本地Socket等待Python进程拉取,对应地,Python进程在调用PythonRDD.runJob后就会通过Socket去拉取结果。

把前面运行时架构图中Driver部分单独拉出来,如下图所示,通过PythonRunner入口main函数拉起JVM和Python进程,JVM进程对应下图橙色部分,Python进程对应下图白色部分。Python进程通过Py4j调用Java方法提交Job,Job运行结果通过本地Socket被拉取到Python进程。还有一点是,对于大数据量,例如广播变量等,Python进程和JVM进程是通过本地文件系统来交互,以减少进程间的数据传输。

pysparkドライバ

Executor端运行原理

为了方便阐述,以Spark On Yarn为例,当Driver申请到Executor资源时,会通过CoarseGrainedExecutorBackend(其中有main方法)拉起JVM,启动一些必要的服务后等待Driver的Task下发,在还没有Task下发过来时,Executor端是没有Python进程的。当收到Driver下发过来的Task后,Executor的内部运行过程如下图所示。

pyspark  - エグゼランタイム

Executor端收到Task后,会通过launchTask运行Task,最后会调用到PythonRDD的compute方法,来处理一个分区的数据,PythonRDD的compute方法的计算流程大致分三步走:

  • 如果不存在pyspark.deamon后台Python进程,那么通过Java Process的方式启动pyspark.deamon后台进程,注意每个Executor上只会有一个pyspark.deamon后台进程,否则,直接通过Socket连接pyspark.deamon,请求开启一个pyspark.worker进程运行用户定义的Python函数或Lambda表达式。pyspark.deamon是一个典型的多进程服务器,来一个Socket请求,fork一个pyspark.worker进程处理,一个Executor上同时运行多少个Task,就会有多少个对应的pyspark.worker进程。
  • 紧接着会单独开一个线程,给pyspark.worker进程喂数据,pyspark.worker则会调用用户定义的Python函数或Lambda表达式处理计算。
  • 在一边喂数据的过程中,另一边则通过Socket去拉取pyspark.worker的计算结果。

フロントの実行時のアーキテクチャ図の執行部は、以下に示すように、個別に引き出し、JVMプロセスのオレンジ色の部分、Pythonのプロセスの白い部分、各pyspark.deamonエグゼキュータに共通のプロセス、タスク要求を受信する責任があり、そしてフォークpyspark.workerプロセス、プロセスの各タスク、実際のデータ処理は、pyspark.worker JVMタスクは、より頻繁にデータ通信ソケットを処理し、ローカルであろう。

pyspark-executor.png

概要

全体的に、PySparkはPy4jのPythonによって達成されるには、主にJVMランタイム基本的に、Javaのローカルソケットによって行われ返されたPythonの結果に、スパークアプリケーションを駆動するために、Javaの呼び出します。このアーキテクチャは、スパークのコアコードの独立性を確保し、一方で、性能のより多くの損失ではなくビッグデータのシーンで、PythonのプロセスJVMと頻繁にデータ通信用リードの間、貧しい人々にも直接立ち往生する可能性があり、それが大規模に推奨されます機械学習またはストリーミング・シナリオや注意PySp PySpark迅速な展開を提出し使用することができるデータの簡単なサイズ少量の下でのオフライン作業用のアプリケーションを書くためのネイティブのScala / Javaを利用するためにARK、。

ソースを示してください、固定リンクの記事:http://sharkdtu.com/posts/pyspark-internal.html

おすすめ

転載: www.cnblogs.com/bonelee/p/11585530.html