在洗牌期间,映射器将其输出转储到本地磁盘, reducer 从本地磁盘获取输出。这些文件到底转储到磁盘上的哪个位置?我正在 YARN 上运行 pyspark 集群。
到目前为止我已经尝试过:
我认为中间文件可能所在的位置是(按可能性的降序排列):
hadoop/spark/tmp
。根据documentation在由 yarn 定义的LOCAL_DIRS
环境变量中。 但是,在启动集群后(我正在传递master --yarn
),我无法使用os.environ
找到任何LOCAL_DIRS
env 变量,但是,我可以看到SPARK_LOCAL_DIRS
这应该只发生在 mesos 或独立的情况下,根据文档(知道为什么会出现这种情况吗?)。无论如何,我的SPARK_LOCAL_DIRS
是hadoop/spark/tmp
tmp
。spark.local.dir
的默认值/home/用户名
。我尝试在使用--conf Spark.local.dir=/home/username
启动 pyspark 时将自定义值发送到 hadoop/yarn/nm-local-dir
。这是yarn-site.xml 中的yarn.nodemanager.local-dirs
属性的值
spark.local.dir
我正在运行以下代码,并通过导航到工作节点上的每个位置来检查在上述 4 个位置创建的任何中间文件。
我正在运行的代码:
from pyspark import storagelevel
df_sales = spark.read.load("gs://monsoon-credittech.appspot.com/spark_datasets/sales_parquet")
df_products = spark.read.load("gs://monsoon-credittech.appspot.com/spark_datasets/products_parquet")
df_merged = df_sales.join(df_products,df_sales.product_id==df_products.product_id,'inner')
df_merged.persist(storagelevel.StorageLevel.DISK_ONLY)
df_merged.count()
上面列出的 4 个位置都没有创建任何文件
正如答案之一所建议的,我尝试通过以下方式在终端中获取目录信息:
- 在位于
$SPARK_HOME/conf/
的 log4j.properties 文件末尾添加log4j.logger.or.apache.spark.api.python.PythonGatewayServer=INFO
这没有帮助。以下是我的终端的屏幕截图,日志记录设置为 INFO
spark 中间文件(映射器的输出、持久化等)存储在哪里?
最佳答案
在不深入了解 Spark 源代码的情况下,也许您可以快速实时查看它。像这样的事情:
>>> irdd = spark.sparkContext.range(0,100,1,10)
>>> def wherearemydirs(p):
... import os
... return os.getenv('LOCAL_DIRS')
...
>>>
>>> irdd.map(wherearemydirs).collect()
>>>
...将在终端中显示本地目录
/data/1/yarn/nm/usercache//appcache/
但是,是的,它基本上会指向由 DiskBlockManager
创建的 UUID 随机子目录的父目录(由 YARN 创建),正如 @KoedIt 提到的:
:
23/01/05 10:15:37 INFO storage.DiskBlockManager: Created local directory at /data/1/yarn/nm/usercache/<your-user-id>/appcache/application_xxxxxxxxx_xxxxxxx/blockmgr-d4df4512-d18b-4dcf-8197-4dfe781b526a
:
关于apache-spark - Spark中间文件存储在磁盘的什么位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75018669/