EC2のWindows上にpyspark+JupyterでS3上のデータ扱うための開発環境を作る

EC2(Windows)にpyspark構築してS3の情報取得するところまでやる機会があったので情報残しておきます。

環境変数設定

設定する環境変数を最初に列挙しておきます。 ソフトウェアのバージョンによって、それぞれ調整します。

環境変数
SPARK_HOME C:\spark
HADOOP_HOME C:\hadoop
JAVA_HOME C:\Program Files\Amazon Corretto\jdk1.8.0_202
Pathに追加 %HADOOP_HOME%\bin
%SPARK_HOME%\bin
%LOCALAPPDATA%\Programs\Python\Python37
%JAVA_HOME%\bin

各種ランタイムインストール

Javaのインストール

JDKをインストールします。今回はAWSだったので以下の手順でCorrettoをインストールしてみました。 https://docs.aws.amazon.com/ja_jp/corretto/latest/corretto-8-ug/windows-7-install.html

>java -version
openjdk version "1.8.0_202"
OpenJDK Runtime Environment Corretto-8.202.08.2 (build 1.8.0_202-b08)
OpenJDK 64-Bit Server VM Corretto-8.202.08.2 (build 25.202-b08, mixed mode)

Python3.7.2インストール

以下からインストーラをダウンロードします。 https://www.python.org/downloads/release/python-372/ ファイル情報: Windows x86-64 executable installer ff258093f0b3953c886192dec9f52763

>python -V
Python 3.7.2

Spark インストール

Sparkダウンロード

以下からPre Builtのパッケージファイルをダウンロードします。 https://spark.apache.org/downloads.html

7zipでgzipを解凍

Sparkのpre builtファイルはgzipで圧縮されているため、以下から7zipをダウンロードして解凍します。 https://sevenzip.osdn.jp/

C:\spark というフォルダに解凍します。

PS > mkdir C:\spark
PS > ls C:\spark\
    ディレクトリ: C:\spark
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2018/10/29      6:36                bin
d-----       2018/10/29      6:36                conf
d-----       2018/10/29      6:36                data
d-----       2018/10/29      6:36                examples
d-----       2018/10/29      6:36                jars
d-----       2018/10/29      6:36                kubernetes
d-----       2018/10/29      6:36                licenses
d-----       2018/10/29      6:36                python
d-----       2018/10/29      6:36                R
d-----       2018/10/29      6:36                sbin
d-----       2018/10/29      6:36                yarn
-a----       2018/10/29      6:36          21357 LICENSE
-a----       2018/10/29      6:36          42919 NOTICE
-a----       2018/10/29      6:36           3952 README.md
-a----       2018/10/29      6:36            156 RELEASE

hadoop-awsのインストール

Mavenリポジトリから直接jarファイルをダウンロードします。 バージョンは C:\spark\jars 配下のhadoop-xxx.jarのバージョンに合わせます。

例えば、Sparkの2.4.0なら hadoop-common-2.7.3.jar なので、以下のファイルをダウンロードします。

https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-aws/2.7.3

hadoo-aws-2.7.3の依存に合わせて以下をダウンロードします。 https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk/1.7.4

Filesの部分のjarの青文字をクリックしてダウンロードします。 f:id:yomon8:20190317223316p:plain

ダウンロードしたjarをC:\spark\jars に配置します。 f:id:yomon8:20190317223632p:plain

Hadoop Native Libralyインストール

pysparkを利用するために以下をダウンロードします。

https://github.com/steveloughran/winutils/releases

C:\hadoop\bin のフォルダに配置します。 f:id:yomon8:20190317223708p:plain

pysparkの起動確認

pyspark利用の準備ができたので、起動確認しておきます。

コマンドプロンプトから起動

コマンドプロンプトから pyspark が起動できることを確認する。

>pyspark
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 2.4.0
      /_/

Using Python version 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018 23:09:28)
SparkSession available as 'spark'.
>>> sc.version
'2.4.0'

Jupyter Notebookからpysparkを利用したい場合

mkdir workspace
cd workspace
python -m venv venv
.\venv\Scripts\activate
(venv) pip install jupyter

PYSPARK_DRIVER_PYTHONPYSPARK_DRIVER_PYTHON_OPTS環境変数を設定後pysparkを起動するとJupyter notebookでpysparkが起動します。

(venv) set PYSPARK_DRIVER_PYTHON=jupyter
(venv) set PYSPARK_DRIVER_PYTHON_OPTS=notebook
(venv) pyspark

S3情報取得テスト

以下にIAMロールでS3を利用する場合の例を書いています。細かいオプションはこちらにまとまっています。

from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('app').getOrCreate()

spark.sparkContext._jsc.hadoopConfiguration().set("fs.s3a.aws.credentials.provider","com.amazonaws.auth.InstanceProfileCredentialsProvider")

s3objs = 's3a://your-bucket/path/to/objects/'
df = spark.read.json(s3objs)