EMR intègre Spark à Object Storage Service (OSS), ce qui vous permet de lire et d'écrire des données OSS avec Spark RDD (Scala), PySpark ou Spark SQL. EMR vous permet de lire des données depuis OSS et d'y écrire sans spécifier de paire AccessKey, ou en spécifiant explicitement une paire AccessKey.
Choisir une méthode d'accès
| Méthode | Quand l'utiliser |
|---|---|
| Accès sans mot de passe (recommandé) | Votre cluster EMR prend en charge l'accès sans mot de passe à OSS. Aucune gestion d'identifiants n'est requise. |
| AccessKey explicite | Vous devez utiliser une paire AccessKey spécifique, ou votre cluster ne prend pas en charge l'accès sans mot de passe. |
Prérequis
Un cluster EMR avec Spark installé
Un accès SSH au nœud maître. Pour plus de détails, consultez Connexion au nœud maître d'un cluster
Un compartiment OSS contenant les données à lire, ou un chemin OSS accessible en écriture pour la sortie
Accéder à OSS sans spécifier de paire AccessKey
Par défaut, les clusters EMR utilisent l'accès sans mot de passe à OSS. Les exemples suivants utilisent le schéma d'URI oss:// pour lire et écrire dans OSS.
Utiliser Spark Shell (Scala)
Connectez-vous au nœud maître via SSH.
-
Démarrez Spark Shell :
spark-shell -
Exécutez le code suivant. Remplacez
<yourBucket>par le nom de votre compartiment 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)Ce code lit toutes les lignes du chemin d'entrée, les compte, ajoute un suffixe à chaque ligne et écrit le résultat dans le chemin de sortie. Pour voir l'exemple complet, consultez SparkOssDemo.scala sur GitHub.
Utiliser PySpark
Connectez-vous au nœud maître via SSH.
-
Démarrez PySpark :
pyspark -
Exécutez le code suivant. Remplacez
<yourBucket>par le nom de votre compartiment 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)Ce code lit le chemin d'entrée sous forme de DataFrame texte, affiche le nombre de lignes et écrit le résultat au format Parquet dans le chemin de sortie.
Utiliser Spark SQL
Connectez-vous au nœud maître via SSH.
-
Démarrez l'interface CLI Spark SQL :
spark-sql -
Créez une base de données stockée dans OSS, créez une table CSV et insérez une ligne :
Paramètre Description delimiterCaractère utilisé pour séparer les champs dans le fichier CSV. headerDéfinissez sur truesi la première ligne contient les noms de colonnes ; sinon, définissez surfalse.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;Remplacez
<yourBucket>par le nom de votre compartiment OSS. L'instructionSELECTrenvoie :1 ab 12 -
Pour vérifier le résultat, consultez le fichier CSV dans OSS. Le fichier utilise des points-virgules comme délimiteurs, avec la première ligne servant d'en-tête :
id;name;age 1;ab;12
Accéder à OSS en spécifiant une paire AccessKey
Utilisez cette méthode lorsque l'accès sans mot de passe n'est pas disponible, ou lorsque vous devez vous authentifier avec une paire AccessKey spécifique.
Étape 1 : Supprimer la configuration sans mot de passe
Supprimez le paramètre fs.oss.credentials.provider du fichier core-site.xml du service Hadoop-Common.
Étape 2 : Vérifier que l'accès sans mot de passe est supprimé
Exécutez la commande suivante :
hadoop fs -ls oss://<yourBucket>/test_db
Si la suppression a réussi, vous obtenez le message suivant :
ls: ERROR: not found login secrets, please configure the accessKeyId and accessKeySecret.
Étape 3 : Ajouter les paramètres AccessKey à core-site.xml
Dans le fichier core-site.xml du service Hadoop-Common, ajoutez les paramètres suivants :
| Clé | Valeur d'exemple | Description |
|---|---|---|
fs.oss.accessKeyId |
LTAI5tM85Z4sc**** |
Votre ID AccessKey |
fs.oss.accessKeySecret |
HF7P1L8PS6Eqf**** |
Votre secret AccessKey |
Étape 4 : Vérifier la configuration AccessKey
Exécutez la commande suivante :
hadoop fs -ls oss://<yourBucket>/test_db
Si la paire AccessKey est correctement configurée, la sortie liste le chemin OSS :
drwxrwxrwx - root root 0 2025-02-24 11:45 oss://<yourBucket>/test_db/student
Étape 5 : Redémarrer les services Spark
Redémarrez tous les services liés à Spark. Une fois qu'ils sont opérationnels, utilisez Spark Shell, PySpark ou Spark SQL pour lire et écrire dans OSS.
FAQ
Comment lire depuis un compartiment et écrire dans un autre lorsque leurs identifiants diffèrent ?
Configurez un fournisseur d'identifiants au niveau du compartiment en utilisant le paramètre fs.oss.bucket.<BucketName>.credentials.provider, où <BucketName> correspond au nom du compartiment que vous souhaitez configurer. Pour plus de détails, consultez Configurer un fournisseur d'identifiants pour OSS ou OSS-HDFS par compartiment.
Comment accéder à un compartiment situé dans une autre région ?
Utilisez le format oss://<BucketName>.<public endpoint of the bucket>/ pour spécifier le point de terminaison public du compartiment. L'accès interrégional engendre des frais de transfert de données et peut affecter la stabilité.
Comment utiliser les SDK Amazon S3 pour accéder à OSS ?
OSS propose des opérations API compatibles avec Amazon S3. Après avoir migré vos données d'Amazon S3 vers OSS, mettez à jour la configuration de votre client pour qu'elle pointe vers les points de terminaison OSS. Pour plus de détails, consultez Utiliser les SDK Amazon S3 pour accéder à OSS.