将S3DistCp添加到PySpark

时间:2017-02-07 17:14:56

标签: apache-spark pyspark s3distcp

我正在尝试将S3DistCp添加到我的本地独立Spark安装中。我已经下载了S3DistCp:




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




以及AWS SDK:




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




我解压缩了AWS SDK:




  unzip aws-java-sdk.zip
  




然后添加 s3distcp.jar 到我的 spark-defaults.conf




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


然后我将AWS SDK及其所有依赖项添加到$ LIBJARS和$ HADOOP_CLASSPATH




  export $ LIBJARS = / Users / mark .miller /下载/ AWS-java的SDK-86年1月11日/ LIB / AWS-java的SDK-1.11.86.jar,/用户/ mark.miller /下载/ AWS-java的SDK-86年1月11日/三阶党的/ lib目录/ aspectjrt-1.8.2.jar,/用户/ mark.miller /下载/ AWS-Java的SDK-86年1月11日/第三方/ lib目录/ aspectjweaver.jar,/用户/ mark.miller /下载/ AWS-Java的SDK-86年1月11日/第三方/李B /公地编解码器1.9.jar,/用户/ mark.miller /下载/ AWS-Java的SDK-86年1月11日/第三方/ lib目录/共享记录-1.1.3.jar,/用户/标记。米勒/下载/ AWS-Java的SDK-86年1月11日/第三方/ lib目录/ freemarker的-2.3.9.jar,/用户/ mark.miller /下载/ AWS-Java的SDK-86年1月11日/第三方/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-党的/ lib目录/杰克逊的注解-2.6.0.jar,/用户/ mark.miller /下载/ AWS-Java的SDK-86年1月11日/第三方/ lib目录/杰克逊核心-2.6.6.jar,/用户/ mark.miller /下载/ AWS-Java的SDK-86年1月11日/第三方/ lib目录/杰克逊-数据绑定-2.6.6.jar,/用户/ mark.miller /下载/ AWS-Java的SDK-1.11 0.86 /第三方/ lib目录/杰克逊DATAFORMAT-CBOR-2.6.6.jar,/用户/ mark.miller /下载/ AWS-Java的SDK-86年1月11日/第三方/ lib目录/ javax.mail- API-1.4.6.jar,/用户/ mark.miller /下载/ AWS-Java的SDK-86年1月11日/第三方/ lib目录/ jmesp ATH-Java的1.11.86.jar,/用户/ mark.miller /下载/ AWS-Java的SDK-86年1月11日/第三方/ lib目录/乔达时间-2.8.1.jar,/用户/标记。米勒/下载/ AWS-Java的SDK-86年1月11日/第三方/ lib目录/ JSON-路径2.2.0.jar,/用户/ mark.miller /下载/ AWS-Java的SDK-86年1月11日/第三三方/ lib目录/ SLF4J-API 1.7.16.jar,/用户/ mark.miller /下载/ AWS-Java的SDK-86年1月11日/第三方/ lib目录/弹簧豆-3.0.7.RELEASE。罐子,/用户/ mark.miller /下载/ AWS-java的SDK-86年1月11日/第三方/ LIB /弹簧上下文3.0.7.RELEASE.jar,/用户/ mark.miller /下载/ aws- Java的SDK-86年1月11日/第三方/ lib目录/弹簧芯3.0.7.RELEASE.jar,/用户/ mark.miller /下载/ AWS-Java的SDK-86年1月11日/第三方/ lib目录/spring-test-3.0.7.RELEASE.jar
export HADOOP_CLASSPATH = $ LIBJARS
  




但是当我尝试启动pyspark时shell:




  $ pyspark
  




我收到以下错误:




  Python 2.7.13(默认,2016年12月18日,07:03:39)
 [GCC 4.2.1兼容的Apple LLVM 8.0.0 (铛 -  800.0.42.1 )]关于darwin
输入“help”,“copyright”,“credits”或“license”以获取更多信息。
使用Spark的默认log4j配置文件:org / apache / spark / log4j-defaults.properties&#xA ;将默认日志级别设置为“WARN”。
要调整日志记录级别,请使用sc.setLogLevel(newLevel)。对于SparkR,使用setLogLevel(newLevel)。
 17/02/06 17:48:50 WARN NativeCodeLoader:无法为您的平台加载native-hadoop库...使用内置的java类(如果适用)
 17 / 02/06 17:48:50 WARN SparkContext:正在构造另一个SparkContext(或在其构造函数中抛出异常)。这可能表示错误,因为在此JVM中只能运行一个SparkContext(请参阅SPARK-2243)。另一个SparkContext创建于:
 org.apache.spark.api.java.JavaSparkContext。< init>(JavaSparkContext.scala:58)
 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)& #xA; sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
 java.lang.reflect.Constructor.newInstance(构造的.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(最近一次调用最后一次):
文件“/usr/local/Cellar/apache-spark/2.1.0/libexec/python/pyspark/shell.py”,第47行,< module>
 spark = SparkSession.builder.getOrCreate()
在getOrCreate
中输入文件“/usr/local/Cellar/apache-spark/2.1.0/libexec/python/pyspark/sql/session.py”,第169行。 sc = SparkContext.getOrCreate(sparkConf)
在getOrCreate
中输入文件“/usr/local/Cellar/apache-spark/2.1.0/libexec/python/pyspark/context.py”,第307行; SparkContext(conf = conf或SparkConf())
文件“/usr/local/Cellar/apache-spark/2.1.0/libexec/python/pyspark/context.py”,第118行,在__init __
 conf,jsc,profiler_cls)
文件“/usr/local/Cellar/apache-spark/2.1.0/libexec/python/pyspark/context.py”,第179行,在_do_init
 self._jsc = jsc或self._initialize_context(self._conf._jconf)
在_initialize_context
中输入文件“/usr/local/Cellar/apache-spark/2.1.0/libexec/python/pyspark/context.py”,第246行。 return self._jvm.JavaSparkContext(jconf)
文件“/usr/local/Cellar/apache-spark/2.1.0/libexec/python/lib/py4j-0.10.4-src.zip/py4j/java_gateway.py”,第1401行,在__call __
在get_return_value
 py4j中输入文件“/usr/local/Cellar/apache-spark/2.1.0/libexec/python/lib/py4j-0.10.4-src.zip/py4j/protocol.py”,第319行。 protocol.Py4JJavaError:调用None.org.apache.spark.api.java.JavaSparkContext时发生错误。
:java.lang.NoClassDefFoundError:无法初始化类com.google.common.cache.LocalCache
在com.google.common.cache.LocalCache $ LocalLoadingCache。< init>(LocalCache.java:4867)
在com.google.common.cache.CacheBuilder.build(CacheBuilder.java:785)
在org.apache.hadoop.security.Groups。< init>(Groups.java:101)
在org.apache.hadoop.security.Groups。< init>(Groups.java:74)
在org.apache.hadoop.security.Groups.getUserToGroupsMappingService(Groups.java:303)
在org.apache.hadoop.security.UserGroupInformation.initialize(UserGroupInformation.java:284)
在org.apache.hadoop.security.UserGroupInformation.ensureInitialized(UserGroupInformation.java:261)
在org.apache.hadoop.security.UserGroupInformation.loginUserFromSubject(UserGroupInformation.java:791)
在org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:761)
在org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:634)
在org.apache.spark.util.Utils $$ anonfun $ getCurrentUserName $ 1.apply(Utils.scala:2373)
在org.apache.spark.util.Utils $$ anonfun $ getCurrentUserName $ 1.apply(Utils.scala:2373)
在scala.Option.getOrElse(Option.scala:121)
在org.apache.spark.util.Utils $ .getCurrentUserName(Utils.scala:2373)
在org.apache.spark.SparkContext。< init>(SparkContext.scala:295)
在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)
在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)
  




如果我从 spark-删除s3distcp.jar defaults.conf 错误消失了。似乎没有太多关于如何部署它的文档,因为它是作为EMR的一部分提供的。




1 个答案:

答案 0 :(得分:0)

我能够通过将--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/*

要在spark-defaults.conf中进行设置,我必须这样做:

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/*

我还了解到spark.executor.extraClassPath仅用于向后兼容旧版本的spark(https://spark.apache.org/docs/latest/configuration.html#runtime-environment