Edited at

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


きっかけ

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


検証環境

・Windows10 Home (Ver.1803)


環境構築

・JDK

・Spark

・Python


JDK

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

java -version

2019-08-21_10h49_35.png

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


Python

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

python --version

2019-08-21_10h55_51.png

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

python -m pip install findspark


Spark

これが今回の本筋。


ダウンロード

https://spark.apache.org/downloads.html

2019-08-21_10h59_51.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

2019-08-21_11h44_26.png

使える状態になっている (と思われる)

pyspark

2019-08-21_12h01_58.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()

2019-08-21_12h26_06.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()


のところで例外。

2019-08-21_12h22_50.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