Jast blog Jast blog
首页
  • 《Ambari自定义开发教程》笔记
  • 《CDH教程》笔记
  • 《ClickHouse教程》笔记
  • 《HDFS教程》笔记
  • 《DolphinScheduler教程》笔记
  • 《Hbase教程》笔记
  • 《Iceberg教程》笔记
  • 《Hive教程》笔记
  • 《Flume教程》笔记
  • 《Kafka教程》笔记
  • 《Impala教程》笔记
  • 《Hue教程》笔记
  • 《Spark教程》笔记
  • 《Flink教程》笔记
  • 《Phoenix教程》笔记
  • 《ElasticSearch教程》笔记
  • 《Kylin教程》笔记
  • 《Storm教程》笔记
  • 《Yarn教程》笔记
  • 《Presto教程》笔记
  • 《图数据库教程》笔记
  • 《Kerberos教程》笔记
  • 《Maxwell教程》笔记
  • 《MinIO教程》笔记
  • 《DataX教程》笔记
  • 《Superset教程》笔记
  • 《IOTDB教程》笔记
  • 《大数据相关》笔记
  • 《PaddleNLP教程》笔记
  • 《Nginx教程》笔记
  • 《Java技术文档》
  • 《Maven教程》笔记
  • 《IDEA使用教程》
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档

Jast-zsh

如果你知道你要去哪里,全世界都会给你让路。
首页
  • 《Ambari自定义开发教程》笔记
  • 《CDH教程》笔记
  • 《ClickHouse教程》笔记
  • 《HDFS教程》笔记
  • 《DolphinScheduler教程》笔记
  • 《Hbase教程》笔记
  • 《Iceberg教程》笔记
  • 《Hive教程》笔记
  • 《Flume教程》笔记
  • 《Kafka教程》笔记
  • 《Impala教程》笔记
  • 《Hue教程》笔记
  • 《Spark教程》笔记
  • 《Flink教程》笔记
  • 《Phoenix教程》笔记
  • 《ElasticSearch教程》笔记
  • 《Kylin教程》笔记
  • 《Storm教程》笔记
  • 《Yarn教程》笔记
  • 《Presto教程》笔记
  • 《图数据库教程》笔记
  • 《Kerberos教程》笔记
  • 《Maxwell教程》笔记
  • 《MinIO教程》笔记
  • 《DataX教程》笔记
  • 《Superset教程》笔记
  • 《IOTDB教程》笔记
  • 《大数据相关》笔记
  • 《PaddleNLP教程》笔记
  • 《Nginx教程》笔记
  • 《Java技术文档》
  • 《Maven教程》笔记
  • 《IDEA使用教程》
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
  • Spark算子
  • Spark启动参数以及调优记录
  • Spark-shell读取MySQL写入HDFS
  • Spark foreachRDD的正确使用
  • DataFrame函数
  • Spark WebUI更换使用端口
  • Spark stage如何划分
  • Spark使用HanLP分词
  • Spark RDD分区2G限制
  • Spark读取Hbase写入Hive
  • Ambari Spark 提交任务报错
  • JavaAPI提交Spark任务
  • SparkStreaming Kafka 自动保存offset到zookeeper
  • SparkStreaming参数介绍
  • SparkKerberos租约到期
  • Spark日志Log4j发送到Kafka
  • Spark --files介绍
    • 作用
    • 使用方法
      • 添加文件
      • 获取文件
      • 获取文件路径:
      • 获取文件数据流:
      • 原理
      • 注意事项
    • Cluster模式使用--files
    • Client模式
    • 使用SparkFiles.get提示NullException
      • 问题分析
      • 问题解决方案
    • 参考
  • SparkGraphX使用详解
  • Spark运行异常记录
  • 《Spark教程》笔记
Jast-zsh
2023-03-24
目录

Spark --files介绍

[toc]

# 作用

加载外部资源文件,在driver和executor进程中进行访问。

# 使用方法

# 添加文件

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

# 获取文件

# 获取文件路径:

filePath = SparkFiles.get(fileName)
1

# 获取文件数据流:

executor:inputStream = new FileInputStream(fileName)或者和driver相同
driver: inputStream = new FileInputStream(SparkFiles.get(fileName))
1
2

# 原理

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

在这里插入图片描述

所以SparkFiles.get(fileName)所得的路径,对于driver就是SparkEnv.get.driverTmpDir+fileName,对于executor就是workDir+fileName。

# 注意事项

1、in cluster mode ,–files必须使用全局可视的地址(比如hdfs),否则driver将无法找到文件,出现FileNotFoundException。这是因为driver会在集群中任意一台work节点上运行,使用本地地址无法找到文件。FileNotFoundException异常出现在SparkSession的getOrCreate()初始化方法中,因为此方法会调用addFile(),但是确找不到文件,导致SparkSession初始化失败。注意:–jars原理相同,但是getOrCreate()中调用addJars出现异常,但是并不会导SparkSession初始化失败,程序会继续运行。    值得一提的是,在cluster模式下,spark-submit   --deploy-mode cluster   path-to-jar,其中path-to-jar也必须是全局可视路径,否则会发生找不到jar的异常。所以,这让我觉得spark-submit只是记录了运行的配置,并没有将–files、–jars executor-jar等文件复制并传送给driver程序。

2、在driver中执行的SparkFiles.get(fileName)和executor中执行SparkFiles.get(fileName)结果不同。原理上面已经陈述,driver上和executor上获取的路径并不相同。所以当在driver中使用SparkFiles.get(fileName)获取到文件路径之后,再使用sparkcontext或者sparksession的DataSource API读取文件,则会出现异常。因为读取动作会在每一个executor上执行,但是读取路径是driver上获取得到的,所以找不到文件。

https://stackoverflow.com/questions/37132559/add-jars-to-a-spark-job-spark-submit

# Cluster模式使用--files

Cluster模式在启动时通过--files /data/spark-job/env.properties指定文件,

在代码中可以使用prop.load(new FileInputStream("env.properties"))直接获取文件。

注意:在Client模式使用prop.load(new FileInputStream("env.properties"))会提示找不到配置文件

# Client模式

Client模式prop.load(new FileInputStream("env.properties"))读取的就是部署的本地文件目录,使用Cluster方式就会提示文件找不到

# 使用SparkFiles.get提示NullException

异常内容:

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)
	...
1
2
3
4

# 问题分析

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

# 问题解决方案

优先初始化SparkContext。

# 参考

https://blog.csdn.net/qq_41775852/article/details/104773502

https://blog.csdn.net/weixin_39588015/article/details/79365208

上次更新: 2023/05/11, 16:05:55
Spark日志Log4j发送到Kafka
SparkGraphX使用详解

← Spark日志Log4j发送到Kafka SparkGraphX使用详解→

最近更新
01
Linux可视化监控
02-26
02
Maven私服搭建
02-26
03
当ElasticSearch时间字段设置多个格式到底是用的哪个?
01-19
更多文章>
Theme by Vdoing | Copyright © 2016-2025 Jast-zsh | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式