我在本地机器上运行Java Spark应用程序时遇到问题。我正在运行Spark master和1个spark worker节点作为docker镜像,配置如下:
version: '2.2'
services:
spark:
image: docker.io/bitnami/spark:latest
environment:
- SPARK_MODE=master
- SPARK_RPC_AUTHENTICATION_ENABLED=no
- SPARK_RPC_ENCRYPTION_ENABLED=no
- SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no
- SPARK_SSL_ENABLED=no
- SPARK_USER=spark
ports:
- '8010:8080'
- '7077:7077'
network_mode: bridge
spark-worker:
image: docker.io/bitnami/spark:latest
environment:
- SPARK_MODE=worker
- SPARK_MASTER_URL=spark://172.17.0.2:7077
- SPARK_WORKER_MEMORY=8G
- SPARK_WORKER_CORES=4
- SPARK_RPC_AUTHENTICATION_ENABLED=no
- SPARK_RPC_ENCRYPTION_ENABLED=no
- SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no
- SPARK_SSL_ENABLED=no
- SPARK_USER=spark
ports:
- '8081:8081'
- '65040:65040'
network_mode: bridge
我的本地java应用程序是驱动程序本身,配置如下:
SparkConf conf =
new SparkConf()
.setAppName("Simple Application")
.set("spark.driver.port", "65040")
.set("spark.driver.host", "192.168.18.15")
.set("spark.files.overwrite", "true")
.setMaster("spark://localhost:7077");
sparkContext = new SparkContext(conf);
String path = getClass().getResource("/addresses.csv").getPath();
sparkContext.addFile(path);
sparkContext.addedFiles();
spark = new SparkSession(sparkContext);
Dataset<Row> csv = spark.read().csv(SparkFiles.get("addresses.csv"));
主/工人和本地应用程序通信没有问题,但有问题与访问addresses.csv
文件的工人,他们试图访问它使用我的本地机器路径,如工人日志below:23/09/19 08:44:09 ERROR Executor: Exception in task 0.3 in stage 0.0 (TID 3) org.apache.spark.SparkFileNotFoundException: File file:/C:/Users/patry/AppData/Local/Temp/spark-fc24a898-45ad-47fe-bf10-41c109a8c46c/userFiles-ab6c8b5c-fc69-4f75-9627-7639860df8bf/addresses.csv does not exist
任何想法我如何可以上传和处理我的文件在工人节点,而不使用HDFS?
我试过使用不同的路径,传递文件到应用程序的方式,但没有成功
1条答案
按热度按时间lc8prwob1#
在提交Spark应用程序时,您可以包含要分发的文件。这些文件被提交并放置在每个worker的工作目录中。显然,这不是一个很好的大文件分发方法;只有小文件才应该以这种方式分发,这些文件不适合存储在HDFS或等效存储上。
我无法在官方文档中找到
spark-submit
可用的参数的完整列表,但我找到了来自CDP docs的链接。