这是命令帮助所说的:
--archives=[ARCHIVE,...] 要提取到每个执行程序的工作目录的档案的逗号分隔列表。必须是以下文件格式之一:.zip、.tar、.tar.gz 或 .tgz。
而且,这里的答案告诉我,--archives
只会在工作节点上提取
我正在--archive
通过以下方式测试行为:tl;dr - 1. 我创建一个存档并压缩它。2. 我创建了一个简单的 rdd 并将其元素映射到os. walk('./')
. 3.archive.zip
被列为目录但os.walk
不遍历此分支
我的archive
目录:
.
├── archive
│ ├── a1.py
│ ├── a1.txt
│ └── archive1
│ ├── a1_in.py
│ └── a1_in.txt
├── archive.zip
└── main.py
2 directories, 6 files
测试代码:
import os
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
sc = spark.sparkContext
rdd = sc.parallelize(range(1))
walk_worker = rdd.map(lambda x: str(list(os.walk('./')))).distinct().collect()
walk_driver = list(os.walk('./'))
print('driver walk:', walk_driver)
print('worker walk:',walk_worker)
Dataproc 运行命令:
gcloud dataproc jobs submit pyspark main.py --cluster pyspark-monsoon31 --region us-central1 --archives archive.zip
输出:
driver walk: [('./', [], ['.main.py.crc', 'archive.zip', 'main.py', '.archive.zip.crc'])]
worker walk: ["[('./', ['archive.zip', '__spark_conf__', 'tmp'], ['pyspark.zip', '.default_container_executor.sh.crc', '.container_tokens.crc', 'default_container_executor.sh', 'launch_container.sh', '.launch_container.sh.crc', 'default_container_executor_session.sh', '.default_container_executor_session.sh.crc', 'py4j-0.10.9-src.zip', 'container_tokens']), ('./tmp', [], ['liblz4-java-5701923559211144129.so.lck', 'liblz4-java-5701923559211144129.so'])]"]
驱动程序节点的输出:archive.zip
可用但未提取 -预期
worker node :的输出作为提取目录os.walk
列出。archive.zip
可用的 3 个目录是 ['archive.zip', '__spark_conf__', 'tmp']
. 但是,令我惊讶的是,只有./tmp
进一步遍历,仅此而已
我已经检查os.listdir
过它archive.zip
实际上是一个目录而不是一个 zip。它的结构是:
└── archive.zip
└── archive
├── a1.py
├── a1.txt
└── archive1
├── a1_in.py
└── a1_in.txt
那么,为什么os.walk
不走下archive.zip
目录呢?