web-dev-qa-db-fra.com

Comment spécifier l'ID de clé d'accès AWS et la clé d'accès secrète dans le cadre d'une URL Amazon s3n

Je passe les dossiers d’entrée et de sortie en tant que paramètres pour mapréduire le programme de comptage de mots de la page Web. 

Obtenir en dessous de l'erreur:

État HTTP 500 - Le traitement de la demande a échoué. exception imbriquée est Java.lang.IllegalArgumentException: ID de clé d'accès AWS et secret La clé d'accès doit être spécifiée en tant que nom d'utilisateur ou mot de passe (respectivement) d'une URL s3n, ou en définissant le fs.s3n.awsAccessKeyId ou des propriétés fs.s3n.awsSecretAccessKey (respectivement).

23
user3795951

La documentation a le format: http://wiki.Apache.org/hadoop/AmazonS3

 s3n://ID:SECRET@BUCKET/Path
37
RickH

Je vous suggère d'utiliser ceci:

hadoop distcp \
-Dfs.s3n.awsAccessKeyId=<your_access_id> \ 
-Dfs.s3n.awsSecretAccessKey=<your_access_key> \
s3n://Origin hdfs://destinations

Cela fonctionne également comme solution de contournement pour l'apparition de barres obliques dans la clé . Les paramètres avec l'id et la clé d'accès doivent être fournis exactement dans cet ordre: après disctcp et avant Origin

8
Ricardo Teixeira

La transmission des informations d'identification AWS dans l'URL Amazon s3n n'est généralement pas recommandée, du point de vue de la sécurité. Surtout si ce code est poussé vers un service de stockage de référentiel (comme github). Définissez idéalement vos informations d'identification dans le fichier conf/core-site.xml comme suit:

<configuration>
  <property>
    <name>fs.s3n.awsAccessKeyId</name>
    <value>XXXXXX</value>
  </property>

  <property>
    <name>fs.s3n.awsSecretAccessKey</name>
    <value>XXXXXX</value>
  </property>
</configuration>

ou réinstallez awscli sur votre ordinateur.

pip install awscli
7
dyltini

Pour pyspark débutant: 

Préparer

Téléchargez le fichier depuis https://mvnrepository.com/artifact/org.Apache.hadoop/hadoop-aws
, mettez ceci dans le dossier Spark Jars

Ensuite vous pouvez

1. Fichier de configuration Hadoop

core-site.xml

export AWS_ACCESS_KEY_ID=<access-key>
export AWS_SECRET_ACCESS_KEY=<secret-key>

<configuration>
  <property>
    <name>fs.s3n.impl</name>
    <value>org.Apache.hadoop.fs.s3native.NativeS3FileSystem</value>
  </property>

  <property>
    <name>fs.s3a.impl</name>
    <value>org.Apache.hadoop.fs.s3a.S3AFileSystem</value>
  </property>

  <property>
    <name>fs.s3.impl</name>
    <value>org.Apache.hadoop.fs.s3.S3FileSystem</value>
  </property>
</configuration>

2. pyspark config

sc._jsc.hadoopConfiguration().set("fs.s3.awsAccessKeyId", access_key)
sc._jsc.hadoopConfiguration().set("fs.s3n.awsAccessKeyId", access_key)
sc._jsc.hadoopConfiguration().set("fs.s3a.access.key", access_key)
sc._jsc.hadoopConfiguration().set("fs.s3.awsSecretAccessKey", secret_key)
sc._jsc.hadoopConfiguration().set("fs.s3n.awsSecretAccessKey", secret_key)
sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", secret_key)
sc._jsc.hadoopConfiguration().set("fs.s3n.impl", "org.Apache.hadoop.fs.s3native.NativeS3FileSystem")
sc._jsc.hadoopConfiguration().set("fs.s3a.impl", "org.Apache.hadoop.fs.s3a.S3AFileSystem")
sc._jsc.hadoopConfiguration().set("fs.s3.impl", "org.Apache.hadoop.fs.s3.S3FileSystem")

Exemple

import sys
from random import random
from operator import add

from pyspark.sql import SparkSession
from pyspark.conf import SparkConf


if __== "__main__":
    """
        Usage: S3 sample
    """
    access_key = '<access-key>'
    secret_key = '<secret-key>'

    spark = SparkSession\
        .builder\
        .appName("Demo")\
        .getOrCreate()

    sc = spark.sparkContext

    # remove this block if use core-site.xml and env variable
    sc._jsc.hadoopConfiguration().set("fs.s3.awsAccessKeyId", access_key)
    sc._jsc.hadoopConfiguration().set("fs.s3n.awsAccessKeyId", access_key)
    sc._jsc.hadoopConfiguration().set("fs.s3a.access.key", access_key)
    sc._jsc.hadoopConfiguration().set("fs.s3.awsSecretAccessKey", secret_key)
    sc._jsc.hadoopConfiguration().set("fs.s3n.awsSecretAccessKey", secret_key)
    sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", secret_key)
    sc._jsc.hadoopConfiguration().set("fs.s3n.impl", "org.Apache.hadoop.fs.s3native.NativeS3FileSystem")
    sc._jsc.hadoopConfiguration().set("fs.s3a.impl", "org.Apache.hadoop.fs.s3a.S3AFileSystem")
    sc._jsc.hadoopConfiguration().set("fs.s3.impl", "org.Apache.hadoop.fs.s3.S3FileSystem")

    # fetch from s3, returns RDD
    csv_rdd = spark.sparkContext.textFile("s3n://<bucket-name>/path/to/file.csv")
    c = csv_rdd.count()
    print("~~~~~~~~~~~~~~~~~~~~~count~~~~~~~~~~~~~~~~~~~~~")
    print(c)

    spark.stop()
0
Mithril