GNU/Linux >> Linux の 問題 >  >> Ubuntu

ベアメタルクラウドへのSparkクラスターの自動デプロイ

はじめに

phoenixNAPベアメタルクラウドは、開発者がベアメタルサーバーの作成を自動化できるようにするRESTfulAPIインターフェースを公開します。

システムの機能を示すために、この記事では、BMCAPIを活用してベアメタルクラウドでのSparkクラスターのプロビジョニングを自動化する方法に関するPythonコード例を説明および提供します。 。

前提条件

  • phoenixNAPベアメタルクラウドアカウント
  • OAuthアクセストークン

Sparkクラスターのデプロイを自動化する方法

以下の手順は、phoenixNAPのベアメタルクラウド環境に適用されます。この記事にあるPythonコード例は、他の環境では機能しない可能性があります。

Apache Sparkクラスターをデプロイしてアクセスするために必要な手順:

1.アクセストークンを生成します。

2.UbuntuOSを実行するベアメタルクラウドサーバーを作成します。

3.作成したサーバーインスタンスにApacheSparkクラスターをデプロイします。

4.生成されたリンクをたどってApacheSparkダッシュボードにアクセスします。

この記事では、ベアメタルクラウドAPIとシェルコマンドを活用して上記の手順を完了するPythonコードセグメントのサブセットに焦点を当てています。

ステップ1:アクセストークンを取得する

BMC APIにリクエストを送信する前に、 client_idを使用してOAuthアクセストークンを取得する必要があります およびclient_secret BMCポータルに登録されています。

client_idとclient_secretに登録する方法の詳細については、Bare MetalCloudAPIクイックスタートガイドを参照してください。

以下は、APIのアクセストークンを生成するPython関数です。

def get_access_token(client_id: str, client_secret: str) -> str:
"""Retrieves an access token from BMC auth by using the client ID and the 
client Secret."""
    credentials = "%s:%s" % (client_id, client_secret)
    basic_auth = standard_b64encode(credentials.encode("utf-8"))
    response = requests.post(' https://api.phoenixnap.com/bmc/v0/servers',
        headers={
            'Content-Type': 'application/x-www-form-urlencoded',
            'Authorization': 'Basic %s' % basic_auth.decode("utf-8")},
        data={'grant_type': 'client_credentials'})
 
    if response.status_code != 200:
        raise Exception('Error: {}. {}'.format(response.status_code, response.json()))
    return response.json()['access_token']

ステップ2:ベアメタルサーバーインスタンスを作成する

POST/サーバーのRESTAPI呼び出しを使用して、ベアメタルサーバーインスタンスを作成します。 POST /サーバーリクエストごとに、データセンターの場所、サーバーの種類、OSなどの必要なパラメータを指定します。

以下は、ベアメタルサーバーを作成するためにBMCAPIを呼び出すPython関数です。

def __do_create_server(session, server):
    response = session.post('https://api.phoenixnap.com/bmc/v0/servers'),
                            data=json.dumps(server))
    if response.status_code != 200:
        print("Error creating server: {}".format(json.dumps(response.json())))
    else:
        print("{}".format(json.dumps(response.json())))
        return response.json()

この例では、server-settings.confファイルで指定されているように、タイプ「s1.c1.small」の3つのベアメタルサーバーが作成されます。

{
"ssh-key" : "ssh-rsa xxxxxx== username",
"servers_quantity" : 3,
"type" : "s1.c1.small",
"hostname" : "spark",
"description" : "spark",
"public" : True,
"location" : "PHX",
"os" : "ubuntu/bionic"
}

トークンを生成してサーバーをプロビジョニングするPythonスクリプトから期待される出力は、次のとおりです。

Retrieving token 

Successfully retrieved API token 

Creating servers... 

{ 
  "id": "5ee9c1b84a9ca71ea6b9b766", 
  "status": "creating", 
  "hostname": "spark-1", 
  "description": "spark-1", 
  "os": "ubuntu/bionic", 
  "type": "s1.c1. small ", 
  "location": "PHX", 
  "cpu": "E-2276G", 
  "ram": "128GB RAM", 
  "storage": "2x 960GB NVMe", 
  "privateIpAddresses": [ 
    "10.0.0.11" 
  ], 

  "publicIpAddresses": [ 
    "131.153.143.250", 
    "131.153.143.251", 
    "131.153.143.252", 
    "131.153.143.253", 
    "131.153.143.254" 
  ] 

} 

Server created, provisioning spark-1... 

{ 
  "id": "5ee9c1b84a9ca71ea6b9b767", 
  "status": "creating", 
  "hostname": "spark-0", 
  "description": "spark-0", 
  "os": "ubuntu/bionic", 
  "type": "s1.c1.small", 
  "location": "PHX", 
  "cpu": "E-2276G", 
  "ram": "128GB RAM", 
  "storage": "2x 960GB NVMe", 

  "privateIpAddresses": [ 
    "10.0.0.12" 
  ], 

  "publicIpAddresses": [ 
    "131.153.143.50", 
    "131.153.143.51", 
    "131.153.143.52", 
    "131.153.143.53", 
    "131.153.143.54" 
  ] 
} 

Server created, provisioning spark-0... 

{ 
  "id": "5ee9c1b84a9ca71ea6b9b768", 
  "status": "creating", 
  "hostname": "spark-2", 
  "description": "spark-2", 
  "os": "ubuntu/bionic", 
  "type": "s1.c1. small ", 
  "location": "PHX", 
  "cpu": "E-2276G", 
  "ram": "128GB RAM", 
  "storage": "2x 960GB NVMe", 

  "privateIpAddresses": [ 
    "10.0.0.13" 
  ], 

  "publicIpAddresses": [ 
    "131.153.142.234", 
    "131.153.142.235", 
    "131.153.142.236", 
    "131.153.142.237", 
    "131.153.142.238" 
  ] 
} 

Server created, provisioning spark-2... 

Waiting for servers to be provisioned... 

3つのベアメタルサーバーを作成すると、スクリプトはBMC APIと通信して、プロビジョニングが完了し、サーバーの電源がオンになるまでサーバーのステータスを確認します。

ステップ3:ApacheSparkクラスターをプロビジョニングする

サーバーがプロビジョニングされると、PythonスクリプトはサーバーのパブリックIPアドレスを使用してSSH接続を確立します。次に、スクリプトはUbuntuサーバーにSparkをインストールします。これには、 JDKのインストールが含まれます 、 Scala Git およびスパーク すべてのサーバーで。

プロセスを開始するには、 all_hosts.shを実行します すべてのサーバー上のファイル。このスクリプトは、ダウンロードとインストールの手順、およびクラスターを使用できるように準備するために必要な環境構成を提供します。

Apache Sparkには、サーバーをマスターノードおよびワーカーノードとして構成するスクリプトが含まれています。ワーカーノードを構成する際の唯一の制約は、マスターノードがすでに構成されていることです。プロビジョニングされる最初のサーバーは、Sparkマスターノードとして割り当てられます。

次のPython関数がそのタスクを実行します:

def wait_server_ready(function_scheduler, server_data):
    json_server = bmc_api.get_server(REQUEST, server_data['id'])
    if json_server['status'] == "creating":
        main_scheduler.enter(2, 1, wait_server_ready, (function_scheduler, server_data))
    elif json_server['status'] == "powered-on" and not data['has_a_master_server']:
        server_data['status'] = json_server['status']
        server_data['master'] = True
        server_data['joined'] = True
        data['has_a_master_server'] = True
        data['master_ip'] = json_server['publicIpAddresses'][0]
        data['master_hostname'] = json_server['hostname']
        print("ASSIGNED MASTER SERVER: {}".format(data['master_hostname']))

master_host.shを実行します 最初のサーバーをマスターノードとして構成するファイル。以下のma​​ster_host.shのコンテンツを参照してください ファイル:

#!/bin/bash
echo "Setting up master node"
/opt/spark/sbin/start-master.sh

マスターノードが割り当てられて構成されると、他の2つのノードがSparkクラスターに追加されます。

以下のworker_host.shのコンテンツを参照してください ファイル:

#!/bin/bash
echo "Setting up master node on /etc/hosts"
echo "$1 $2 $2" | sudo tee -a /etc/hosts
echo "Starting worker node"
echo "Joining worker node to the cluster"
/opt/spark/sbin/start-slave.sh spark://$2:7077

ApacheSparkクラスターのプロビジョニングが完了しました。以下は、Pythonスクリプトから期待される出力です。

ASSIGNED MASTER SERVER: spark-2
Running all_host.sh script on spark-2 (Public IP: 131.153.142.234)

Setting up /etc/hosts
Installing jdk, scala and git
Downloading spark-2.4.5
Unzipping spark-2.4.5
Setting up environment variables

Running master_host.sh script on spark-2 (Public IP: 131.153.142.234)
Setting up master node
starting org.apache.spark.deploy.master.Master, logging to /opt/spark/logs/spark-ubuntu-org.apache.spark.deploy.master.Master-1-spark-2.out

Master host installed
Running all_host.sh script on spark-0 (Public IP: 131.153.143.170)

Setting up /etc/hosts
Installing jdk, scala and git
Downloading spark-2.4.5
Unzipping spark-2.4.5
Setting up environment variables

Running all_host.sh script on spark-1 (Public IP: 131.153.143.50)

Setting up /etc/hosts
Installing jdk, scala and git
Downloading spark-2.4.5
Unzipping spark-2.4.5
Setting up environment variables

Running slave_host.sh script on spark-0 (Public IP: 131.153.143.170)
Setting up master node on /etc/hosts
10.0.0.12 spark-2 spark-2
Starting worker node
Joining worker node to the cluster
starting org.apache.spark.deploy.worker.Worker, logging to /opt/spark/logs/spark-ubuntu-org.apache.spark.deploy.worker.Worker-1-spark-0.out

Running slave_host.sh script on spark-1 (Public IP: 131.153.143.50)
Setting up master node on /etc/hosts
10.0.0.12 spark-2 spark-2
Starting worker node
Joining worker node to the cluster
starting org.apache.spark.deploy.worker.Worker, logging to /opt/spark/logs/spark-ubuntu-org.apache.spark.deploy.worker.Worker-1-spark-1.out

Setup servers done
Master node UI: http://131.153.142.234:8080

ステップ4:ApacheSparkダッシュボードにアクセスする

すべての命令を実行すると、PythonスクリプトはApacheSparkダッシュボードにアクセスするためのリンクを提供します。


Ubuntu
  1. ベアメタル上にLinuxクラウドをセットアップする

  2. E2EのMyAccountFAQ

  3. ベアメタル Linux インストールを仮想マシンに移行する方法

  1. ベアメタルサーバーにKubernetesをインストールする方法

  2. ベアメタルクラウドとは

  3. ベアメタルクラウドリモートアクセスVPNを設定する方法

  1. ベアメタルクラウドサーバーをデプロイする方法

  2. Spark DataFrameとは何ですか?

  3. ベアメタルクラウドGitHubアクション