簡體   English   中英

Spark 工作節點無法訪問主節點上的文件

[英]Spark worker nodes unable to access file on master node

我正在嘗試通過我的 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)

EMR 上的 Spark 在核心節點之一(默認情況下)而不是在主代碼上創建驅動程序。

驅動程序(在 CORE 節點上)無法訪問主節點中的文件。

那么你有什么選擇 -

  1. 在啟動 EMR 集群時,編寫引導腳本以將rootca_ca.jks文件 ( s3 cp ) 復制到每個工作節點 (CORE & TASK),並且您不要更改程序中的任何內容
  2. 當您使用s3-dist-cp復制文件時,它會將您的文件放在 HDFS 而不是 linux 文件系統中。
    要訪問該文件,您需要添加文件系統前綴。 hdfs:///tmp/rootca_ca.jks
    您不需要放置名稱節點地址和端口,因為它由 EMR 在 core-site.xml 中配置
  3. 由於您的文件已經在 S3 中,因此您可以使用 EMRFS(它只是 S3 作為 hadoop 文件系統)。 要使用 EMRFS 訪問文件,只需輸入 S3 url s3://test/rootca_ca.jks
    但請確保您的 EC2 EMR IAM 角色有權從 S3 獲取 object
    它也有自己的成本,但由於你的文件很小,你可以利用它

  • 選項 1:隨着時間的推移很難維護,如果您的文件需要在運行的集群上更改,您將必須在每個工作節點上手動執行。

  • 方案二:由於HDFS是共享文件系統,你可能需要在一個地方維護文件。

  • 選項 3:與選項 2 沒有太大區別,只是您的文件保留並從 S3 讀取。 您不必復制 HDFS 中的文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM