AWS EC2×Python3×Spark×VSCodeで勉強用の分析環境を構築する

# 概要
- リモート接続できるサーバー上にSparkの勉強用環境が欲しかった。 
- EC2上でPyspark(Python3)を実行できるようにする。
- 接続はVSCodeから行って快適な環境にする。

# なぜやるのか
1. 仕事でSparkを触ることになったので、勉強がしたかった。
2. どうせならどこからでも接続できるサーバー上に構築しよう。※勉強用なのでスペックは気にしない。
3. 家のPCをサーバーにするのは~~うるさい~~気が引けた。
4. そうだEC2で作ろう！EMRは無料枠ないので使わない。
5. そしてVSCodeからSSH接続して快適にしよう！

# 環境
- ローカル
    - Windows10 home 
    - Visual Studio Code 1.37.0

- サーバー
    - AWS EC2(無料枠 : t2.micro vCPU 1コア メモリ 1G)
    - AmazonLinux2
    - Python3
    - spark-2.4.3-bin-hadoop2.7 

# 実際にやってみた
### AWSの登録～EC2インスタンスの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354154/36ad441c-7e19-7ec4-c39e-59a0467fa29a.png)
https://booth.pm/ja/items/1032590

去年技術書典で買った超有名同人誌（1500円）を参考にブラウザからAWSアカウントの作成～EC2インスタンスの作成まで行う。

ここの作業は同人誌読まなくても、AWSのチュートリアルから十分できると思う。
しかし、体系的にとても分かりやすくまとまっているので上記同人誌も非常におすすめ。

以下変更点、注意点
書籍内では、AmazonLinuxでインスタンスを作成しているが、せっかくなので新しい方のAmazonLinux2を選択。
**.pemファイル（キーペア、秘密鍵）を後で使うので必ずダウンロードしておく。**
Elastic IPの設定も行っておくと後がめんどくさくない。
書籍中でRloginを使ってSSH接続するところは無視します。VSCodeでやります。

### VScodeからSSH接続
ここから上記書籍とは違うやり方。

VSCodeからのSSH接続がかなり快適という噂を聞いたので、調べてみた。
https://qiita.com/HoriThe3rd/items/b2f6c440f096106cf89e

どうやら拡張機能のRemote Developmentがとても簡単で使いやすいみたい。
上記URLを参考に進めるとすんなり出来ました。
WinSCPを使わなくてもファイルの転送が出来る！すごい！

一つ注意点。
.pemファイルは適当なところ（Cドライブ直下とかEドライブとか）に置いて使おうとするとエラーになる。
　C:/Users/ユーザー名/.ssh/
とかに置くと解決できる。セキュリティの問題みたい？

### AmazonLinux2初期設定
接続したEC2インスタンス上でターミナルから初期設定を行う。
こちらは以下のサイトを参考に。

https://qiita.com/2no553/items/e87485e3fc4199bd5dcb
このページの初期設定～を参考に作業。
すんなり完了。

以下のコマンドを入力して再起動して設定を反映させる。
Elastic IPの設定をしておかないとIPアドレスが変わって接続出来なくなるので注意。

```bash
$ sudo reboot
```

### Python3のインストール
AmazonLinux2にはPython2が入っているが3系を使いたいのでインストール。
今回はpyenvでanacondaをインストールします。

まずはgitをインストール。

```bash
$ sudo yum install git -y
```

続いてpyenvをgitからクローンする。

```bash
$ sudo git clone https://github.com/yyuu/pyenv.git ~/.pyenv
```

以下を実行してpyenvを環境変数に追加。

```bash
$ export PYENV_ROOT="$HOME/.pyenv"
$ export PATH="$PYENV_ROOT/bin:$PATH"
```

続いてanacondaの最新バージョンをインストール。
インストールが終わったらpyenvで今のPython2からanacondaに切り替え。
Pythonのバージョンが3系になっていたらOK。

```bash
$ pyenv install anaconda3-5.3.1
$ pyenv global anaconda3-5.3.1
$ python --version
```

最後に以下のコマンドを実行して、インタラクティブシェル上で自動補完機能を使えるようにする。

```bash
$ eval "$(pyenv init -)"
```

参考は以下2つでした。
https://qiita.com/tisk_jdb/items/01bd6ef9209acc3a275f
https://qiita.com/andromeda/items/2e5a89a89cecb11b29f2

### Sparkのインストール
最後にSparkのインストール。

https://qiita.com/oic0310/items/d708639b9fe4d92b6d79
こちらを参考に、最新のSparkをインストール。
バージョンはかなり変わってるけど、やり方は今でも一緒。

これで無事にSparkのインストールが完了。

```
$ spark-shell --version
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.4.3
      /_/
                        
Using Scala version 2.11.12, OpenJDK 64-Bit Server VM, 1.8.0_222
Branch 
Compiled by user  on 2019-05-01T05:08:38Z
Revision 
Url 
Type --help for more information.
```

実行するときは以下のコマンドでOK。
python3インタラクティブシェルが起動してSparkが使えます。

```
$pyspark --master local[*]

Python 3.7.0 (default, Jun 28 2018, 13:15:42) 
[GCC 7.2.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
19/08/31 23:55:41 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 2.4.3
      /_/

Using Python version 3.7.0 (default, Jun 28 2018 13:15:42)
SparkSession available as 'spark'.
>>> 
```

# まとめ
- VSCodeからSSH接続して、EC2インスタンス上でSparkを使えるようになりました。
- これでどこからでもSparkの勉強ができる。
- VSCodeの拡張機能とかいろいろ入れるとより快適になると思います（ローカルではなくサーバー上に導入する。使えるのと使えないのがあるので注意）。