EMR は Spark と Object Storage Service (OSS) を統合しており、Spark RDD (Scala)、PySpark、または Spark SQL を使用して OSS データの読み取りおよび書き込みが可能です。EMR では、AccessKey ペアを指定せずに OSS にアクセスすることも、明示的に AccessKey ペアを指定してアクセスすることもできます。
アクセス方法の選択
| 方法 | 使用タイミング |
|---|---|
| パスワードなしのアクセス(推奨) | ご利用の EMR クラスターがパスワードなしの OSS アクセスをサポートしている場合。認証情報を管理する必要がありません。 |
| 明示的な AccessKey | 特定の AccessKey ペアが必要であるか、またはお使いのクラスターがパスワードなしのアクセスをサポートしていません。 |
前提条件
Spark がインストールされた EMR クラスター
マスターノードへの SSH アクセス権限。詳細については、「クラスターのマスターノードにログインする」をご参照ください。
読み取り対象のデータが格納された OSS バケット、または出力用の書き込み可能な OSS パス
AccessKey ペアを指定せずに OSS にアクセスする
EMR クラスターはデフォルトでパスワードなしの OSS アクセスを使用します。以下の例では、oss:// URI スキームを使用して OSS の読み取りおよび書き込みを行います。
Spark Shell (Scala) の使用
SSH 経由でマスターノードにログインします。
Spark Shell を起動します。
spark-shell以下のコードを実行します。
<yourBucket>は、ご利用の OSS バケット名に置き換えてください。scala> val pathIn = "oss://<yourBucket>/path/to/read" scala> val inputData = sc.textFile(pathIn) scala> val cnt = inputData.count cnt: Long = ... scala> println(s"count: $cnt") scala> val outputPath = "oss://<yourBucket>/path/to/write" scala> val outputData = inputData.map(e => s"$e has been processed.") scala> outputData.saveAsTextFile(outputPath)このコードは入力パスからすべての行を読み取り、行数をカウントし、各行にサフィックスを追加して、結果を出力パスに書き込みます。完全なサンプルについては、GitHub 上の「SparkOssDemo.scala」をご参照ください。
PySpark の使用
SSH 経由でマスターノードにログインします。
PySpark を起動します。
pyspark以下のコードを実行します。
<yourBucket>は、ご利用の OSS バケット名に置き換えてください。>>> pathIn = "oss://<yourBucket>/path/to/read" >>> df = spark.read.text(pathIn) >>> cnt = df.count() >>> print(cnt) >>> outputPath = "oss://<yourBucket>/path/to/write" >>> df.write.format("parquet").mode("overwrite").save(outputPath)このコードは入力パスをテキスト形式の DataFrame として読み取り、行数を表示し、結果を Parquet フォーマットで出力パスに書き込みます。
Spark SQL の使用
SSH 経由でマスターノードにログインします。
Spark SQL CLI を起動します。
spark-sqlOSS に保存されるデータベースを作成し、CSV テーブルを作成して行を挿入します。
パラメーター 説明 delimiterCSV ファイルでフィールドを区切る文字。 header最初の行に列名が含まれる場合は true、そうでない場合はfalseを設定します。CREATE DATABASE test_db LOCATION "oss://<yourBucket>/test_db"; USE test_db; CREATE TABLE student (id INT, name STRING, age INT) USING CSV OPTIONS ("delimiter"=";", "header"="true"); INSERT INTO student VALUES(1, "ab", 12); SELECT * FROM student;<yourBucket>は、ご利用の OSS バケット名に置き換えてください。SELECT文の実行結果は以下のようになります。1 ab 12結果を確認するには、OSS 内の CSV ファイルを確認します。ファイルはセミコロンで区切られており、最初の行がヘッダーになっています。
id;name;age 1;ab;12
AccessKey ペアを指定して OSS にアクセスする
パスワードなしのアクセスが利用できない場合や、特定の AccessKey ペアで認証する必要がある場合に、この方法を使用します。
手順 1:パスワードなしの構成を削除する
Hadoop-Common サービスの core-site.xml ファイルから fs.oss.credentials.provider パラメーターを削除します。
手順 2:パスワードなしのアクセスが削除されたことを確認する
以下のコマンドを実行します。
hadoop fs -ls oss://<yourBucket>/test_db削除に成功すると、以下が表示されます。
ls: ERROR: not found login secrets, please configure the accessKeyId and accessKeySecret.手順 3:AccessKey パラメーターを core-site.xml に追加する
Hadoop-Common サービスの core-site.xml ファイルに、以下のパラメーターを追加します。
| キー | 例となる値 | 説明 |
|---|---|---|
fs.oss.accessKeyId | LTAI5tM85Z4sc**** | ご利用の AccessKey ID |
fs.oss.accessKeySecret | HF7P1L8PS6Eqf**** | ご利用の AccessKey Secret |
手順 4:AccessKey 構成を確認する
以下のコマンドを実行します。
hadoop fs -ls oss://<yourBucket>/test_dbAccessKey ペアが正しく構成されている場合、OSS パスの一覧が表示されます。
drwxrwxrwx - root root 0 2025-02-24 11:45 oss://<yourBucket>/test_db/student手順 5:Spark サービスを再起動する
すべての Spark 関連サービスを再起動します。サービスが実行中になったら、Spark Shell、PySpark、または Spark SQL を使用して OSS の読み取りおよび書き込みを行ってください。
よくある質問
異なる認証情報を持つバケット間で読み取りと書き込みを行うにはどうすればよいですか?
fs.oss.bucket.<BucketName>.credentials.provider パラメーターを使用して、バケット単位の認証情報プロバイダーを構成します。ここで、<BucketName> は構成対象のバケット名です。詳細については、「OSS または OSS-HDFS のバケット別認証情報プロバイダーの構成」をご参照ください。
別のリージョンにあるバケットにアクセスするにはどうすればよいですか?
バケットのパブリックエンドポイントを指定するために、oss://<BucketName>.<public endpoint of the bucket>/ 形式を使用します。クロスリージョンアクセスにはデータ転送料金が発生し、安定性に影響を与える可能性があります。
Amazon S3 SDK を使用して OSS にアクセスするにはどうすればよいですか?
OSS は Amazon S3 互換の API オペレーションを提供します。Amazon S3 から OSS にデータを移行した後、クライアント構成を更新して、OSS エンドポイントを指すように設定してください。詳細については、「Amazon S3 SDK を使用して OSS にアクセスする」をご参照ください。