新しいことにはウェルカム

技術 | 電子工作 | ガジェット | ゲーム のメモ書き

Spark(Google Dataproc)からAWS S3にアクセスする方法

Spark(Google Dataproc)から、AWS S3にアクセスする方法です。

手順

Spark設定

下記のSpark・Haddopの設定をすると、SparkからAWS S3ファイルの読み書きができるようになります。

  • Sparkに下記AWS関連のjarファイルを読み込みます
    • aws-java-sdk-bundle-xxxx.jar
    • hadoop-aws-xxxx.jar
  • Hadoopの設定ファイル「core-site.xml」に下記パラメータを設定します
    • fs.s3a.access.key:AWS S3のアクセスキー
    • fs.s3a.secret.key:AWS S3のシークレット

Dataproc設定

Dataproceはマネージドサービスのため、Sparkを直接いじることができません。

代わりに、Dataproceの「クラスタープロパティ」と「初期化アクション」を使って、 クラスター作成時にSpark・Hadoopの設定します。

下記の初期化アクションを作って、Google Cloud Storageにアップします。

init_action.sh

#!/bin/bash

JAR_PATH=/usr/local/lib/jars
mkdir $JAR_PATH

# AWS S3
HADOOP_PATH=/usr/lib/hadoop-mapreduce
HADOOP_AWS=hadoop-aws-2.9.2.jar
AWS_JAVA_SDK_BUNDLE=aws-java-sdk-bundle-1.11.199.jar

ln -s $HADOOP_PATH/$HADOOP_AWS           $JAR_PATH/hadoop-aws.jar
ln -s $HADOOP_PATH/$AWS_JAVA_SDK_BUNDLE  $JAR_PAth/aws-java-sdk-bundle.jar

初期化アクションでは、Sparkに追加するjarファイルの置き場所を作って、 そこに「aws-java-sdk-bundle-xxxx.jar」と「hadoop-aws-xxxx.jar」へのシンボリックリンクを設定しています。

クラスター作成

Spark(Google Dataproc)からAWS S3にアクセスする方法

  • イメージ
    • AWS関連のjarファイルは、イメージのバージョン1.4以降から同封されるので、クラスターイメージをバージョン1.4以降にします。
  • 初期化アクション
    • 先程Google Cloud Storageにアップした初期化アクションファイルを指定します
    • クラスター作成時に、このアクションが実行されます
  • クラスタプロパティ
    • [spark]:[spark.jars]:[/usr/local/lib/jars/*]
      • 「spark」でSparkの設定「spark-defaults.conf」を設定します
      • 「spark.jars」「/usr/local/lib/jars/*」で、SparkにJDBCのjarファイルを読み込ませます
    • [core]:[fs.s3a.access.key]:[xxxx]、[core]:[fs.s3a.secret.key]:[xxxx]
      • 「core」でHadoopの設定ファイル「core-site.xml」を設定します
      • 「fs.s3a.access.key・secret.key」でAWS S3のアクセスキーとシークレットを設定します

AWSのjarファイルの名前は変わる可能性があるので、ファイルが見つからない場合は、クラスターのマスターノードにSSHログインしてファイル名を確認します。

利用例

df = spark.read.format("json").load("s3a://xxxx/xxxx/test.json")
df.show()

その他感想等

読み書き両方が可能です。

S3のパスは、「s3」ではなく「s3a」なので注意が必要です。