この記事は、Kubernetes 上で Spark クラスターを構築するためのガイドです。また、Spark テスト タスクと関連するテスト データも提供します。この記事を読むことで、Spark イメージの作成、Spark コンテナ クラスターの構築、クラスター上でのテスト タスクの実行までの完全なプロセスを練習できます。 Yarn はかつて Hadoop のデフォルトのリソース オーケストレーション管理プラットフォームでした。しかし、最近、特に Hadoop の Spark に関しては状況が変わりました。 Kubernetes は、S3 などの他のストレージ プラットフォームと適切に統合されているものの、Hadoop エコシステム内の他のコンポーネントとは密接に関連していないため、急速に Yarn に取って代わり、オブジェクト ストレージに基づく Spark システムのデフォルトのオーケストレーションおよび管理プラットフォームになりつつあります。この記事では、Kubernetes クラスター上で Spark コンテナを構築およびデプロイする方法について詳しく説明します。 Spark は実行にデータを必要とするため、S3 API を介してストレージ操作を実行するように Spark クラスターを構成します。 Sparkコンテナを構築する Kubernetes にアプリケーションをデプロイする最初のステップは、コンテナを作成することです。一部のプロジェクトでは公式のコンテナ イメージを提供していますが、この記事の執筆時点では、Apache Spark は公式イメージを提供していません。そこで、Spark コンテナを自分で作成し、Dockerfile から始めましょう。 - java:openjdk-8-jdkから
-
- 環境 hadoop_ver 2.8.2
- 環境 spark_ver 2.4.4
-
- mkdir -p /opt && \ を実行します。
- cd /opt && \
- curl http://archive.apache.org/dist/hadoop/common/hadoop-${hadoop_ver}/hadoop-${hadoop_ver}.tar.gz | \
- tar -zx && \
- ln -s hadoop-${hadoop_ver} hadoop && \
- echo Hadoop ${hadoop_ver} が/optにインストールされました
-
- mkdir -p /opt && \ を実行します。
- cd /opt && \
- curl http://archive.apache.org/dist/spark/spark-${spark_ver}/spark-${spark_ver}-bin-without-hadoop.tgz | \
- tar -zx && \
- ln -s spark-${spark_ver}-bin-without-hadoop spark && \
- echo Spark ${spark_ver} が/optにインストールされました
-
- 環境変数SPARK_HOME=/opt/spark
- 環境変数PATH=$PATH:$SPARK_HOME/bin
- 環境変数 HADOOP_HOME=/opt/hadoop
- 環境変数PATH=$PATH:$HADOOP_HOME/bin
- 環境変数 LD_LIBRARY_PATH=$HADOOP_HOME/lib/native
-
- 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
- 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 を実行します。
- 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
- 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
- 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
- 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
- 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
-
- ADD start-common.sh start-worker start-master /
- core-site.xmlを追加します/opt/spark/conf/core-site.xml
- spark-defaults.confを追加します/opt/spark/conf/spark-defaults.conf
- 環境変数 PATH $PATH:/opt/spark/bin
この Dockerfile では、まず公式 Web サイトから Apache Spark と Hadoop をダウンロードし、次に Maven から関連する jar パッケージを取得します。すべての関連ファイルがダウンロードされ、特定のディレクトリに解凍されたら、これらの重要な構成ファイルをイメージに追加します。 このプロセスでは、環境に固有の構成を簡単に追加できます。 上記の手順をスキップして、事前に構築されたイメージを直接使用することもできますが、これらの手順に従うことで、読者は Spark コンテナーの内部を確認でき、上級ユーザーは特定のニーズに合わせてこれを変更できます。 上記の例で使用されている Dockerfile およびその他の関連する構成ファイルは、この GitHub リポジトリから取得できます。このリポジトリの内容を使用する場合は、次のコマンドを使用してローカルにクローンしてください。 - git クローン [email protected]:devshlabs/spark-kubernetes.git
これで、必要に応じて環境に変更を加え、イメージをビルドして、使用するコンテナ レジストリにアップロードできるようになります。この記事の例では、コンテナ レジストリとして Dockerhub を使用します。コマンドは次のようになります。 - spark-kubernetes/spark-container を実行します
- docker ビルド 。 -t mydockerrepo/spark:2.4.4
- docker push mydockerrepo/spark:2.4.4
mydockerrepo を実際のレジストリ名に置き換えることを忘れないでください。 Kubernetes に Spark をデプロイする この時点で、Spark コンテナ イメージがビルドされ、プルして使用できるようになります。このイメージを使用して、Spark マスターとワーカーをデプロイしましょう。最初のステップは、Spark Master を作成することです。 Kubernetes ReplicationController を使用して Spark Master を作成します。この記事の例では、1 つのインスタンスのみを使用して Spark Master を作成しました。 HA 要件のある本番環境では、レプリカの数を 3 以上に設定する必要がある場合があります。 - 種類: レプリケーションコントローラ
- APIバージョン: v1
- メタデータ:
- 名前: スパークマスターコントローラー
- 仕様:
- レプリカ: 1
- セレクタ:
- コンポーネント: spark-master
- テンプレート:
- メタデータ:
- ラベル:
- コンポーネント: spark-master
- 仕様:
- ホスト名: spark-master-hostname
- サブドメイン: spark-master-headless
- コンテナ:
- -名前: スパークマスター
- イメージ: mydockerrepo/spark:2.4.4
- imagePullPolicy: 常に
- コマンド: [ "/start-master" ]
- ポート:
- - コンテナポート: 7077
- - コンテナポート: 8080
- リソース:
- リクエスト:
- CPU: 100m
Spark Worker ノードが Spark Master ノードを検出できるようにするには、ヘッドレス サービスも作成する必要があります。 GitHub からリポジトリをクローンして spark-kubernetes ディレクトリに移動したら、次のコマンドで Spark Master サービスを開始できます。 - kubectl create -f spark-master-controller.yaml
- kubectl create -f spark-master-service.yaml
次に、マスター ノードとすべてのサービスが適切に実行されていることを確認してから、ワーカー ノードのデプロイを開始できます。 Spark Worker のレプリカ数は 2 に設定されていますが、必要に応じて変更できます。ワーカーの起動コマンドは次のとおりです: kubectl create -f spark-worker-controller.yaml 最後に、次のコマンドを使用して、すべてのサービスが正常に実行されていることを確認します: kubectl get all 上記のコマンドを実行すると、次のようなものが表示されます。 - 名前準備完了 ステータス 再起動 年齢
- po/spark-master-controller-5rgz2 1/1 実行中 0 9m
- po/spark-worker-controller-0pts6 1/1 実行中 0 9分
- po/spark-worker-controller-cq6ng 1/1 実行中 0 9分
-
- 名前希望現在の年齢
- rc/spark-マスターコントローラー 1 1 1 9m
- rc/spark-worker-controller 2 2 2 9分
-
- 名前クラスタ IP 外部 IP ポート 年齢
- svc/spark-master 10.108.94.160 7077/TCP、8080/TCP 9分
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 を例にとると、コマンドは次のようになります: kubectl exec -it spark-master-controller-v2hjb /bin/bash Spark システムにログインしている場合は、Spark Shell を実行できます。 - SPARK_DIST_CLASSPATH=$(hadoop クラスパス) をエクスポートします。
- スパークシェル
- デフォルトのログレベルの設定 に 「警告」 。
- ログレベルを調整するには、sc.setLogLevel(newLevel) を使用します。 SparkRの場合は、setLogLevel(newLevel) を使用します。
- Spark コンテキスト Web UI はhttp://192.168.132.147:4040で利用可能です。
- Sparkコンテキストは次のように利用可能 'sc' (マスター = spark://spark-master:7077、アプリ ID = app-20170405152342-0000)。
- Sparkセッションは以下からご利用いただけます 「スパーク」 。
- ようこそ
- ____ __
- / __/__ ___ _____/ /__
- _\ \/ _ \/ _ `/ __/ '_/
- /___/ .__/\_,_/_/ ///\_\ バージョン 2.4.4
- /_/
-
- Scala バージョン 2.11.12 (Java HotSpot(TM) 64ビットサーバー VM、Java 1.8.0_221)を使用
- 式を入力して評価します。
- 詳細については、 :help と入力してください。
-
- スカラ>
次に、上記のスケール プロンプトに次の構成を入力して、Spark マスターに S3 ストレージの詳細を伝えます。 - sc.hadoopConfiguration.set ( " fs.s3a.endpoint " 、 "https://s3.amazonaws.com" )
- sc.hadoopConfiguration.set ( "fs.s3a.access.key" 、 "s3-access-key" )
- sc.hadoopConfiguration.set ( "fs.s3a.secret.key" 、 "s3-secret-key" )
次に、Scala プロンプトに次のコードを貼り付けて、Spark ジョブを送信します (S3 関連のフィールドを変更することを忘れないでください)。 - org.apache.spark._ をインポートします。
- org.apache.spark.rdd.RDD をインポートします。
- org.apache.spark.util.IntParam をインポートします
- org.apache.spark.sql.SQLContext をインポートします。
- org.apache.spark.graphx._ をインポートします。
- org.apache.spark.graphx.util.GraphGenerators をインポートします。
- org.apache.spark.mllib.regression.LabeledPoint をインポートします。
- org.apache.spark.mllib.linalg.Vectors をインポートします。
- org.apache.spark.mllib.tree.DecisionTree をインポートします。
- org.apache.spark.mllib.tree.model.DecisionTreeModel をインポートします。
- org.apache.spark.mllib.util.MLUtils をインポートします。
-
- val conf = new SparkConf().setAppName( "YouTube" )
- val sqlContext = 新しい SQLContext(sc)
-
- sqlContext.implicits._ をインポートします。
- sqlContext._をインポートします。
-
- val youtubeDF = スパーク。 .format( "csv" )を読み取ります。オプション( "sep" 、 "," )。オプション( "inferSchema" 、 "true" )。オプション( "header" 、 "true" )。ロード( "s3a://s3-data-bucket/data.csv" )
-
- youtubeDF.registerTempTable( "人気" )
-
- val fltCountsql = sqlContext.sql( "人気のある s から s.title、s.views を選択" )
- fltCountsql.show()
最後に、kubectl patch コマンドを使用して Spark デプロイメントを更新できます。たとえば、負荷が高いときにワーカー ノードを追加し、負荷が減ったらそれらのワーカー ノードを削除できます。 |