我正在构建一个Spark应用程序,并尝试在EMR或容器中启动它之前在本地运行它。当parquet文件本身是本地时,我可以让DataFrame正常工作,但如果parquet文件在S3中,它拒绝读取该文件。我已经尝试设置了所有我能想到的变量,这些变量是从S3a读入时建议的,下面是我如何创建我的Spark会话的:
package util
import org.apache.spark.sql.SparkSession
import scala.io.Source
object SparkSessionFactory {
def generateSession(sessionLocation: String): SparkSession = {
val session = {
sessionLocation match {
case "local" =>
SparkSession.builder().appName("LocalS3SparkProfiler").master("yarn").master("local[*]")
.config("spark.driver.host", "localhost")
.config("fs.s3a.enableServerSideEncryption", "true")
.config("fs.s3a.serverSideEncryptionAlgorithm", "aws:kms")
.getOrCreate()
}
}
setHadoopConfigs(session, sessionLocation)
session
}
private def setHadoopConfigs(session:SparkSession, sessionLocation:String) = {
session.sparkContext.hadoopConfiguration.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
session.sparkContext.hadoopConfiguration.set("fs.s3a.path.style.access", "true")
sessionLocation match {
case "local"=> {
val userHome = System.getProperty("user.home")
val aWSCredentialsLines = Source.fromFile(s"$userHome/.aws/credentials").getLines.toList
val key = aWSCredentialsLines(1).substring(aWSCredentialsLines(1).lastIndexOf(" ")).trim
val secret = aWSCredentialsLines(2).substring(aWSCredentialsLines(2).lastIndexOf(" ")).trim
val s3Token = aWSCredentialsLines(3).substring(aWSCredentialsLines(3).lastIndexOf(" ")).trim
session.sparkContext.hadoopConfiguration.set("fs.s3a.access.key", key)
session.sparkContext.hadoopConfiguration.set("fs.s3a.secret.key", secret)
session.sparkContext.hadoopConfiguration.set("fs.s3a.session.token", s3Token)
session.sparkContext.hadoopConfiguration.set("fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider")
}
}
}
}
然后当我试图读取数据帧时,我调用
val spark = SparkSessionFactory.generateSession("local")
val df = spark.read.parquet("s3a://my-bucket/thepath/myparquetfile")
抛出的错误如下:
线程“main”com.amazonaws.services.S3.model.amazons3异常:禁止(服务:Amazon S3;状态代码:403;错误代码:403禁止;请求ID:366CFE11F21144F3;S3扩展请求ID:EW4C6PQZ4USJOPMYKOZ8QCWMK4PWL6EFPWEF9E1KLA3KL2LSICMCTZ+ZLYVPLZH927Inisro7KO=)、S3扩展请求TPClient$RequestExecutor.Access$500(AmazonHttpClient$RequestExecutionBuilderImpl.Execute(AmazonHttpClient.java:649)(Com.AmazonAws.http.AmazonHttpClient.513)(Com.AmazonAws.services.s3.AmazonS3Client.Invoke(AmazonS3Client.Invoke)(Com.AmazonAws.services.s3.AmazonS3Client.Invoke)(AmazonS3Client.java:4277)(
我所读到的一切都表明我需要的证明是我提供的。我检查了key
、secret
和s3token
值,它们看起来是正确的,因为我在另一个使用普通AWS SDK的项目中使用了这些凭据,没有任何问题。
你知道这是什么问题吗?
调试AWS身份验证失败是很困难的,因为AWS和任何实现客户端都不希望将机密记录到控制台。“403”一般和“400”一样无用调试
我有一个很大的数据框,我正在HDFS中写入拼花文件。从日志中获取以下异常: 谷歌对此进行了搜索,但找不到任何具体的解决方案。将推测设置为false:conf.Set(“spark.投机”,“false”) 但仍然没有帮助。它只完成了几个任务,生成了几个零件文件,然后突然因此错误而停止。 详细信息:Spark版本:2.3.1(这在1.6x中没有发生) 只有一个会话正在运行,这排除了不同会话访问同一位
我试图为hibernate OGM mongo DB应用程序添加hibernate搜索支持。当我尝试使用行重新生成索引时,经常会出现以下异常。 HSearch000058:HSearch000116:MassIndexer操作过程中出现意外错误java.lang.NosuchMethoderror:org.hibernate.search.engine.spi.documentBuilderInd
我试图做一些非常简单的事情,我有一些非常愚蠢的挣扎。我想这一定与对火花的基本误解有关。我非常感谢任何帮助或解释。 我有一张非常大的桌子(~3 TB,~300毫米行,25k个分区),在s3中保存为拼花地板,我想给一些人一个很小的拼花文件样本。不幸的是,这要花很长时间才能完成,我不明白为什么。我尝试了以下方法: 然后当这不起作用时,我尝试了这个,我认为应该是一样的,但我不确定。(我添加了,以尝试调试。
我正在尝试使用Kafka-connect来消耗Kafka的消息并将它们写入s3拼花文件。所以我写了一个简单的生产者,它用byte[]生成消息 我的Kafka连接配置是: 这是我得到的错误: 原因:java。lang.IllegalArgumentException:Avro架构必须是记录。在org。阿帕奇。拼花地板阿夫罗。AvroSchemaConverter。转换(AvroSchemaConve
Spark版本:2.3 hadoop dist:azure Hdinsight 2.6.5平台:azure存储:BLOB 集群中的节点:6个执行器实例:每个执行器6个内核:每个执行器3个内存:8gb 试图通过同一存储帐户上的spark数据框将azure blob(wasb)中的csv文件(大小4.5g-280列,2.8 mil行)加载到拼花格式。我重新划分了大小不同的文件,即20、40、60、10
我看到Kafka Connect可以以Avro或JSON格式写入S3。但是没有Parket支持。添加这个有多难?