ジュピターエコロジカルセカンダリーデベロップメントシリーズ(3)

今回は、jupyterlabを使用してk8sでsparkを実行するように変更しました

Jupyterlab自体はk8sで実行され、パーティAはコンピュータをよく理解していないため、開いているメモリの量、開いているメモリの量、使用されているメモリの量、使用されているメモリの量に関係なく、vaexまたはpandasがオーバーフローします。もちろん、実際にはオーバーフローします。

k8sでスパークを構築する方法は言うまでもありません。公式ウェブサイトにチュートリアルがあります。変革のアイデアについて話してください。

ここには2つの問題があります。1つはスパークカーネルの作成です。スパーククラスターが事前に作成されている場合、jupyterlabはポッドで実行され、作成済みのクラスターに接続できません。ドライバがクラスタモードで起動されている場合、jupyterはpysparkをインタラクティブに書き込むことができません。したがって、採用した方法は、必要に応じてラボでスパークカーネルを作成し、作成したスパークカーネルを使用してスパークドライバーを起動し、このドライバーを使用してk8sクラスターでスパークをプルアップする方法です。2番目のWebUIは、k8sのjupyterlabが複数の人によって使用されているため、公式Webサイトやその他の資料によると、sparkドライバーのポート4040はkubectl port-forwardを介してマップされますが、複数の人が使用しているため、各人のドライバーそれらはすべてポッド内のlocalhost:4040にあります。k8で同時にsparkを使用する人の数はわかりません。ポートマッピングが使用され、ホストポートが順番にバインドされている場合(そうではありません)、jupyterはポッドの外側を知ることができません。マップされたポートは何ですか。そこで、2つのコードを使用しました。1つはラボでsparkカーネルを作成するためのもので、もう1つはsparkドライバーのWebUIをプロキシを介してjupyterlabのURLにマップするためのものです。


変革のアイデアについて

1つは、sparkカーネルを作成する

  1. ラボページにメニュー項目を追加して、sparkカーネルを追加します 

    image.png

  2. フロントエンドのポップアップウィンドウでは、ユーザーはスパーク関連のパラメータを入力できます

    image.png

  3. 次に、jupyterのkernel.jsonを記述します

    image.png

  4. 次に、ユーザーはカーネルを使用してk8s-edノートブックでsparkを作成し、sparkジョブを作成します。


2. SparkwebUIページをjupyterlaburlにプロキシします

  image.png

焦点はプロキシマッピングURLにあり、spark uiは実際には開発全体の中で最も難しい部分です。このため、jupyterlabのポッドに2つのプロキシサーバー、http 7層プロキシ、およびsocks5 4層プロキシを特別にセットアップして、一緒に開発およびテストします。 。


次に、開発者が参照できるように、生成されたkernel.jsonを投稿します。

{ 
    "display_name": "PySparK8S Cluster"、
    "language": "python"、
    "argv":[ 
        "/ opt / miniconda3 / bin / python"、
        "-m"、
        "ipykernel"、
        "-f"、
        "{ connection_file} " 
    ]、
    " env ":{ 
        " PYSPARK_PYTHON ":" / opt / miniconda3 / bin / python "、 
        " SPARK_HOME ":" / opt / spark-3.0.0-bin-hadoop2.7 "、
        "PYSPARK_SUBMIT_ARGS": "--master k8s:// https://172.16.191.209:6443 --deploy-mode client --namexxx-sms-1111-0.xx-sms-1111-pyspark.ns.svc。 cluster.local --conf spark.executor.instances = 40 --conf spark.kubernetes.container.image = 172.16.191.206:8043 / matrix / spark-executor:v3.0.7 --confspark.kubernetes.container.image。 pullPolicy = IfNotPresent --conf spark.kubernetes.authenticate.driver.serviceAccountName = spark --conf spark.kubernetes.namespace = ns --conf spark.ui.port = 4041 --conf spark.driver.host = xxx-sms- 1111-0.xxx-sms-1111-pyspark.ns.svc.cluster.local --conf spark.kubernetes.driver.pod.name = xxx-sms-1111-0 --confspark.kubernetes.authenticate.subdmission。 caCertFile = / var / run / secrets / kubernetes.io / serviceaccount / ca.crt --conf spark.kubernetes.authenticate.submission.oauthTokenFile = / var / run / secrets / kubernetes。io / serviceaccount / token --conf spark.kubernetes.executor.limit.cores = 1 --conf spark.kubernetes.executor.request.cores = 1 --conf spark.executor.memory = 10g --confspark.driver。 memory = 15g --conf spark.driver.cores = 3 --conf spark.pyspark.driver.python = / opt / miniconda3 / bin / python --conf spark.pyspark.python = / opt / miniconda3 / bin / python- -conf spark.kubernetes.executor.volumes.persistentVolumeClaim.jingyanshan-1t.options.claimName = jingyanshan-1t --conf spark.kubernetes.executor.volumes.persistentVolumeClaim.crm.mount.readOnly = false --confspark.kubernetes。 executor.volumes.persistentVolumeClaim.crm.options.claimName = crm --conf spark.kubernetes.executor.volumes.persistentVolumeClaim.crm.mount.readOnly = false --confspark.kubernetes.executor.volumes.persistentVolumeClaim.crm-v2。 options.claimName = crm-v2 --confspark.kubernetes.executor.volumes。persistentVolumeClaim.crm.mount.readOnly = false --conf spark.kubernetes.executor.volumes.persistentVolumeClaim.jingyanshan-1t.mount.path = / home / jovyan --conf spark.kubernetes.executor.volumes.persistentVolumeClaim.crm.mount .path = / home / jovyan / crm --conf spark.kubernetes.executor.volumes.persistentVolumeClaim.crm-v2.mount.path = / home / jovyan / crm-v2 --conf spark.sql.shuffle.partitions = 1000 pyspark-shell」、
        "JAVA_HOME": "/ opt / jdk1.8.0_141"、
        "PYTHONPATH": "/opt/miniconda3/lib/python3.7/site-packages:/opt/spark-3.0.0-bin-hadoop2.7/python :/opt/spark-3.0.0-bin-hadoop2.7/python/lib/py4j-0.10.9-src.zip "、
        " PYTHONSTARTUP ":" / opt / spark-3.0.0-bin-hadoop2.7 /python/pyspark/shell.py " 
    } 
}


ここでは、変換のアイデアについてのみ説明します。最初に特定のコードを投稿することはしません。


重要な情報はコード化されているか、xxxに置き換えられていますが、長い間私をフォローしている場合は、私が主にサービスを提供している会社を知っておく必要があります。



おすすめ

転載: blog.51cto.com/slaytanic/2539622