Windows環境にてSpark＋Pythonを試してみる


# きっかけ
米国のBigDataの担当者にBigDataを扱うならSparkでSQLとかを分散させるとええでと言われたので、ちょっと試してみようかなという気になったので試してみる。

# 検証環境
・Windows10 Home (Ver.1803)

# 環境構築
・JDK
・Spark
・Python


## JDK
入っている気がしたので、確認

```
java -version
```
<img width="399" alt="2019-08-21_10h49_35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106639/6bb6313e-4fbb-16dc-dbba-b4ebef1ec586.png">

もう入ってた。入っていない場合は要インストール。



## Python
Anacondaで入れているけど、念のため確認。

```
python --version
```
<img width="268" alt="2019-08-21_10h55_51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106639/715598f1-7400-7d30-51a2-2a10c5a9744d.png">


モジュールとしてfindsparkが必要らしいのでインストールしておく

```
python -m pip install findspark
```


## Spark
これが今回の本筋。

### ダウンロード
https://spark.apache.org/downloads.html

<img width="494" alt="2019-08-21_10h59_51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106639/a4670015-f493-ac51-c818-7363353a6107.png">


winutilsも必要になるので、ダウンロードしておく
https://github.com/steveloughran/winutils/blob/master/hadoop-2.7.1/bin/winutils.exe

### 配置
解凍して適当なところに置き、そこに対して環境変数を設定

今回は以下に配置
C:\tools\spark-2.4.3-bin-hadoop2.7
※winutils.exeはbinの中に格納

環境変数は
SPARK_HOME,HADOOP_HOME：配置したフォルダ（今回だと[C:\tools\spark-2.4.3-bin-hadoop2.7]）
PATH：[%SPARK_HOME%\bin]を追加


### 確認

```
spark-shell
```

<img width="734" alt="2019-08-21_11h44_26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106639/2777c234-b368-d7aa-2c46-6db61ef61f17.png">

使える状態になっている　（と思われる）

```
pyspark
```

<img width="734" alt="2019-08-21_12h01_58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106639/1309b0e9-5d9c-37e2-55a7-f2339a5a76b7.png">

使える状態になっている　（と思われる）


# 試してみる

Anaconda promptでpysparkを実行し以下を流してみる。

```
import pyspark # only run after findspark.init()
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()

df = spark.sql('''select 'spark' as hello ''')
df.show()
```

<img width="321" alt="2019-08-21_12h26_06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106639/961d84d7-a5b6-1a9e-bf39-4acdf3da2e4b.png">

動いているような気がする。
が、これで大量データをさばけるのか？という大事な部分がよくわからない。。。



で、もう一つサンプルを実行してみたところ、例外発生。

```
import json, os, datetime, collections
from pyspark.sql import SQLContext, Row
from pyspark.sql.types import *

csv_file = r"C:\work\20190821\click_data_sample.csv"
print(csv_file)
if not os.path.exists(csv_file):
    print("csv file not found at master node, will download and copy to HDFS")

whole_raw_log = sc.textFile("/user/hadoop/click_data_sample.csv")
header = whole_raw_log.first()
whole_log = whole_raw_log.filter(lambda x:x !=header).map(lambda line: line.split(","))\
            .map(lambda line: [datetime.datetime.strptime(line[0].replace('"', ''), '%Y-%m-%d %H:%M:%S'), int(line[1]), line[2].replace('"', '')])

whole_log.take(3)
```

上記の

> header = whole_raw_log.first()

のところで例外。

<img width="923" alt="2019-08-21_12h22_50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106639/a5312f19-c573-ac9d-22a6-143a8fdbbf29.png">


```
  File "C:\tools\spark-2.4.3-bin-hadoop2.7\python\lib\py4j-0.10.7-src.zip\py4j\protocol.py", line 328, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o31.partitions.
: org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: file:/user/hadoop/click_data_sample.csv
```

？？
file:/user/hadoop/click_data_sample.csv
はどこを指しているんだろう？？
Sparkの環境はできたとしても、もちっと仕組みを知らないと「使う」ことはできなさそうな感じがする。



# 参考
https://www.guru99.com/pyspark-tutorial.html
https://goodbyegangster.hatenablog.com/entry/2018/06/27/022915
https://knaka20blue.hatenablog.com/entry/20180812/1534035813
https://qiita.com/tomotagwork/items/1431f692387242f4a636
https://qiita.com/taka4sato/items/4ab2cf9e941599f1c0ca
https://qiita.com/miyamotok0105/items/bf3638607ef6cb95f01b