MacにSparkをセットアップしてS3上のファイルにアクセスするまで
SparkからS3上のファイルを読み込んでみたので、その手順を残しておきます。
具体的には、
Mac上でローカルモードでspark-shellを動かして、
AWSのS3上のファイルを読み込んでみました。
以下のバージョンで実施した手順です。
Spark 1.5.2
Pre-build for Hadoop 2.6 or later
大きく以下の3つの流れになります。
- Sparkの導入
- spark-shellからS3上のファイルへのアクセス
- sparkRからS3上のファイルへのアクセス
Sparkの導入
ApacheSparkのサイトから以下のファイルをダウンロードします。
※JDKはセットアップ済みの前提です。
Apache Spark
http://spark.apache.org/
対象ファイル:
spark-1.5.2-bin-hadoop2.6.tgz
以下のとおり、/opt
配下に展開します。
$ cd /opt
$ sudo tar xf ~/Download/spark-1.5.2-bin-hadoop2.6.tgz
以下のように、環境変数にSPARK_HOME
を指定します。
$ echo "export SPARK_HOME=/opt/spark-1.5.2-bin-hadoop2.6" >> ~/.bash_profile
$ source ~/.bash_profile
以下のようにspark-shellを起動して、バージョンが表示されればOK。
$ $SPARK_HOME/bin/spark-shell --version
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 1.5.2
/_/
Type --help for more information.
spark-shellからS3上のファイルにアクセス
spark-shellからS3上のファイルにアクセスする場合は、 次の2点が必要になります。
- spark-shell起動時のawsライブラリの読み込み
- AWSの認証情報の指定
認証情報をコードで指定するパターンと、
ファイルで指定するパターンの2つの手順を記載します。
認証情報をコード上で指定
以下のようにawsのパッケージを指定してspark-shellを起動します。
起動時には、たくさんメッセージが出てきます。scala>
というプロンプトが出てくるまで待ちます。
$ $SPARK_HOME/bin/spark-shell --packages com.amazonaws:aws-java-sdk-pom:1.10.34,org.apache.hadoop:hadoop-aws:2.6.0
以下のように入力して、AWSの認証情報を設定します。
> val hadoopConf = sc.hadoopConfiguration
> hadoopConf.set("fs.s3a.access.key", "※AWSアクセスキー※")
> hadoopConf.set("fs.s3a.secret.key", "※AWSシークレットキー※")
以下のようにして、S3上のファイルを読み込み処理します。
※以下の例は、S3上にある何かのログファイルから「ERROR」を含む行数を数えるという想定です。
> val logFile = sc.textFile("s3a://※バケット名※/※パス※")
> logFile.filter(line => line.contains("ERROR")).count()
認証情報をファイルで指定
ファイル名~/hadoop/etc/hadoop/yarn-site.xml
で、AWSの認証情報を記載した設定ファイルを作成します。
~/hadoop/etc/hadoop/yarn-site.xml
<?xml version="1.0"?>
<configuration>
<property>
<name>fs.s3a.impl</name>
<value>org.apache.hadoop.fs.s3a.S3AFileSystem</value>
</property>
<property>
<name>fs.s3a.access.key</name>
<value>※AWSアクセスキー※</value>
</property>
<property>
<name>fs.s3a.secret.key</name>
<value>※AWSシークレットキー※</value>
</property>
</configuration>
以下のようにawsのパッケージ、先ほどの作成した設定ファイルのパスを指定してspark-shellを起動します。
$ HADOOP_CONF_DIR=~/hadoop/etc/hadoop $SPARK_HOME/bin/spark-shell --packages com.amazonaws:aws-java-sdk-pom:1.10.34,org.apache.hadoop:hadoop-aws:2.6.0
以下のようにして、S3上のファイルを読み込み処理します。
> val logFile = sc.textFile("s3a://※バケット名※/※パス※")
> logFile.filter(line => line.contains("ERROR")).count()
SparkRからS3上のファイルにアクセス
以下のコマンドでSparkRを起動します。
※前項の「認証情報をファイルで指定」の通り、yarn-site.xml
に、AWSの認証情報を設定済みの前提です。
HADOOP_CONF_DIR=~/hadoop/etc/hadoop $SPARK_HOME/bin/sparkR --packages com.amazonaws:aws-java-sdk-pom:1.10.34,org.apache.hadoop:hadoop-aws:2.6.0
以下のようにして、S3上のファイルを読み込むことができます。
jsonData <- read.df(sqlContext, "s3a://※バケット名※/※パス※", "json")
head(jsonData)
読み込んだデータの扱い方は、以下のドキュメントで。
http://spark.apache.org/docs/latest/sparkr.html