「PySpark」:  Alibaba Cloud CentOSインスタンスにPySparkを設定する

このチュートリアルでは、CentOS 7.xオペレーティングシステムが動作する**Alibaba Cloud**ECSインスタンスで**PySpark**を設定する方法をステップバイステップで説明します。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/setting-up-pyspark-on-alibaba-cloud-centos-instance_595148)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

#前提条件
始める前に、Alibaba Cloud上にPySparkノードを設定するために必要なリソースは以下の通りです。

1、アリババクラウドECSインスタンス1台
2、ElPを1本。
また、ニーズに応じて追加のものが必要になるかもしれません。例えば、追加のストレージ、SLBインスタンス、または他のコンポーネントが必要になるかもしれません。特にこのチュートリアルでは、必要最小限のリソースを使用していますが、マスターとスレーブの両方のノードとして1つのECSインスタンスとEIPです。チュートリアルで説明した技術は、様々なECSインスタンス上の複数のマスターとスレーブノードの構成に簡単に拡張できることを理解してください。

これらのリソースとは別に、以下の項目をインストールする必要があります。
1、Python
2、Java
3、スパーク
既にPythonをインストールし、クラウドリソースを取得している方は、第3節に移動できます。

#第1節：クラウドリソース

####ECSとは？
[Alibaba Cloud Elastic Computing Service（ECS）](https://www.alibabacloud.com/ja/product/ecs)とは、Alibaba Cloudが提供する弾力性のある機能を備えた仮想コンピューティング環境のことです。ECSには、CPUやメモリなどの基本的なコンピューティングコンポーネントが含まれている。ユーザーは、適切なCPUコア、メモリ、システムディスク、追加データディスク（オプション）、ネットワーク容量を備えたECSのインスタンスを、必要に応じて選択することができます（計算最適化、I/O最適化）。

####EIPとは？
[Alibaba Cloud Elastic IP Address（EIP）は、Alibaba Cloud](https://www.alibabacloud.com/ja/product/eip)が提供するインスタンスから独立したパブリックIPアドレスです。独立して購入し、該当するECS、または他のクラウドリソース（SLB、NATゲートウェイ）に関連付けることができます。

ECSがパブリックIPを持っていない場合、EIPを選択してECSにバインドすることができますが、このチュートリアルではパブリックIPはインターネットから関連するパッケージをダウンロードするためにも使用できます。

####ECSインスタンスの取得
PythonをAlibabaクラウド上にセットアップする前に、クラウドECSインスタンスを購入する必要があります。必要性に応じて、長期的なコミットメントのないPAYG（Pay as you goモード）を選択するか、サブスクリプションモードを選択して利用期間を最初にコミットして節約するかを選択することができます。

必要なメモリとCPUと十分なシステムストレージを備えたECSインスタンスを選択します。少なくとも2vCPU、4GBのメモリと30GBのウルトラクラウドシステムディスクを使用して、必要に応じて拡張することをお勧めします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/d3629d49-1770-48bf-a398-874c1a14c128.png)

####EIPの購入と提携
デフォルトではプライベート IP を取得しますが、ECS インスタンスをインターネットに接続するためには、トラフィックに応じて課金される Elastic Public IP が必要です。これは関連するパッケージを ECS インスタンスにダウンロードするために必要です。ECS でネットワーク帯域幅を取得していない場合は、EIP を購入してインスタンスにバインドする必要があります。デフォルトでは、ECS セキュリティグループはインターネットトラフィックを許可します。ECS インスタンスを保護するためには、必要なパッケージをダウンロードした後に EIP のバインドを解除するか、セキュリティグループを使用して関連するトラフィックのみを許可することで ECS を保護します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/e6508d88-e786-f41a-0004-98b39c4ab606.png)

####第2節：Pythonのインストール
**Pythonとは？**
[Python](https://www.python.org/?spm=a2c65.11461447.0.0.1e323c93lqpS9v)は強力な汎用高レベルプログラミング言語で、人間が解釈しやすく（コードの読みやすさ）、理解しやすいことで知られています。さらに、その巨大なサポートコミュニティと膨大な量のライブラリのおかげで、データサイエンティストやビッグデータ開発者、機械学習の実務家の間で人気のある選択肢となっています。統計学から深層学習まで、Pythonのライブラリを見つけることができます。

####Alibaba Cloud ECSインスタンスへのPythonのインストール
1、Alibaba Cloudコンソールを使用してECSインスタンスに接続します。
2.VNCのパスワードを入力します。

正常にログインすると、以下のような画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/be32952d-623f-2373-1ea8-76d945602a41.png)

3、ログインに成功したマシンで以下のコマンドを実行してください。これにより、Python のインストールに必要な gcc コンパイラが Linux マシンにインストールされます。

```
yum install gcc openssl-devel bzip2-devel libffi-devel
```
**注**: プロンプトにこのような長い文を書かないようにするために、上記のコマンドをコピーして、Alibaba Cloudのコンソール機能を使用してECSインスタンスに貼り付けることができます。右上に「Enter copy Commands」と呼ばれるボタンがあり、これはあなたがマシン上でコピーした文をECSインスタンスに貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/93bc6b58-a3be-134a-75ca-02d66ce6e478.png)

4、pythonをダウンロードするためには、お好きなディレクトリに移動して`wget`コマンドを実行してください。このガイドでは、pythonパッケージをダウンロードするディレクトリを`/usr/src`に変更しています。

具体的には、以下のコマンドを実行してください。

```
cd /usr/src

wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz
```
次に、tarを使ってファイルを解凍し、`tar xzf Python-3.7.2.tgz`コマンドを実行してください。

5.  5.解凍したpythonパッケージをインストールするために、pythonディレクトリに移動し、設定を行い、以下のコマンドでインストールします。

```
cd Python-3.7.2
./configure --enable-optimizations
```
設定が終わったら、`make altinstall`コマンドを実行します。このコマンドは、Pythonとその依存関係をシステムにインストールします。コマンドが正常に実行されると、下の画面のようなメッセージが表示されます。最終的なメッセージの出力は "Successfully installed "となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/ce3c7d37-3f6c-1688-6e7d-b21dce45bd42.png)

6、(オプション) `rm /usr/src/Python-3.7.2.tgz` コマンドを実行して、ダウンロードした python パッケージを削除してください。

7、python のバージョンを要求して python が正常にインストールされていることを確認してください。"python3.7 -V"コマンドを実行してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/b7b1d7b5-ab1a-8d70-bc95-dd586eab4bc8.png)

上記の例では、Python2.xとPython3.xの両方のバージョンがインストールされており、異なるコマンドで起動することができます。python "を実行するだけでPython2.xが実行され、"python3.7 "を実行するとPython3.xが実行されます。

#第3節: SparkとPySparkのインストール
####Sparkとは？
[Spark](https://spark.apache.org/?spm=a2c65.11461447.0.0.1e323c93lqpS9v)はオープンソースのクラスタコンピューティングフレームワークです。言い換えれば、弾力性のある分散データ処理エンジンです。[Hadoop](https://hadoop.apache.org/?spm=a2c65.11461447.0.0.1e323c93lqpS9v)の改良版として導入され、インメモリ処理、ストリーム処理、低レイテンシーなどの機能が追加されています。SparkはScalaで書かれていますが、Java、Python、Rなどの他の言語もサポートしています。Sparkの主な用途は、大規模データセットに対するETLやSQLの実行、ビッグデータに対するストリーミング分析や機械学習などです。Sparkの主な提供物やコンポーネントは以下の通りです。
1、**Spark SQL。SQL**: SQL構文を使用してデータを処理するためのSparkのコンポーネント。
2、**Spark Streaming**:ストリーミングデータ処理・ハンドリングのコアライブラリ。
3、**MLlib（機械学習ライブラリ）**:データのクラスタリングや予測分析を行い、基本的な機械学習アルゴリズムやデータマイニングを適用するための特定のライブラリ。
4、**GraphX**: ネットワークやグラフを扱うためのライブラリ。

####PySparkとは？
PySparkはApache SparkとPythonを組み合わせたものです。この2つのプラットフォームの連携により、Python言語のシンプルさを利用して、強力なSparkコンポーネント(セクション2で説明)と対話しながらビッグデータを処理することができます。

####Alibaba Cloud ECSインスタンスへのSpark/PySparkのインストール
1、Javaがインストールされているか確認しよう

`Java -version`コマンドを実行して、Javaがインストールされているかどうかを確認してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/d74d0ebf-a744-931e-2410-cbe78b187b5d.png)

Javaがインストールされていない場合は、Step-2の手順でSparkをセットアップするためにJavaをインストールし、それ以外の場合はStep-4に進みます。

2、以下のコマンドを実行してシステムをアップデートします。

```
sudo yum update
sudo yum install java-1.8.0-openjdk-headless
```
`y`を入力して**enter**キーを押してインストールします。

3、  `java -version`コマンドを実行して、インストールが成功したことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/6f97a09b-acf3-31ef-d213-a9452e5d2194.png)

4、`cd /opt`コマンドを実行してディレクトリを変更し、以下のコマンドを実行してsparkバイナリをダウンロードします。

```
wget https://www-eu.apache.org/dist/spark/spark-2.4.0/spark-2.4.0-bin-hadoop2.7.tgz
```
リンクが切れている場合は、以下の[Apacheのサイト](https://www.apache.org/dyn/closer.lua/spark/spark-2.4.0/?spm=a2c65.11461447.0.0.1e323c93lqpS9v)で新しいリンクが更新されていないか確認してください。

5、`tar -xzf spark-2.4.0-bin-hadoop2.7.tgz`コマンドを実行してバイナリをアンターする。

6、`cd spark-2.4.0-bin-hadoop2.7`コマンドを入力します。

7、Sparkについての基本的な設定ガイドを考えてみましょう。

これで、sparks `directory/sbin`にあるシェルとHadoopのデプロイスクリプトに基づいて、Sparkクラスタを設定する準備ができました。

- ` sbin/start-master.sh`:スクリプトが実行されるマシン上でマスターインスタンスを起動します。

- `sbin/start-slaves.sh:`conf/slaves`ファイルで指定された各マシン上でスレーブインスタンスを起動します。

- `sbin/start-slave.sh`:スクリプトが実行されるマシン上でスレーブインスタンスを起動します。

- `sbin/start-all.sh.`:上記のようにマスターと多数のスレーブの両方を起動します。

- `sbin/stop-master.sh`: sbin/start-master.sh スクリプトで起動したマスターを停止します。

- `sbin/stop-slaves.sh`:` conf/slaves`ファイルで指定されたマシン上の全てのスレーブインスタンスを停止します。

- `sbin/stop-all.sh`:上記のようにマスターとスレーブの両方を停止します。

ECSノードをマスタとして設定するには、`sbin/start-master.sh`コマンドを実行するか、以下に示すスクリプトのいずれかを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/55916cf9-1aa1-9fa6-f2f7-428deae14c08.png)

8、  ログファイルを開いて、マスターが実行しているポートを確認することができます。

```
cat /opt/spark-2.4.0-bin-hadoop2.7/logs/spark-root-org.apache.spark.deploy.master.Master-1-centos.out
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/db86938e-bc73-7249-39c0-1ab7c281e2dd.png)

マスターURLは`spark://centos:7077`です。

9、 これでスレーブノードを設定します (スレーブノードをいくつでも実行し、マスターノードに接続することができます)

スパークディレクトリ内にいながら、2番目のノードでスレーブプロセスを起動するためのものです。

```
./sbin/start-slave.sh <master-spark-URL>
```
私の場合はこうです：

```
./sbin/start-slave.sh spark://centos:7077
```
これでマスターログを開き直して、接続されているかどうかを確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/0972486f-9cf5-8dd2-ca7f-07402265e6a0.png)

10、 ワーカーが登録されました。

これでパスディレクトリを更新する時が来ました。

```
export SPARK_HOME=/opt/spark-2.4.0-bin-hadoop2.7  
export PATH=$SPARK_HOME/bin:$PATH
```
11、 では、Sparkを実行して、完璧にインストールされていることを確認してみましょう。

```
bin/pyspark
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/06fb33a2-a618-3d4f-715c-095dfc68b6b4.png)

`exit()` コマンドを入力して spark を終了させることができます。

12、 これでPythonとSparkの両方の設定が完了しました。PythonのAPIをSpark上で利用するために必要なのは`pyspark`だけです。PySparkはPyPiリポジトリからダウンロードしてインストールすることができます。

`pip install pyspark`コマンドを実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/2fb6db45-7384-4031-49f2-8196a7c9d8e9.png)

#サンプルコード
ここでは、pysparkライブラリを使用してPython APIでSparkを利用する基本的なexample.pyファイルを作成します。

`python`コマンドを入力します。

Python APIがどのようにSparkを活用しているかを確認するには、次のコマンドを一行ずつ実行します。

```
from pyspark import SparkContext
outFile = "file:///opt/spark-2.4.0-bin-hadoop2.7/logs/spark-root-org.apache.spark.deploy.master.Master-1-centos.out"  
sc = SparkContext("local", "example app")
outData = sc.textFile(outFile).cache()
numAs = logData.filter(lambda s: 'a' in s).count()
print("Lines with a: %i " % (numAs))
```

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*