Kubernetes での Spark デプロイメントの完全ガイド

Kubernetes での Spark デプロイメントの完全ガイド

[編集者注] この記事は、Kubernetes 上で Spark クラスターを構築するためのガイドです。また、Spark テスト タスクと関連するテスト データも提供します。この記事を読むことで、Spark イメージの作成、Spark コンテナ クラスターの構築、クラスター上でのテスト タスクの実行までの完全なプロセスを練習できます。

Yarn はかつて Hadoop のデフォルトのリソース オーケストレーション管理プラットフォームでした。しかし、最近、特に Hadoop の Spark に関しては状況が変わりました。 Kubernetes は、S3 などの他のストレージ プラットフォームと適切に統合されているものの、Hadoop エコシステム内の他のコンポーネントとは密接に関連していないため、急速に Yarn に取って代わり、オブジェクト ストレージに基づく Spark システムのデフォルトのオーケストレーションおよび管理プラットフォームになりつつあります。この記事では、Kubernetes クラスター上で Spark コンテナを構築およびデプロイする方法について詳しく説明します。 Spark は実行にデータを必要とするため、S3 API を介してストレージ操作を実行するように Spark クラスターを構成します。

[[317697]]

Sparkコンテナを構築する

Kubernetes にアプリケーションをデプロイする最初のステップは、コンテナを作成することです。一部のプロジェクトでは公式のコンテナ イメージを提供していますが、この記事の執筆時点では、Apache Spark は公式イメージを提供していません。そこで、Spark コンテナを自分で作成し、Dockerfile から始めましょう。

  1. java:openjdk-8-jdkから
  2.  
  3. 環境 hadoop_ver 2.8.2
  4. 環境 spark_ver 2.4.4
  5.  
  6. mkdir -p /opt && \ を実行します。
  7. cd /opt && \
  8. curl http://archive.apache.org/dist/hadoop/common/hadoop-${hadoop_ver}/hadoop-${hadoop_ver}.tar.gz | \
  9. tar -zx && \
  10. ln -s hadoop-${hadoop_ver} hadoop && \
  11. echo Hadoop ${hadoop_ver} が/optインストールされました
  12.  
  13. mkdir -p /opt && \ を実行します。
  14. cd /opt && \
  15. curl http://archive.apache.org/dist/spark/spark-${spark_ver}/spark-${spark_ver}-bin-without-hadoop.tgz | \
  16. tar -zx && \
  17. ln -s spark-${spark_ver}-bin-without-hadoop spark && \
  18. echo Spark ${spark_ver} が/optインストールされました
  19.  
  20. 環境変数SPARK_HOME=/opt/spark
  21. 環境変数PATH=$PATH:$SPARK_HOME/bin
  22. 環境変数 HADOOP_HOME=/opt/hadoop
  23. 環境変数PATH=$PATH:$HADOOP_HOME/bin
  24. 環境変数 LD_LIBRARY_PATH=$HADOOP_HOME/lib/native
  25.  
  26. curl を実行します http://central.maven.org/maven2/org/apache/hadoop/hadoop-aws/2.8.2/hadoop-aws-2.8.2.jar -o /opt/spark/jars/hadoop-aws-2.8.2.jar
  27. curl http://central.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.3/httpclient-4.5.3.jar -o /opt/spark/jars/httpclient-4.5.3.jar を実行します。
  28. curl を実行します http://central.maven.org/maven2/joda- time /joda- time /2.9.9/joda- time -2.9.9.jar -o /opt/spark/jars/joda- time -2.9.9.jar
  29. curl を実行します http://central.maven.org/maven2/com/amazonaws/aws-java-sdk-core/1.11.712/aws-java-sdk-core-1.11.712.jar -o /opt/spark/jars/aws-java-sdk-core-1.11.712.jar
  30. curl を実行します http://central.maven.org/maven2/com/amazonaws/aws-java-sdk/1.11.712/aws-java-sdk-1.11.712.jar -o /opt/spark/jars/aws-java-sdk-1.11.712.jar
  31. curl を実行します http://central.maven.org/maven2/com/amazonaws/aws-java-sdk-kms/1.11.712/aws-java-sdk-kms-1.11.712.jar -o /opt/spark/jars/aws-java-sdk-kms-1.11.712.jar
  32. curl を実行します http://central.maven.org/maven2/com/amazonaws/aws-java-sdk-s3/1.11.712/aws-java-sdk-s3-1.11.712.jar -o /opt/spark/jars/aws-java-sdk-s3-1.11.712.jar
  33.  
  34. ADD start-common.sh start-worker start-master /
  35. core-site.xmlを追加します/opt/spark/conf/core-site.xml
  36. spark-defaults.confを追加します/opt/spark/conf/spark-defaults.conf
  37. 環境変数 PATH $PATH:/opt/spark/bin

この Dockerfile では、まず公式 Web サイトから Apache Spark と Hadoop をダウンロードし、次に Maven から関連する jar パッケージを取得します。すべての関連ファイルがダウンロードされ、特定のディレクトリに解凍されたら、これらの重要な構成ファイルをイメージに追加します。

このプロセスでは、環境に固有の構成を簡単に追加できます。

上記の手順をスキップして、事前に構築されたイメージを直接使用することもできますが、これらの手順に従うことで、読者は Spark コンテナーの内部を確認でき、上級ユーザーは特定のニーズに合わせてこれを変更できます。

上記の例で使用されている Dockerfile およびその他の関連する構成ファイルは、この GitHub リポジトリから取得できます。このリポジトリの内容を使用する場合は、次のコマンドを使用してローカルにクローンしてください。

  1. git クローン [email protected]:devshlabs/spark-kubernetes.git

これで、必要に応じて環境に変更を加え、イメージをビルドして、使用するコンテナ レジストリにアップロードできるようになります。この記事の例では、コンテナ レジストリとして Dockerhub を使用します。コマンドは次のようになります。

  1. spark-kubernetes/spark-container を実行します
  2. docker ビルド 。 -t mydockerrepo/spark:2.4.4
  3. docker push mydockerrepo/spark:2.4.4

mydockerrepo を実際のレジストリ名に置き換えることを忘れないでください。

Kubernetes に Spark をデプロイする

この時点で、Spark コンテナ イメージがビルドされ、プルして使用できるようになります。このイメージを使用して、Spark マスターとワーカーをデプロイしましょう。最初のステップは、Spark Master を作成することです。 Kubernetes ReplicationController を使用して Spark Master を作成します。この記事の例では、1 つのインスタンスのみを使用して Spark Master を作成しました。 HA 要件のある本番環境では、レプリカの数を 3 以上に設定する必要がある場合があります。

  1. 種類: レプリケーションコントローラ
  2. APIバージョン: v1
  3. メタデータ:
  4. 名前: スパークマスターコントローラー
  5. 仕様:
  6. レプリカ: 1
  7. セレクタ:
  8. コンポーネント: spark-master
  9. テンプレート:
  10. メタデータ:
  11. ラベル:
  12. コンポーネント: spark-master
  13. 仕様:
  14. ホスト名: spark-master-hostname
  15. サブドメイン: spark-master-headless
  16. コンテナ:
  17. -名前: スパークマスター
  18. イメージ: mydockerrepo/spark:2.4.4
  19. imagePullPolicy: 常に
  20. コマンド: [ "/start-master" ]
  21. ポート:
  22. - コンテナポート: 7077
  23. - コンテナポート: 8080
  24. リソース:
  25. リクエスト:
  26. CPU: 100m

Spark Worker ノードが Spark Master ノードを検出できるようにするには、ヘッドレス サービスも作成する必要があります。

GitHub からリポジトリをクローンして spark-kubernetes ディレクトリに移動したら、次のコマンドで Spark Master サービスを開始できます。

  1. kubectl create -f spark-master-controller.yaml
  2. kubectl create -f spark-master-service.yaml

次に、マスター ノードとすべてのサービスが適切に実行されていることを確認してから、ワーカー ノードのデプロイを開始できます。 Spark Worker のレプリカ数は 2 に設定されていますが、必要に応じて変更できます。 Worker の起動コマンドは次のとおりです。

  1. kubectl作成-f spark-worker-controller.yaml

最後に、次のコマンドを実行して、すべてのサービスが適切に実行されていることを確認します。

  1. kubectlすべて取得 

上記のコマンドを実行すると、次のような表示が出ます。

  1. 名前準備完了 ステータス 再起動 年齢
  2. po/spark-master-controller-5rgz2 1/1 実行中 0 9m
  3. po/spark-worker-controller-0pts6 1/1 実行中 0 9分
  4. po/spark-worker-controller-cq6ng 1/1 実行中 0 9分
  5.  
  6. 名前希望現在の年齢
  7. rc/spark-マスターコントローラー 1 1 1 9m
  8. rc/spark-worker-controller 2 2 2 9分
  9.  
  10. 名前クラスタ IP 外部 IP ポート 年齢
  11. svc/spark-master 10.108.94.160 <なし> 7077/TCP、8080/TCP 9m

Spark クラスターにジョブを送信する

それでは、ジョブを送信して、正常に動作するかどうかを確認しましょう。ただし、その前に、有効な AWS S3 アカウントとサンプルデータを含むバケットが必要です。サンプルデータをダウンロードするためにKaggleを使用しました。サンプル データは https://www.kaggle.com/datasna ... s.csv から取得でき、S3 バケットにアップロードする必要があります。バケット名が s3-data-bucket であると仮定すると、サンプル データ ファイルは s3-data-bucket/data.csv にあります。

データの準備が整うと、実行のために Spark マスター ポッドにロードされます。 spark-master-controller-5rgz2 という名前の Pod を例にとると、コマンドは次のようになります。

  1. kubectl exec -it spark-master-controller-v2hjb /bin/bash

Spark システムにログインしている場合は、Spark Shell を実行できます。

  1. SPARK_DIST_CLASSPATH=$(hadoop クラスパス) をエクスポートします。
  2. スパークシェル
  3. デフォルトのログレベルの設定   「警告」
  4. ログレベルを調整するには、sc.setLogLevel(newLevel) を使用します。 SparkRの場合は、setLogLevel(newLevel) を使用します。
  5. Spark コンテキスト Web UI はhttp://192.168.132.147:4040利用可能です。
  6. Sparkコンテキストは次のように利用可能  'sc' (マスター = spark://spark-master:7077、アプリ ID = app-20170405152342-0000)。
  7. Sparkセッションは以下からご利用いただけます  「スパーク」
  8. ようこそ 
  9. ____ __
  10. / __/__ ___ _____/ /__
  11. _\ \/ _ \/ _ `/ __/ '_/
  12. /___/ .__/\_,_/_/ ///\_\ バージョン 2.4.4
  13. /_/
  14.  
  15. Scala バージョン 2.11.12 (Java HotSpot(TM) 64ビットサーバー VM、Java 1.8.0_221)を使用
  16. を入力し評価します。
  17. 詳細については、 :help と入力してください。
  18.  
  19. スカラ>

次に、上記のスケール プロンプトに次の構成を入力して、Spark マスターに S3 ストレージの詳細を伝えます。

  1. sc.hadoopConfiguration.set ( " fs.s3a.endpoint " "https://s3.amazonaws.com" )
  2. sc.hadoopConfiguration.set ( "fs.s3a.access.key" "s3-access-key" )
  3. sc.hadoopConfiguration.set ( "fs.s3a.secret.key" "s3-secret-key" )

次に、Scala プロンプトに次のコードを貼り付けて、Spark ジョブを送信します (S3 関連のフィールドを変更することを忘れないでください)。

  1. org.apache.spark._ をインポートします。
  2. org.apache.spark.rdd.RDD をインポートします。
  3. org.apache.spark.util.IntParam をインポートします
  4. org.apache.spark.sql.SQLContext をインポートします。
  5. org.apache.spark.graphx._ をインポートします。
  6. org.apache.spark.graphx.util.GraphGenerators をインポートします。
  7. org.apache.spark.mllib.regression.LabeledPoint をインポートします。
  8. org.apache.spark.mllib.linalg.Vectors をインポートします。
  9. org.apache.spark.mllib.tree.DecisionTree をインポートします。
  10. org.apache.spark.mllib.tree.model.DecisionTreeModel をインポートします。
  11. org.apache.spark.mllib.util.MLUtils をインポートします。
  12.  
  13. val conf = new SparkConf().setAppName( "YouTube" )
  14. val sqlContext = 新しい SQLContext(sc)
  15.  
  16. sqlContext.implicits._ をインポートします。
  17. sqlContext._をインポートします。
  18.  
  19. val youtubeDF = スパーク。 .format( "csv" )を読み取りますオプション( "sep" "," )。オプション( "inferSchema" "true" )。オプション( "header" "true" )。ロード( "s3a://s3-data-bucket/data.csv" )
  20.  
  21. youtubeDF.registerTempTable( "人気" )
  22.  
  23. val fltCountsql = sqlContext.sql( "人気のある s から s.title、s.views を選択" )
  24. fltCountsql.show()

最後に、kubectl patch コマンドを使用して Spark デプロイメントを更新できます。たとえば、負荷が高いときにワーカー ノードを追加し、負荷が減ったらそれらのワーカー ノードを削除できます。

<<:  CPUハードウェア支援仮想化技術

>>:  ハイブリッドクラウドは重要なデータの潜在的な漏洩を減らすことができる

推薦する

4月の第1週には、.COMドメイン名が約9万件増加して1位となり、.AISAは2万5千件減少した。

IDC Review Network (idcps.com) は 4 月 10 日に次のように報告し...

[10月] Hawkhost - 50% オフ/VPS/仮想ホスト/2日間有効なフラッシュセール

Eagle Host は、オランダのアムステルダム データ センターの仮想ホストと VPS のフラッ...

Sina Weibo はトラフィックの収益化を目指し、ショッピングガイドコミュニティ Tuola.com に 1,000 万元を投資

【捜狐ITニュース】11月8日、業界関係者は、Tuola.comがSina Weibo Fundから...

Youku Tudouは結婚するか、著作権と広告価格を変更するしかなかった

王維が再びビジネスを始めることを選択するか、それとも完全に文系の若者でいることを選択するかに関わらず...

チキン食い競争における商品配置の戦いが始まった。隠れたチキン食い王はどのブランドか?

皆さんも少し前にJD.comのDouble Elevenチャーター便の広告を見たことがあると思います...

fastervm-VPS 年払い 220 元/C3 コンピュータ ルーム/KVM/768M メモリ/15g ハードディスク/512g トラフィック

fastervm は新年のプロモーションを提供します: C3 データセンターの VPS、KVM 仮想...

陳一州人:中国のインターネットは10年後に技術的な「ブラックホール」に陥る

9月4日、Renren Inc.の会長兼CEOである陳一洲氏は本日、「中国モバイルインターネット投資...

Toutiaoがついにテンセント全体を脅かし始める

2018年に売上高500億元の賭けに失敗し、多くの株式を失ったにもかかわらず、今日頭条は確かに正式な...

メディアマイクロブログ編集者の自己啓発 メディアにとってのマイクロブログの価値

メディアにとって、Weiboはある意味救いの手となり、メディアの声は増幅されるようだ。 Weibo ...

オンラインビジネスは観光監督の盲点となり、ウェブサイトやプラットフォームは頻繁に「エッジボール」をプレーしている。

国家観光局は6月4日、メーデー連休期間中の観光市場規制の集中検査について報告した。通知では、観光事業...

reprisehosting: シアトルの格安サーバー、月額 37.38 ドル、2*E5-2650L/32G メモリ/240gSSD+12T HDD/10T トラフィック/1Gbps 帯域幅/4 IPv4

reprisehosting は現在、シアトルのデータセンターにある自社専用サーバーの特別プロモーシ...

サーバーレスコンピューティングはクラウドネイティブの次の進化となるかもしれない

新しいテクノロジーが登場すると、人々がまずそれを採用するのは、それがもたらす価値のためです。その価値...

微博マーケティング:「90点」ブランドの微博運営における6つのポイント

企業にとって投資収益率の高いWeiboプロジェクトを作成するにはどうすればよいでしょうか。要約すると...

ブログのプロモーション - ブログを有名にする方法

ほとんどの人はブログを書くとき、ブログの宣伝に多くの時間を費やしますが、これはブログ本来の目的から外...

weloveservers-各種低価格アーティファクト/VPS 4月プロモーション第一弾

weloveserversは4月にプロモーションVPSをリリースしました。openvzベースで、25...