spark 带文件上集群,获取外部文件,--files 使用说明

大数据-259 离线数仓 - Griffin架构 修改配置 pom.xml sparkProperties 编译启动 用户可以自定义规则,使用 JSON 或其他标准格式来描述数据质量的各项要求。这些规则能够对数据进行周期性检查,并在发现问题时发出警报或进行自动修复。 阅读详情
AI摘要

本文主要探讨了spark-submit在yarn client和cluster模式下提交任务时添加文件、文件传输过程、jar加载情况,还介绍了获取文件路径和内容的方法。同时讲解了Scala IO的相关知识,如标准输入输出、文件输入等,最后提到了SparkFiles.get报错的问题及解决方案。

本文讨论 yarn client 和 cluster模式

spark-submit 提交任务时

添加文件

spark-submit --files file_paths
其中file_paths可为多种方式:file:,hdfs://,http://,ftp://,local:,多个路径用逗号隔开

-- files 每个文件路径逗号隔开,cluster模式下带到每个executor的工作路径下以及driver的工作路径下(参数user.dir可查看),client模式下仅带到每个executor的工作路径下。对于client 模式,文件路径file_paths需要指向本地文件。对于cluster 模式,文件路径file_paths可以是本地文件或者是一个全局可见文件(例如hdfs://path) ,cluster 模式如果是本地路径,不要求每个节点的该路径都有文件,只要提交任务的机器上有文件即可。

文件传输的具体过程:

当使用spark-submit --files时,会将–files后面的文件路径记录下来传给driver进程,然后当启动driver进程时,会调用SparkFiles.addFile(file_path),并复制文件到driver的临时文件目录中。之后executor启动之后,将从driver这里fetch文件到自己的工作目录。

所以SparkFiles.get(fileName)所得的路径(get(filename)可以查询通过SparkContext.addFile()上传的文件的完整路径),对于driver就是SparkEnv.get.driverTmpDir+fileName,对于executor就是workDir+fileName。

经过验证,driver的临时目录会被清空(但是cluster模式下文件会被写到driver的工作目录下)

到底是 先写到工作目录,再写到临时目录,还是先写到临时目录再写到工作目录目前无法验证,有机会读读源码才知道。但是没关系,只要知道cluster模式下最终driver下是临时目录是没有文件的,都在它的工作目录下,和executor一样即可。client模式下,文件不会被复制到工作目录下,要读取文件的话,需要知道文件原始路径。

顺便讲一下jar:

--jars cluster 模式下外部JARs 会被加载到driver和 executor的classpath 下。client模式下,只加载到 executor的classpath 下。对于client模式,文件path必须是本地路径。对于cluster 模式,文件路径可以是本地文件或者是一个全局可见文件(例如hdfs://path) ,cluster 模式如果是本地路径,不要求每个节点的该路径都有文件,只要提交任务的机器上有文件即可。这些jar也会被放到driver和 executor的工作目录下。

记录下来的文件原始路径可在这些参数中查看:
println(System.getProperties.asScala.mkString(System.lineSeparator()))

  • spark.yarn.dist.archives Comma separated list of archives to be extracted into the working directory of each executor.
  • spark.yarn.dist.files Comma-separated list of files to be placed in the working directory of each executor.
  • spark.yarn.dist.jars Comma-separated list of jars to be placed in the working directory of each executor.

获取文件路径和内容

clutser模式下:

获取文件路径:
filePath = SparkFiles.get(fileName)

获取文件数据流:
driver: inputStream = new FileInputStream(fileName)
executor:inputStream = new FileInputStream(fileName)或者inputStream = new FileInputStream(SparkFiles.get(fileName))
获取文件内容:
driver: Source.fromFile(fileName)
executor: Source.fromFile(fileName)或者Source.fromFile(SparkFiles.get(fileName))

client模式下:

executor和cluster模式一样。

driver:
需要获取文件的原始路径:
方法1:直接将原始路径当参数传入oriPath。 Source.fromFile(oriPath)
方法2:System.getProperty("spark.yarn.dist.files"),然后过滤出需要的文件名oriPath,然后 Source.fromFile(oriPath)

验证(上传spark.properties文件):

spark-submit --files /opt/test/spark.properties

 val ss = SparkSession.builder().enableHiveSupport().getOrCreate()

    ss.sparkContext.setLogLevel("INFO")
    //具体文件
    val filePath = SparkFiles.get("spark.properties")
    val workDir=System.getProperty("user.dir")
    LOGGER.info("**** Driver 具体文件spark.properties:"+filePath)
    LOGGER.info("**** Driver 工作路径"+workDir)

    LOGGER.info(s"**** Driver properties:${System.getProperties.asScala.mkString(System.lineSeparator())}")


    def subDir(dir:File):Iterator[File] ={
      LOGGER.info(s"**** subDir of $dir")
      if(dir.listFiles() == null) Array.empty[File].toIterator
      else dir.listFiles().toIterator
    }

    //查看临时目录下所有文件:
    LOGGER.info("**** Driver 临时目录下所有文件:"+subDir(new File(filePath).getParentFile).mkString(System.lineSeparator()))

    //查看工作目录下所有文件:
    LOGGER.info("**** Driver 工作目录下所有文件:"+subDir(new File(workDir)).mkString(System.lineSeparator()))


    import ss.sqlContext.implicits._
    val arr=Seq("1").toDF().map{x=>

      List(System.getProperties.asScala.mkString(System.lineSeparator()),
        System.getenv().asScala.mkString(System.lineSeparator()),
        SparkFiles.get("spark.properties"),
        System.getProperty("user.dir"),
        subDir(new File(System.getProperty("user.dir"))).mkString(System.lineSeparator()),
        subDir(new File(SparkFiles.get("spark.properties")).getParentFile).mkString(System.lineSeparator())
      )
    }.collect().head

    //具体文件
    LOGGER.info("**** Executor 具体文件spark.properties:"+arr(2))
    LOGGER.info("**** Executor 工作路径"+arr(3))
    LOGGER.info(s"**** Executor properties: "+arr(0))


    //查看文件目录下所有文件:
    LOGGER.info("**** Executor-内部  文件目录下所有文件:"+arr(4))


    //查看工作目录下所有文件:
    LOGGER.info("**** Executor-内部 工作目录下所有文件:"+arr(5))

    //查看文件目录下所有文件:
    LOGGER.info("**** Executor-外部  文件目录下所有文件:"+subDir(new File(arr(2)).getParentFile).mkString(System.lineSeparator()))

    //查看工作目录下所有文件:
    LOGGER.info("**** Executor-外部 工作目录下所有文件:"+subDir(new File(arr(3))).mkString(System.lineSeparator()))

    LOGGER.info("程序结束")

cluster模式输出:
**** Driver 具体文件spark.properties:/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/spark-c307a8ed-3853-47af-ad92-7d1970683b3a/userFiles-eb591a81-139b-482f-8056-1829f6219a4b/spark.properties 

**** Driver 工作路径/srv/BigData/hadoop/data3/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000001

**** Driver properties:
spark.yarn.dist.files -> file:///opt/HIBI-ExecuteShell/config/CommonDisplayAds/12_0_2_300sp4_sdv3/config/spark.properties,file:///opt/HIBI-ExecuteShell/config/CommonDisplayAds/12_0_2_300sp4_sdv3/config/hbase-site.xml,file:///opt/HIBI-ExecuteShell/config/CommonDisplayAds/12_0_2_300sp4_sdv3/config/kdc.conf
spark.yarn.dist.jars -> file:///opt/HIBI-ExecuteShell/config/CommonDisplayAds/12_0_2_300sp4_sdv3/lib/bcprov-ext-jdk15on-1.68.jar,file:///opt/HIBI-ExecuteShell/config/CommonDisplayAds/12_0_2_300sp4_sdv3/lib/CryptoUtil-1.1.5.304.jar,file:///opt/HIBI-ExecuteShell/config/CommonDisplayAds/12_0_2_300sp4_sdv3/lib/fastjson-1.2.78.jar,file:///opt/HIBI-ExecuteShell/config/CommonDisplayAds/12_0_2_300sp4_sdv3/lib/commons-pool2-2.8.1.jar

 **** Driver 临时目录下所有文件: (!注意这里为空)
 **** Driver 工作目录下所有文件:/srv/BigData/hadoop/data3/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000001/user.keytab-ca6ead50-35d4-4f1d-8e37-d87c7366106c
/srv/BigData/hadoop/data3/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000001/tmp
/srv/BigData/hadoop/data3/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000001/bcprov-ext-jdk15on-1.68.jar
/srv/BigData/hadoop/data3/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000001/carbon.properties
/srv/BigData/hadoop/data3/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000001/mapred-site.xml
/srv/BigData/hadoop/data3/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000001/launch_container.sh
/srv/BigData/hadoop/data3/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000001/commons-pool2-2.8.1.jar
/srv/BigData/hadoop/data3/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000001/topology.properties
/srv/BigData/hadoop/data3/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000001/jaas-zk.conf
/srv/BigData/hadoop/data3/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000001/spark.properties
/srv/BigData/hadoop/data3/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000001/container_tokens
/srv/BigData/hadoop/data3/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000001/hbase-site.xml
/srv/BigData/hadoop/data3/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000001/__app__.jar
/srv/BigData/hadoop/data3/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000001/jets3t.properties
/srv/BigData/hadoop/data3/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000001/log4j-executor.properties
/srv/BigData/hadoop/data3/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000001/fastjson-1.2.78.jar
/srv/BigData/hadoop/data3/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000001/CryptoUtil-1.1.5.304.jar
/srv/BigData/hadoop/data3/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000001/__spark_libs__
/srv/BigData/hadoop/data3/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000001/__spark_conf__
/srv/BigData/hadoop/data3/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000001/kdc.conf
/srv/BigData/hadoop/data3/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000001/arm
/srv/BigData/hadoop/data3/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000001/x86 



**** Executor 具体文件spark.properties:/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000003/./spark.properties 

**** Executor 工作路径/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000003

**** Executor properties: 
spark.yarn.dist.files 不存在
spark.yarn.dist.jars 不存在


 **** Executor-内部  文件目录下所有文件:/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000003/__app__.jar
/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000003/__spark_libs__
/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000003/mapred-site.xml
/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000003/kdc.conf
/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000003/log4j-executor.properties
/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000003/jets3t.properties
/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000003/spark.properties
/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000003/jaas-zk.conf
/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000003/__spark_conf__
/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000003/bcprov-ext-jdk15on-1.68.jar
/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000003/arm
/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000003/topology.properties
/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000003/launch_container.sh
/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000003/fastjson-1.2.78.jar
/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000003/x86
/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000003/commons-pool2-2.8.1.jar
/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000003/carbon.properties
/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000003/hbase-site.xml
/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000003/CryptoUtil-1.1.5.304.jar
/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000003/tmp
/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000003/container_tokens



**** Executor-内部 工作目录下所有文件:/srv/BigData/hadoop/data1/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0011/container_e25_1686228163560_0011_01_000003/./__app__.jar
(和上面一样,略)

**** Executor-外部  文件目录下所有文件:
 
**** Executor-外部 工作目录下所有文件: 
 

可以看到,Executor 端文件路径和工作路径一样。

dirver端,文件路径和工作路径不一样,因为记录的是临时文件目录。工作目录下该文件是存在的。

client模式输出:
**** Driver 具体文件spark.properties:/tmp/spark-aa67cf79-1f10-4d85-99a0-c9fcced0ee80/userFiles-814810e5-3b1d-435b-a575-796b7e3a2a91/spark.properties
**** Driver 工作路径/opt/HIBI-ExecuteShell
**** Driver properties:
spark.yarn.dist.files -> file:///opt/HIBI-ExecuteShell/config/CommonDisplayAds/12_0_2_300sp4_sdv3/config/spark.properties,file:///opt/HIBI-ExecuteShell/config/CommonDisplayAds/12_0_2_300sp4_sdv3/config/hbase-site.xml,file:///opt/HIBI-ExecuteShell/config/CommonDisplayAds/12_0_2_300sp4_sdv3/config/kdc.conf
spark.yarn.dist.jars -> file:///opt/HIBI-ExecuteShell/config/CommonDisplayAds/12_0_2_300sp4_sdv3/lib/bcprov-ext-jdk15on-1.68.jar,file:///opt/HIBI-ExecuteShell/config/CommonDisplayAds/12_0_2_300sp4_sdv3/lib/CryptoUtil-1.1.5.304.jar,file:///opt/HIBI-ExecuteShell/config/CommonDisplayAds/12_0_2_300sp4_sdv3/lib/fastjson-1.2.78.jar,file:///opt/HIBI-ExecuteShell/config/CommonDisplayAds/12_0_2_300sp4_sdv3/lib/commons-pool2-2.8.1.jar
 
**** Driver 临时目录下所有文件:
**** Driver 工作目录下所有文件:/opt/HIBI-ExecuteShell/略(沒有spark.properties)

**** Executor 具体文件spark.properties:/srv/BigData/hadoop/data2/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0019/container_e25_1686228163560_0019_01_000002/./spark.properties
 
**** Executor 工作路径/srv/BigData/hadoop/data2/nm/localdir/usercache/AdsNewsFeed/appcache/application_1686228163560_0019/container_e25_1686228163560_0019_01_000002
**** Executor properties:
spark.yarn.dist.files 不存在
spark.yarn.dist.jars 不存在

其他executor信息和cluster模式一样,(略)

可以看到,在client模式下,driver端并没有将文件复制到工作目录。
另外,为什么工作路径是/opt/HIBI-ExecuteShell?

> echo $SPARK_HOME
/opt/ficlient20210106/Spark2x/spark
> echo $JAVA_HOME
/opt/ficlient20210106/JDK/jdk-8u201

因为jvm的启动路径是动态的,自定义的spark-submit的启动脚本 exec-hive.sh放在了/opt/HIBI-ExecuteShell下面,提交任务格式为:

/opt/HIBI-ExecuteShell/exec-hive.sh  你的脚本.sh

下面解释为什么FileInputStream和Source.fromFile直接写文件名也可以,因为scala io的相对路径取的事jvm的相对路径,而jvm的相对路径的根目录和driver和executor的工作路径是相同的。

Scala IO

  • Console(用于标准输入输出)–Console是对System.out、System.in和System.err的一层封装。包括print
  • StdIn(用于标准输入)–StdIn是Console类中标准输入的引用
  • Source(用于文件输入,输出得用java的api)–Source是对java.io.File的一层封装
  • 文件输出(Scala中没有专门的文件输出,需要使用Java的类)
  • 相对路径

Source.fromFile(filePath),时,filePath可为相对路径:
相对路径以jvm环境变量中的user.dir为根目录

在Scala中启动Scala的路径即为user.dir的值。
在IDEA中user.dir的值为项目的根目录下面。

获取文件目录和子文件:

//遍历某目录下所有的文件和子文件  
  def main(args:Array[String]):Unit = {  
      for(d <- subDirRec(new File("d:\\AAA\\")))  
        println(d)  
  }  
   
  def subDirRec(dir:File):Iterator[File] ={  
    val dirs = dir.listFiles().filter(_.isDirectory())  
    val files = dir.listFiles().filter(_.isFile())  
    files.toIterator ++ dirs.toIterator.flatMap(subDirRec _)  
  }  
//非循环
   def subDir(dir:File):Iterator[File] ={
      if(dir.listFiles() == null) Array.empty[File].toIterator
      else dir.listFiles().toIterator
    }

在Yarn-client中,Application Master仅仅从Yarn中申请资源给Executor,之后client会跟container通信进行作业的调度,下图是Yarn-client模式
在这里插入图片描述

注意SparkFiles.get报错

问题现象
Spark任务抛出如下异常:

Exception in thread "main" java.lang.NullPointerException
	at org.apache.spark.SparkFiles$.getRootDirectory(SparkFiles.scala:37)
	at org.apache.spark.SparkFiles$.get(SparkFiles.scala:31)
	...

问题分析
该现象为在初始化SparkContext之前调用了SparkFiles.get()。

问题解决方案
优先初始化SparkContext。

Important notes

Whether core requests are honored in scheduling decisions depends on which scheduler is in use and how it is configured.
In cluster mode, the local directories used by the Spark executors and the Spark driver will be the local directories configured for YARN (Hadoop YARN config yarn.nodemanager.local-dirs). If the user specifies spark.local.dir, it will be ignored. In client mode, the Spark executors will use the local directories configured for YARN while the Spark driver will use those defined in spark.local.dir. This is because the Spark driver does not run on the YARN cluster in client mode, only the Spark executors do.
The --files and --archives options support specifying file names with the # similar to Hadoop. For example, you can specify: --files localtest.txt#appSees.txt and this will upload the file you have locally named localtest.txt into HDFS but this will be linked to by the name appSees.txt, and your application should use the name as appSees.txt to reference it when running on YARN.
The --jars option allows the SparkContext.addJar function to work if you are using it with local files and running in cluster mode. It does not need to be used if you are using it with HDFS, HTTP, HTTPS, or FTP files.

参考

官方-submit
官方-cluster模式
官方-spark参数
参数解释
Spark --files使用总结
Spark --files理解(该理解有一些错误,不要被误导)
Spark读取配置文件的探究
Scala IO总结
Java中user.dir到底是什么?System.getProperty方法获取属性
–files 对应源码
java.io.File中的绝对路径和相对路径
Spark中函数addFile和addJar函数介绍
Spark源码中添加deleteFile方法
官方文档-addfile函数
知乎-Spark源码分析——Spark-Submit源码实现分析
Spark源码分析-作业提交(spark-submit
spark-client模式下,设置spark的日志级别
Spark进阶-- spark-client和spark-cluster详解

Spark本地开发环境搭建:隔离、验证与可扩展的三步闭环法 Apache Spark 是一个分布式计算引擎,其本地开发环境并非简单的软件安装任务,而是一个涉及JDK版本兼容性、Hadoop二进制绑定、Python-JVM通信协议(Py4J)、类路径隔离与配置驱动扩展的系统性工程。理解 Spark 运行时原理——如 Catalyst 优化器触发条件、local[*] 模式下的 Driver 网络绑定机制、以及 spark-sql 模块的依赖树完整性——是规避 ClassNotFoundException、NoSuchMethodError 和 Py4J 通信失败的关键 阅读详情

相关推荐

Azure Synapse实战指南:构建企业级可落地数据中枢

数据中枢是现代数据平台的核心范式,指通过统一元数据、共享计算资源与一致权限体系,实现结构化与非结构化数据的融合处理。其技术原理在于解耦存储与计算,依托Serverless SQL、Dedicated MPP和Spark三层引擎协同调度,并通过ADLS Gen2实现数据虚拟化。这种架构显著提升数据一致性、降低运维复杂度,并支撑实时分析、机器学习与BI自助服务等关键场景。Azure Synapse正是这一理念的工程化落地代表,尤其在确定性执行、跨工具治理与Azure原生集成方面具备独特优势,成为替代烟囱式架构与

weixin_34185320的博客 316

spark-submit --files

spark-submit --files通常用来加载外部资源文件,在driver和executor进程中进行访问–files和–jars基本相同。

小道的博客 1293

DuckDB数据工程实战:嵌入式列式数据库如何重塑ETL效率

列式数据库是一种面向分析型负载(OLAP)优化的数据存储范式,通过按列组织数据实现高效压缩、谓词下推与列裁剪;向量化执行则利用CPU SIMD指令批量处理数据块,显著降低每行计算开销。这类技术组合赋予DuckDB在GB-TB级单机数据分析场景中远超传统分布式引擎的吞吐与确定性延迟。其核心价值在于填补数据工程中的‘灰色地带’——即无需分布式扩展、但又超出Pandas/SQLite能力边界的批处理、数据验证与报表预计算任务。本文聚焦DuckDB作为生产级嵌入式SQL引擎的落地实践,覆盖Parquet加速、S3直

dianxi0949的博客 505

Spark --files使用总结

spark --files

呆呆的嘛的博客 2021

[Spark 进阶] -- Spark 如何在运行时读取 --files 添加的 README.md 文件?

Spark 如何在运行时读取 --files 添加的 README.md 文件? 方法 1 本方法适用于 spark local 和 spark on yarn-client 。 --files 会把文件上传到 hdfs 的 .sparkStagin/applicationId 目录下,使用上面说的方法先获取到 hdfs 对应的这个目录,然后访问hdfs的这个文件,如下 spark....

欢迎来到我的博客,一起探索代码里的世界! 7663

大数据Hadoop运维应用实践——Hbase与hadoop的整合_Hbase的配置安装

本文详细介绍了HBase分布式数据库的配置安装与使用实践。主要内容包括:1. HBase的介绍(是什么?有啥用?优缺点、适用与不适用场景)。2. 版本选型指南:针对不同JDK版本HBase和Hadoop环境提供兼容性矩阵。3. 集群部署实践:包含环境变量配置、JVM参数调优、核心参数(hbase-site.xml)详解,特别强调内存分配(堆内外)、ZK超时、Region分裂等关键配置与高可用配置。最后提供了Ansible自动化批量部署脚本,适合企业级生产环境安装部署HBase参考。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 201

Spark Submit --files 添加文件

一.引言 当一个分布式任务中一个文件需要在全局使用时,最常见的方法就是使用广播的形式,在dirver端读取随后分发到excutor,这里需要的时间是 1) dirver端读取文件时间 2) 广播分发到各excutor的时间 当文件大小逐渐增加到一个阈值,或者内存资源有瓶颈时,广播的时间就会变长,这时候就需要和下面这种方式进行比较,看哪种方式时间最快 1) --files 添加文件 2) 直接在excutor读取文件,各个task使用 二.Spark Submit 脚本 --filse 添.

BITDDD小栈 8729

HDFS Java编程实战:从伪分布式环境搭建到文件操作避坑指南

HDFS(Hadoop Distributed File System)是大数据生态中最基础的分布式存储系统,其Java API编程并非简单调用FileSystem接口,而是深入理解文件定位、块分配、权限控制与服务状态协同的工程实践。掌握HDFS编程原理,关键在于厘清客户端配置加载机制、NameNode与DataNode通信协议、以及RPC连接生命周期。技术价值体现在稳定接入离线数据湖、支撑ETL任务迁移、实现Kerberos安全认证集成等核心场景。本文聚焦Hadoop 3.3.6伪分布式环境,覆盖File

weixin_33824363的博客 301

spark 带文件上集群,获取外部文件,--files 使用说明_spark-submit --files

本文讨论yarnclient和cluster模式。

2501_90229237的博客 634

【AI Infra】Perfetto性能分析工具指南

Perfetto是一款开源性能分析工具,提供系统级和应用级的活动数据追踪功能。其界面分为四个区域:左侧操作区(包含Trace查看、SQL查询、预置分析等功能)、上方信息区、中间图形化展示区以及下方详细信息区。工具支持快捷键操作(w/s缩放、a/d移动、m标记等),并能高效处理大体积Trace文件。通过Timeline分析可发现性能瓶颈,如案例中update_actor耗时过高的问题,最终定位到CPU offloading导致的MemcpyH2D操作耗时过长,提出了优化方案。Perfetto相比Systrac

baiweizeng的博客 1507

脑影像分析软件推荐 | JuSpace

JuSpace是一种允许基于 MRI 测量与核成像衍生估计的跨模态关联的工具包,它涵盖各种神经递质系统,包括多巴胺能、血清素能、去甲肾上腺素能和 GABA(γ-氨基丁酸) 神经传递。JuSpace 由一组 Matlab 功能以及涵盖各种受体系统的 PET 受体图谱组成。

NHKJ_ZF的博客 1707

星智 1.54 METAL 触摸交互完整指南:一键烧录固件、分区解析触控、拆解电源状态机

无名科技星智 1.54 METAL (wifi) 是一款以 ESP32-S3 为主控、CST816 触控替代物理按键的触摸交互开发板,铝合金外壳下集成 1.54 寸 ST7789 屏与 ES8311 音频链路。以下按构建、交互、电源策略、源码结构四个维度展开:先走通克隆到烧录的命令链,再解析触控分区判定、浅睡与深睡机制,最后落到初始化链路和可定制点。 ## 构建与烧录:从零烧录固件的完整命令链

gitblog_00646的博客 194

Flutter 中使用蓝牙插件报错,说没有权限怎么解决

2、在build.grale里面更改一下版本号,我修改的是targetSdkVersion这个版本号,需要根据你自己的版本进行更改,记得更改之后先flutter clean一下再run。搞了一晚上,没搞出来,第二天用同事手机测试发现他手机可以,我手机还是不行,才发现是Android版本问题,需要修改两处地方。废话不多说,咱先看报错信息。

zzj17637822814的博客 2289

国赛大数据离线处理:指标计算的工程化实战指南

离线数据处理是大数据开发的核心基础能力,本质是将原始杂乱数据通过清洗、建模与聚合,转化为可支撑业务决策的准确指标。其技术原理涵盖Spark SQL执行优化、宽表预计算设计、窗口函数与比率计算范式等关键机制,技术价值在于提升计算准确性、资源利用率与交付鲁棒性。典型应用场景包括职业院校技能大赛备赛、企业级ETL任务开发及业务分析师的数据链路构建。本文聚焦‘指标计算’与‘离线数据处理’两大核心热词,结合国赛真实约束(如4核8G集群、数据脏乱、限时交付),系统拆解从脏数据到可信指标的全流程工程实践。

weixin_30698527的博客 261

overleaf导入模板

本文介绍了如何在Overleaf平台导入Springer Nature模板。首先下载所需的模板压缩包,然后在Overleaf中选择"Upload project"上传该压缩包。上传后会显示模板文件,包括EPS格式图像文件、LaTeX源文件、BibTeX参考文献文件、PDF输出文件以及文档类文件。这些文件共同构成了完整的LaTeX模板,可用于学术论文写作和排版。

A2787960542的博客 1148

海康工业相机排雷笔记02-像素格式解析

工业相机使用过程记录 02-像素格式解析 通过将相机输出图像裸数据raw格式直接存图查看 一、黑白/Mono 直接使用相机测试图像存图: 图像中各部分灰度分别为:0、36、73、109、146、182、219、255,以灰度73列为例 (1)Mono 8 该列图像数据为十六进制49,十进制为73,那么Mono 8就是每个像素点占8bit,依次排列。 (2)Mono 10 该列图像数据为十六进制2401,由于相机均为小端数据,实际数据应解析为0124,十进制为292=73*4,那么Mono 10格式为每

yonghuming_66的博客 8357

DuckDB如何加速数据工程流水线:单机极致性能实践指南

DuckDB 是一种嵌入式、列式、向量化执行的 OLAP 数据库,专为分析型工作负载设计。其核心原理在于利用 CPU SIMD 指令实现向量化计算、通过 mmap 实现零拷贝文件访问、原生支持 Parquet/Delta Lake 等现代数据格式,并深度优化 SQL 执行计划。相比 Spark 或 Pandas,它在中等规模(GB~数十 GB)ETL、特征计算、临时分析等 Data Pipelines 场景中展现出数量级性能优势,显著降低资源消耗与运维复杂度。技术价值体现在开发效率提升、CI/CD 加速、亚

weixin_34034261的博客 401

流体动力学仿真软件:XFlow_(20).案例研究:声学仿真

在流体动力学仿真软件中,声学仿真是一个重要的应用领域。通过数值模拟,工程师和科研人员可以预测和分析流体系统中的声学现象,如气动噪声、声波传播和声场分布。这些仿真结果对于优化设计、降低噪声水平和提高系统性能具有重要意义。本节将详细介绍如何在流体动力学仿真软件中进行声学仿真,包括声学模型的选择、参数设置、后处理分析等内容,并通过具体的案例来说明这些步骤。

kkchenjj的博客 902

PySpark本地开发实战:DataFrame API入门与性能调优

PySpark是基于Spark引擎的Python接口,核心价值在于将分布式计算能力封装为可调试、可优化的DataFrame API。其原理依托Catalyst优化器与Tungsten执行引擎,实现SQL解析、逻辑计划优化与物理执行自动并行化。技术价值体现在显著降低分布式开发门槛——无需掌握Scala或集群运维,即可在本地完成端到端数据处理闭环。典型应用场景包括GB级日志清洗、实时特征工程、数据湖ETL等。本文聚焦PySpark入门关键路径:基于local[*]模式零依赖启动、DataFrame API替代R

399

PT:pt write_change to innovus 脚本

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1526

【保姆级教程】基于UNet++&MobileNetv3的语义分割模型从训练到RK3588部署:让边缘AI落地效率提升300%

通过SMP库一键构建encoder_name="mobilenet_v2", # 选择MobileNetv3作为骨干encoder_weights="imagenet", # 加载预训练权重加速收敛in_channels=3, # 输入图像通道数(RGB)classes=29, # Cityscapes数据集类别数activation=None # 输出无激活,便于后续损失计算本教程从“模型设计-训练-转换-边缘部署”全链路拆解了。

FJN110的博客 256

StarRocks FE 配置完全指南:认证、查询与数据导入导出参数(user_query_loading)

本文基于 StarRocks 官方文档中 **FE Configuration - Authentication, Query, and Loading**(认证、查询与加载)一章,系统讲解 Frontend(FE)节点中与用户权限、查询执行、数据加载与导出相关的一百多个配置参数。文章既覆盖每个参数的默认值、类型、可变性与版本引入信息,帮助你在 `fe.conf` 与 SQL 命令之间做出正确选择

gitblog_00003的博客 424

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Spark --files理解

Spark --files作用使用方法添加文件获取文件原理注意事项 作用 加载外部资源文件,在driver和executor进程中进行访问。 使用方法 添加文件 spark-submit --files file_paths 其中file_paths可为多种方式:file:,hdfs://,http://,ftp://,local:,多个路径用逗号隔开 获取文件 获取文件路径: filePath...

qq_41775852的博客 9500

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

yarn模式运行spark作业所有属性详解

摘要:Spark 参数调优,可以大大提高工作中程序的运行效率。下面简单介绍一下这些常用的调优参数属性名称 默认值 含义spark.yarn.am.memory 512m client模式下,YARN Application Master使用的内存总量spark.yarn.am.cores 1 ...

weixin_34248487的博客 285

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Spark提交参数--files的使用

跨集群读写数据,我们测试了写hbase是可以从计算集群向存储集群写的,而且能写进去。 但是一旦写hive 他就是写不存储集群的hive中,每次都只写到了计算集群的hive中。 这让我很费解,而且我在本地IDEA上测试的时候,就能写到存储集群的hive中,一旦上小海豚放集群上跑 他就写跑偏了,就给写到计算集群的hive里面了。 原因分析: 1.我先去Spark的运行界面上查看了Environment下的hadoop的参数,我搜了nn1去看了一下,看看我的changenamenode方法到底有没有给我生效

南风知我意 1740

Spark-submit提交任务如何读取外部配置文件

Spark-submit的--files参数

mthgh-mjj 3110
上一篇: 获取Scala中所有环境和系统属性,(System.getProperties System.getenv
下一篇: log4j:WARN No appenders could be found for logger问题
Code_LT
博客等级 码龄10年 307粉丝 182原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值