2017-02-07 2 views
0

J'essaie d'ajouter S3DistCp à mon installation Spark locale et autonome. J'ai téléchargé S3DistCp:Ajout de S3DistCp à PySpark

aws s3 cp s3://elasticmapreduce/libs/s3distcp/1.latest/s3distcp.jar . 

Et le AWS SDK ainsi:

wget http://sdk-for-java.amazonwebservices.com/latest/aws-java-sdk.zip 

J'extrait le AWS SDK:

unzip aws-java-sdk.zip 

ensuite ajouté s3distcp.jar à mon spark-defaults.conf:

spark.driver.extraClassPath /Users/mark.miller/.ivy2/jars/s3distcp.jar 
spark.executor.extraClassPath /Users/mark.miller/.ivy2/jars/s3distcp.jar 

Ensuite, j'ai ajouté le SDK AWS et toutes ses dépendances à $ LIBJARS et HADOOP_CLASSPATH $

export $LIBJARS=/Users/mark.miller/Downloads/aws-java-sdk-1.11.86/lib/aws-java-sdk-1.11.86.jar,/Users/mark.miller/Downloads/aws-java-sdk-1.11.86/third-party/lib/aspectjrt-1.8.2.jar,/Users/mark.miller/Downloads/aws-java-sdk-1.11.86/third-party/lib/aspectjweaver.jar,/Users/mark.miller/Downloads/aws-java-sdk-1.11.86/third-party/lib/commons-codec-1.9.jar,/Users/mark.miller/Downloads/aws-java-sdk-1.11.86/third-party/lib/commons-logging-1.1.3.jar,/Users/mark.miller/Downloads/aws-java-sdk-1.11.86/third-party/lib/freemarker-2.3.9.jar,/Users/mark.miller/Downloads/aws-java-sdk-1.11.86/third-party/lib/httpclient-4.5.2.jar,/Users/mark.miller/Downloads/aws-java-sdk-1.11.86/third-party/lib/httpcore-4.4.4.jar,/Users/mark.miller/Downloads/aws-java-sdk-1.11.86/third-party/lib/ion-java-1.0.1.jar,/Users/mark.miller/Downloads/aws-java-sdk-1.11.86/third-party/lib/jackson-annotations-2.6.0.jar,/Users/mark.miller/Downloads/aws-java-sdk-1.11.86/third-party/lib/jackson-core-2.6.6.jar,/Users/mark.miller/Downloads/aws-java-sdk-1.11.86/third-party/lib/jackson-databind-2.6.6.jar,/Users/mark.miller/Downloads/aws-java-sdk-1.11.86/third-party/lib/jackson-dataformat-cbor-2.6.6.jar,/Users/mark.miller/Downloads/aws-java-sdk-1.11.86/third-party/lib/javax.mail-api-1.4.6.jar,/Users/mark.miller/Downloads/aws-java-sdk-1.11.86/third-party/lib/jmespath-java-1.11.86.jar,/Users/mark.miller/Downloads/aws-java-sdk-1.11.86/third-party/lib/joda-time-2.8.1.jar,/Users/mark.miller/Downloads/aws-java-sdk-1.11.86/third-party/lib/json-path-2.2.0.jar,/Users/mark.miller/Downloads/aws-java-sdk-1.11.86/third-party/lib/slf4j-api-1.7.16.jar,/Users/mark.miller/Downloads/aws-java-sdk-1.11.86/third-party/lib/spring-beans-3.0.7.RELEASE.jar,/Users/mark.miller/Downloads/aws-java-sdk-1.11.86/third-party/lib/spring-context-3.0.7.RELEASE.jar,/Users/mark.miller/Downloads/aws-java-sdk-1.11.86/third-party/lib/spring-core-3.0.7.RELEASE.jar,/Users/mark.miller/Downloads/aws-java-sdk-1.11.86/third-party/lib/spring-test-3.0.7.RELEASE.jar 
export HADOOP_CLASSPATH=$LIBJARS 

Mais lorsque je tente de démarrer le shell pyspark:

$ pyspark 

Je reçois l'erreur suivante:

Python 2.7.13 (default, Dec 18 2016, 07:03:39) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties 
Setting default log level to "WARN". 
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel). 
17/02/06 17:48:50 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 
17/02/06 17:48:50 WARN SparkContext: Another SparkContext is being constructed (or threw an exception in its constructor). This may indicate an error, since only one SparkContext may be running in this JVM (see SPARK-2243). The other SparkContext was created at: 
org.apache.spark.api.java.JavaSparkContext.<init>(JavaSparkContext.scala:58) 
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:247) 
py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357) 
py4j.Gateway.invoke(Gateway.java:236) 
py4j.commands.ConstructorCommand.invokeConstructor(ConstructorCommand.java:80) 
py4j.commands.ConstructorCommand.execute(ConstructorCommand.java:69) 
py4j.GatewayConnection.run(GatewayConnection.java:214) 
java.lang.Thread.run(Thread.java:745) 
Traceback (most recent call last): 
    File "/usr/local/Cellar/apache-spark/2.1.0/libexec/python/pyspark/shell.py", line 47, in <module> 
    spark = SparkSession.builder.getOrCreate() 
    File "/usr/local/Cellar/apache-spark/2.1.0/libexec/python/pyspark/sql/session.py", line 169, in getOrCreate 
    sc = SparkContext.getOrCreate(sparkConf) 
    File "/usr/local/Cellar/apache-spark/2.1.0/libexec/python/pyspark/context.py", line 307, in getOrCreate 
    SparkContext(conf=conf or SparkConf()) 
    File "/usr/local/Cellar/apache-spark/2.1.0/libexec/python/pyspark/context.py", line 118, in __init__ 
    conf, jsc, profiler_cls) 
    File "/usr/local/Cellar/apache-spark/2.1.0/libexec/python/pyspark/context.py", line 179, in _do_init 
    self._jsc = jsc or self._initialize_context(self._conf._jconf) 
    File "/usr/local/Cellar/apache-spark/2.1.0/libexec/python/pyspark/context.py", line 246, in _initialize_context 
    return self._jvm.JavaSparkContext(jconf) 
    File "/usr/local/Cellar/apache-spark/2.1.0/libexec/python/lib/py4j-0.10.4-src.zip/py4j/java_gateway.py", line 1401, in __call__ 
    File "/usr/local/Cellar/apache-spark/2.1.0/libexec/python/lib/py4j-0.10.4-src.zip/py4j/protocol.py", line 319, in get_return_value 
py4j.protocol.Py4JJavaError: An error occurred while calling None.org.apache.spark.api.java.JavaSparkContext. 
: java.lang.NoClassDefFoundError: Could not initialize class com.google.common.cache.LocalCache 
     at com.google.common.cache.LocalCache$LocalLoadingCache.<init>(LocalCache.java:4867) 
     at com.google.common.cache.CacheBuilder.build(CacheBuilder.java:785) 
     at org.apache.hadoop.security.Groups.<init>(Groups.java:101) 
     at org.apache.hadoop.security.Groups.<init>(Groups.java:74) 
     at org.apache.hadoop.security.Groups.getUserToGroupsMappingService(Groups.java:303) 
     at org.apache.hadoop.security.UserGroupInformation.initialize(UserGroupInformation.java:284) 
     at org.apache.hadoop.security.UserGroupInformation.ensureInitialized(UserGroupInformation.java:261) 
     at org.apache.hadoop.security.UserGroupInformation.loginUserFromSubject(UserGroupInformation.java:791) 
     at org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:761) 
     at org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:634) 
     at org.apache.spark.util.Utils$$anonfun$getCurrentUserName$1.apply(Utils.scala:2373) 
     at org.apache.spark.util.Utils$$anonfun$getCurrentUserName$1.apply(Utils.scala:2373) 
     at scala.Option.getOrElse(Option.scala:121) 
     at org.apache.spark.util.Utils$.getCurrentUserName(Utils.scala:2373) 
     at org.apache.spark.SparkContext.<init>(SparkContext.scala:295) 
     at org.apache.spark.api.java.JavaSparkContext.<init>(JavaSparkContext.scala:58) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
     at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:247) 
     at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357) 
     at py4j.Gateway.invoke(Gateway.java:236) 
     at py4j.commands.ConstructorCommand.invokeConstructor(ConstructorCommand.java:80) 
     at py4j.commands.ConstructorCommand.execute(ConstructorCommand.java:69) 
     at py4j.GatewayConnection.run(GatewayConnection.java:214) 
     at java.lang.Thread.run(Thread.java:745) 

Si je supprime s3distcp.jar de spark-defaults.conf l'erreur disparaît. Il ne semble pas y avoir beaucoup de documentation sur la façon de déployer ceci puisqu'elle est fournie dans le cadre du DME.

+0

Si je peux demander, pourquoi yo Vous avez besoin d'ajouter le fichier s3distcp dans votre application? Vous pouvez faire la même chose avec une étincelle régulière. – eliasah

+0

J'utilise AWS EMR comme une plateforme et je suis préoccupé par la taille de la partition des fichiers en cours d'écriture sur S3 (problème de petits fichiers). Ma compréhension est que de nombreux petits fichiers causent des problèmes de performance. Je veux combiner les paramètres '--groupBy' et' --targetSize' pour m'assurer que nous n'avons pas un grand nombre de petits fichiers. J'essaye cette route après avoir trouvé des recommandations que c'est le moyen optimal de transférer des fichiers entre les clusters EMR et S3. Certes, je suis un noob, alors s'il vous plaît instruisez-moi. –

+0

Vous savez que s3distcp repose sur hadoop MR sous le capot de sorte que le petit problème de fichier persistera si vous chargez des données avec spark ou s3distcp et vous pouvez toujours utiliser s3distcp avant l'application étincelle. De cette façon, vous pouvez copier les données à EMR que vous devez mettre sur HDFS – eliasah

Répondre

0

j'ai pu obtenir ce travail en passant --driver-class-path-pyspark:

$ pyspark \ 
--driver-class-path \ 
~/Downloads/aws-java-sdk-1.11.86/lib/aws-java-sdk-1.11.86.jar:\ 
~/Downloads/aws-java-sdk-1.11.86/third-party/lib/* 

Pour configurer cela dans spark-defaults.conf je devais le faire de cette façon:

spark.jars /Users/mark.miller/.ivy2/jars/s3distcp.jar 
spark.driver.extraClassPath /Users/mark.miller/Downloads/aws-java-sdk-1.11.86/lib/aws-java-sdk-1.11.86.jar:/Users/mark.miller/Downloads/aws-java-sdk-1.11.86/third-party/lib/* 

J'ai aussi appris que spark.executor.extraClassPath est seulement nécessaire pour rétrocompatibilité avec les anciennes versions d'étincelles (https://spark.apache.org/docs/latest/configuration.html#runtime-environment)