在远程 Yarn 集群上使用 spark 从 S3 访问文件时出现问题
Problem accessing files from S3 using spark on remote Yarn cluster
我正在尝试使用 spark-shell 从 S3 导入 csv 文件 (val df=spark.read.csv("s3a://xxxxxx") )
spark-shell 客户端连接到远程 yarn 集群。
它因 java.lang.VerifyError 而失败,但是,当我从 yarn resourcemanager 的同一台机器上启动 spark-shell 时,它工作正常。
这是错误代码:
java.lang.VerifyError: Bad type on operand stack
Exception Details:
Location:
org/apache/hadoop/fs/s3a/S3AFileSystem.s3GetFileStatus(Lorg/apache/hadoop/fs/Path;Ljava/lang/String;Ljava/util/Set;)Lorg/apache/hadoop/fs/s3a/S3AFileStatus; @274: invokestatic
Reason:
Type 'com/amazonaws/AmazonServiceException' (current frame, stack[2]) is not assignable to 'com/amazonaws/SdkBaseException'
Current Frame:
bci: @274
flags: { }
locals: { 'org/apache/hadoop/fs/s3a/S3AFileSystem', 'org/apache/hadoop/fs/Path', 'java/lang/String', 'java/util/Set', 'java/lang/String', 'com/amazonaws/AmazonServiceException' }
stack: { 'java/lang/String', 'java/lang/String', 'com/amazonaws/AmazonServiceException' }
火花-default.conf :
spark.master yarn
spark.hadoop.fs.s3a.server-side-encryption-algorithm SSE-KMS
spark.hadoop.fs.s3a.server-side-encryption.key xxxxxxxxxxxxxxxxxxxxxxxxxxx
spark.hadoop.fs.s3a.enableServerSideEncryption true
com.amazonaws.services.s3.enableV4 true
spark.hadoop.fs.s3a.impl org.apache.hadoop.fs.s3a.S3AFileSystem
spark.blockManager.port 20020
spark.driver.port 20020
spark.master.ui.port 4048
spark.ui.port 4041
spark.port.maxRetries 100
spark.yarn.jars hdfs://hdfs-master:4040/spark/jars/*
spark.driver.extraJavaOptions=-Dlog4j.configuration=/usr/local/spark/conf/log4j.properties
spark.executor.extraJavaOptions=-Dlog4j.configuration=/usr/local/spark/conf/log4j.properties
spark.eventLog.enabled true
spark.eventLog.dir hdfs://hdfs-master:4040/spark-logs
spark.yarn.app.container.log.dir /home/aws_install/hadoop/logdir
.hadooprc
hadoop_add_to_classpath_tools hadoop-aws
知道问题的根源是什么吗?
类路径问题的提示。
hadooprc 更改的一个问题是它只会更改您的本地环境,而不会更改集群其余部分的环境。但是你得到的事实 org/apache/hadoop/fs/s3a/S3AFileSystem.s3GetFileStatus
意味着正在加载 S3A jar - 但 JVM 本身有问题
类路径上可能有两个 AWS SDK 副本,因此它说刚刚提出的 AmazonServiceException
不是 SdkBaseException
的子类,因为混合了 JAR。
我正在尝试使用 spark-shell 从 S3 导入 csv 文件 (val df=spark.read.csv("s3a://xxxxxx") ) spark-shell 客户端连接到远程 yarn 集群。 它因 java.lang.VerifyError 而失败,但是,当我从 yarn resourcemanager 的同一台机器上启动 spark-shell 时,它工作正常。
这是错误代码:
java.lang.VerifyError: Bad type on operand stack
Exception Details:
Location:
org/apache/hadoop/fs/s3a/S3AFileSystem.s3GetFileStatus(Lorg/apache/hadoop/fs/Path;Ljava/lang/String;Ljava/util/Set;)Lorg/apache/hadoop/fs/s3a/S3AFileStatus; @274: invokestatic
Reason:
Type 'com/amazonaws/AmazonServiceException' (current frame, stack[2]) is not assignable to 'com/amazonaws/SdkBaseException'
Current Frame:
bci: @274
flags: { }
locals: { 'org/apache/hadoop/fs/s3a/S3AFileSystem', 'org/apache/hadoop/fs/Path', 'java/lang/String', 'java/util/Set', 'java/lang/String', 'com/amazonaws/AmazonServiceException' }
stack: { 'java/lang/String', 'java/lang/String', 'com/amazonaws/AmazonServiceException' }
火花-default.conf :
spark.master yarn
spark.hadoop.fs.s3a.server-side-encryption-algorithm SSE-KMS
spark.hadoop.fs.s3a.server-side-encryption.key xxxxxxxxxxxxxxxxxxxxxxxxxxx
spark.hadoop.fs.s3a.enableServerSideEncryption true
com.amazonaws.services.s3.enableV4 true
spark.hadoop.fs.s3a.impl org.apache.hadoop.fs.s3a.S3AFileSystem
spark.blockManager.port 20020
spark.driver.port 20020
spark.master.ui.port 4048
spark.ui.port 4041
spark.port.maxRetries 100
spark.yarn.jars hdfs://hdfs-master:4040/spark/jars/*
spark.driver.extraJavaOptions=-Dlog4j.configuration=/usr/local/spark/conf/log4j.properties
spark.executor.extraJavaOptions=-Dlog4j.configuration=/usr/local/spark/conf/log4j.properties
spark.eventLog.enabled true
spark.eventLog.dir hdfs://hdfs-master:4040/spark-logs
spark.yarn.app.container.log.dir /home/aws_install/hadoop/logdir
.hadooprc
hadoop_add_to_classpath_tools hadoop-aws
知道问题的根源是什么吗?
类路径问题的提示。
hadooprc 更改的一个问题是它只会更改您的本地环境,而不会更改集群其余部分的环境。但是你得到的事实 org/apache/hadoop/fs/s3a/S3AFileSystem.s3GetFileStatus
意味着正在加载 S3A jar - 但 JVM 本身有问题
类路径上可能有两个 AWS SDK 副本,因此它说刚刚提出的 AmazonServiceException
不是 SdkBaseException
的子类,因为混合了 JAR。