2017-09-22 4 views
0

J'ai installé Hadoop-Spark sur ma machine locale. J'ai essayé de me connecter à AWS S3 et j'ai réussi à le faire. J'ai utilisé hadoop-aws-2.8.0.jar à cette fin. Cependant, j'ai essayé de me connecter à DynamoDB en utilisant EMR fourni fichier Jar emr-ddb-hadoop.jar. J'ai installé toutes les dépendances AWS et sont disponibles localement. Mais, j'ai toujours eu l'exception suivante.L'installation locale d'étincelle ne fonctionne pas comme prévu

java.lang.ClassCastException: org.apache.hadoop.dynamodb.read.DynamoDBInputFormat cannot be cast to org.apache.hadoop.mapreduce.InputFormat 

Voici mon extrait de code.

import sys 
import os 

if 'SPARK_HOME' not in os.environ: 
    os.environ['SPARK_HOME'] = "/usr/local/Cellar/spark" 
    os.environ[ 
    'PYSPARK_SUBMIT_ARGS'] = '--jars /usr/local/Cellar/hadoop/2.8.0/libexec/share/hadoop/tools/lib/emr-ddb-hadoop.jar,' \ 
          '/home/aws-java-sdk/1.11.201/lib/aws-java-sdk-1.11.201.jar pyspark-shell' 
    sys.path.append("/usr/local/Cellar/spark/python") 
    sys.path.append("/usr/local/Cellar/spark/python") 
    sys.path.append("/usr/local/Cellar/spark/python/lib/py4j-0.10.4-src.zip") 

try: 
    from pyspark.sql import SparkSession, SQLContext, Row 
    from pyspark import SparkConf, SparkContext 
    from pyspark.sql.window import Window 
    import pyspark.sql.functions as func 
    from pyspark.sql.functions import lit, lag, col, udf 
    from pyspark.sql.types import StructType, StructField, StringType, IntegerType, FloatType, DoubleType, TimestampType, LongType 
except ImportError as e: 
    print("error importing spark modules", e) 
    sys.exit(1) 

spark = SparkSession \ 
    .builder \ 
    .master("spark://xxx.local:7077") \ 
    .appName("Sample") \ 
    .getOrCreate() 
sc = spark.sparkContext 
conf = {"dynamodb.servicename": "dynamodb", \ 
    "dynamodb.input.tableName": "test-table", \ 
    "dynamodb.endpoint": "http://dynamodb.us-east-1.amazonaws.com/", \ 
    "dynamodb.regionid": "us-east-1", \ 
    "mapred.input.format.class": "org.apache.hadoop.dynamodb.read.DynamoDBInputFormat"} 
dynamo_rdd = sc.newAPIHadoopRDD('org.apache.hadoop.dynamodb.read.DynamoDBInputFormat', 
    'org.apache.hadoop.io.Text', 
    'org.apache.hadoop.dynamodb.DynamoDBItemWritable', 
    conf=conf) 
dynamo_rdd.collect() 

Répondre

0

Je n'ai pas utilisé le nouvel APIHadoopRDD. En utilisant l'ancienne API, cela fonctionne sans problèmes.

Voici l'échantillon de travail que je suivais,

https://aws.amazon.com/blogs/big-data/analyze-your-data-on-amazon-dynamodb-with-apache-spark/

+0

Essayé aussi. Vous avez la même trace d'erreur. Causé par: java.lang.ClassNotFoundException: com.amazonaws.services.dynamodbv2.model.AttributeValue – ZZzzZZzz

+0

On dirait que votre emr-ddb-hadoop.jar n'a pas ce fichier de classe. J'ai vérifié dans mon pot et il est là. – Kannaiyan

+0

Je l'ai téléchargé de maven repo. Un lien pour obtenir votre fichier jar? – ZZzzZZzz