今回は、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カーネルを作成する
ラボページにメニュー項目を追加して、sparkカーネルを追加します
フロントエンドのポップアップウィンドウでは、ユーザーはスパーク関連のパラメータを入力できます
次に、jupyterのkernel.jsonを記述します
次に、ユーザーはカーネルを使用してk8s-edノートブックでsparkを作成し、sparkジョブを作成します。
2. SparkwebUIページをjupyterlaburlにプロキシします
焦点はプロキシマッピング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に置き換えられていますが、長い間私をフォローしている場合は、私が主にサービスを提供している会社を知っておく必要があります。