Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark工作节点无法访问主节点上的文件_Scala_Apache Spark_Amazon Emr - Fatal编程技术网

Scala Spark工作节点无法访问主节点上的文件

Scala Spark工作节点无法访问主节点上的文件,scala,apache-spark,amazon-emr,Scala,Apache Spark,Amazon Emr,我正试图通过Spark Scala代码连接到Presto DB,并在EMR集群上运行它。 我能够创建RDD,但当工作节点尝试获取数据时,代码失败,说明文件未找到(密钥库不存在),尽管它存在于主节点中。有没有办法将密钥库文件复制到子节点? 下面是我的代码和我遵循的步骤 第一步 我使用下面的命令将证书复制到tmp文件夹 s3-dist-cp --src s3://test/rootca_ca.jks --dest /tmp/ 然后我用下面的命令运行下面的代码 spark-submit --exec

我正试图通过Spark Scala代码连接到Presto DB,并在EMR集群上运行它。 我能够创建RDD,但当工作节点尝试获取数据时,代码失败,说明文件未找到(密钥库不存在),尽管它存在于主节点中。有没有办法将密钥库文件复制到子节点? 下面是我的代码和我遵循的步骤

第一步 我使用下面的命令将证书复制到tmp文件夹

s3-dist-cp --src s3://test/rootca_ca.jks --dest /tmp/
然后我用下面的命令运行下面的代码

spark-submit --executor-memory=10G --driver-memory=10G --executor-cores=2 --jars s3://test1/jars/presto-jdbc-338-e.0.jar  --class com.asurion.prestotest --master yarn s3://test1/script/prestotest.jar 


package com.asurion

import org.apache.spark._
import org.apache.spark.SparkContext._
import org.apache.log4j._
import org.apache.spark.sql.SQLContext 
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._
import org.apache.spark.sql.SparkSession
import org.apache.spark.storage.StorageLevel
import java.time.LocalDateTime
import java.util.concurrent._


object prestotest {
  def main(args: Array[String]) {
        Logger.getLogger("org").setLevel(Level.OFF)
       Logger.getLogger("akka").setLevel(Level.OFF)

    val conf = new SparkConf().setAppName("testapp")
     val sc = new SparkContext(conf);
    val sqlcontext = SparkSession.builder().getOrCreate()
        
   
    val carrier_info =" select * from test_tbl  "


    val enrdata = sqlcontext.read.format("jdbc").option("url", "jdbc:presto://test.atlas.prd.aws.test.net:18443/hive").option("SSL","true").option("SSLTrustStorePath","/tmp/rootca_ca.jks").option("SSLTrustStorePassword","pass1").option("query", carrier_info).option("user", "user1").option("password", "pass2").option("driver", "io.prestosql.jdbc.PrestoDriver").load()
    

    println("Writing Statistics"   )    
    enrdata.show(5)
    
     println("Writing done"   )     


  }
}
错误:

scheduler.TaskSetManager (Logging.scala:logWarning(66)): Lost task 0.0 in stage 0.0 (TID 0, 100.64.187.253, executor 1): java.sql.SQLException: Error setting up SSL: /tmp/rootca_ca.jks (No such file or directory)
    at io.prestosql.jdbc.PrestoDriverUri.setupClient(PrestoDriverUri.java:235)
    at io.prestosql.jdbc.PrestoDriver.connect(PrestoDriver.java:88)
    at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$createConnectionFactory$1.apply(JdbcUtils.scala:63)
    at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$createConnectionFactory$1.apply(JdbcUtils.scala:54)
    at org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD.compute(JDBCRDD.scala:272)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:324)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:288)
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:52)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:324)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:288)
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:52)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:324)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:288)
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:52)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:324)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:288)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:90)
    at org.apache.spark.scheduler.Task.run(Task.scala:121)
    at org.apache.spark.executor.Executor$TaskRunner$$anonfun$10.apply(Executor.scala:408)
    at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1360)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:414)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: io.prestosql.jdbc.$internal.client.ClientException: Error setting up SSL: /tmp/rootca_ca.jks (No such file or directory)
    at io.prestosql.jdbc.$internal.client.OkHttpUtil.setupSsl(OkHttpUtil.java:241)
    at io.prestosql.jdbc.PrestoDriverUri.setupClient(PrestoDriverUri.java:203)
    ... 23 more
Caused by: java.io.FileNotFoundException: /tmp/rootca_ca.jks (No such file or directory)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(FileInputStream.java:195)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at io.prestosql.jdbc.$internal.client.OkHttpUtil.loadTrustStore(OkHttpUtil.java:308)
    at io.prestosql.jdbc.$internal.client.OkHttpUtil.setupSsl(OkHttpUtil.java:220)
scheduler.TaskSetManager(Logging.scala:logWarning(66)):在0.0阶段丢失任务0.0(TID 0,100.64.187.253,executor 1):java.sql.SQLException:设置SSL时出错:/tmp/rootca_ca.jks(没有这样的文件或目录)
位于io.prestosql.jdbc.PrestoDriverUri.setupClient(PrestoDriverUri.java:235)
位于io.prestosql.jdbc.PrestoDriver.connect(PrestoDriver.java:88)
位于org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$createConnectionFactory$1.apply(JdbcUtils.scala:63)
位于org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$createConnectionFactory$1.apply(JdbcUtils.scala:54)
位于org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD.compute(JDBCRDD.scala:272)
在org.apache.spark.rdd.rdd.computeOrReadCheckpoint(rdd.scala:324)
位于org.apache.spark.rdd.rdd.iterator(rdd.scala:288)
位于org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:52)
在org.apache.spark.rdd.rdd.computeOrReadCheckpoint(rdd.scala:324)
位于org.apache.spark.rdd.rdd.iterator(rdd.scala:288)
位于org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:52)
在org.apache.spark.rdd.rdd.computeOrReadCheckpoint(rdd.scala:324)
位于org.apache.spark.rdd.rdd.iterator(rdd.scala:288)
位于org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:52)
在org.apache.spark.rdd.rdd.computeOrReadCheckpoint(rdd.scala:324)
位于org.apache.spark.rdd.rdd.iterator(rdd.scala:288)
位于org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:90)
位于org.apache.spark.scheduler.Task.run(Task.scala:121)
位于org.apache.spark.executor.executor$TaskRunner$$anonfun$10.apply(executor.scala:408)
位于org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1360)
位于org.apache.spark.executor.executor$TaskRunner.run(executor.scala:414)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
运行(Thread.java:748)
原因:io.prestosql.jdbc.$internal.client.ClientException:设置SSL时出错:/tmp/rootca_ca.jks(没有这样的文件或目录)
位于io.prestosql.jdbc.$internal.client.OkHttpUtil.setupSsl(OkHttpUtil.java:241)
位于io.prestosql.jdbc.PrestoDriverUri.setupClient(PrestoDriverUri.java:203)
... 23多
原因:java.io.FileNotFoundException:/tmp/rootca\u ca.jks(无此类文件或目录)
位于java.io.FileInputStream.open0(本机方法)
在java.io.FileInputStream.open(FileInputStream.java:195)
位于java.io.FileInputStream。(FileInputStream.java:138)
位于io.prestosql.jdbc.$internal.client.OkHttpUtil.loadTrustStore(OkHttpUtil.java:308)
位于io.prestosql.jdbc.$internal.client.OkHttpUtil.setupSsl(OkHttpUtil.java:220)

EMR上的Spark在其中一个核心节点(默认情况下)而不是主代码上创建驱动程序

驱动程序(在核心节点上)无法访问主节点中的文件

那么你有什么选择呢-

  • 在启动EMR集群时,编写一个引导脚本,将
    rootca_ca.jks
    文件(
    s3cp
    )复制到每个worker(核心和任务)节点,您不需要更改程序中的任何内容
  • 当您使用
    s3 dist cp
    复制文件时,它会将您的文件放在HDFS中,而不是linux文件系统中。
    要访问该文件,需要添加文件系统perfix<代码>hdfs:///tmp/rootca_ca.jks
    您不需要将名称节点地址和端口放在core-site.xml中,因为它是由EMR配置的
  • 由于您的文件已经在S3中,所以可以使用EMRFS(作为hadoop文件系统,它只不过是S3)。要使用EMRFS访问文件,只需将S3URL
    S3://test/rootca\u ca.jks

    但请确保您的EC2 EMR IAM角色有权从S3获取对象
    它也有自己的成本,但由于您的文件很小,您可以利用这一点

    • 选项1:很难随着时间的推移进行维护,如果您的文件需要在运行的集群上进行更改,则必须在每个工作节点上手动进行更改

    • 选项2:由于HDFS是共享文件系统,您可能需要在一个位置维护该文件

    • 选项3:与选项2没有太大区别,只是您的文件保留并从S3读取。您不必在HDFS中复制文件