在shuffle过程中,Map器将输出转储到本地磁盘,Reducer从本地磁盘获取输出。这些文件转储到磁盘的具体位置?我在YARN上运行pyspark cluster。
到目前为止我已经尝试过:
我认为中间文件可能位于的位置是(按可能性降序排列):
hadoop/spark/tmp
。根据Yarn定义的LOCAL_DIRS
env变量中的documentation。但是,启动集群后(我正在传递master --yarn
)我无法使用os.environ
找到任何LOCAL_DIRS
env变量,但是,我可以看到SPARK_LOCAL_DIRS
,根据文档,这应该仅在使用mesos或单机时发生(知道为什么会这样吗?)无论如何,我的SPARK_LOCAL_DIRS
是hadoop/spark/tmp
tmp
。默认值为spark.local.dir
/home/username
。我尝试在使用--conf spark.local.dir=/home/username
启动pyspark时将自定义值发送到spark.local.dir
hadoop/yarn/nm-local-dir
。这是yarn-site.xml中yarn.nodemanager.local-dirs
属性的值
我正在运行以下代码,并通过导航到工作节点上的每个位置来检查在上述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个位置中的任何一个都没有正在创建的文件
正如其中一个答案所建议的,我曾尝试通过以下方式获取终端中的目录信息:
- At the end of log4j.properties file located at
$SPARK_HOME/conf/
addlog4j.logger.or.apache.spark.api.python.PythonGatewayServer=INFO
This did not help. The following is the screenshot of my terminal with logging set to INFO
spark中间文件(Map器的输出,持久化等)存储在哪里?
2条答案
按热度按时间iyfamqjs1#
不需要深入Spark source的杂草,也许你可以快速查看它的现场。
...将显示终端中的本地目录
/数据/1/Yarn/纳米/用户缓存//应用程序缓存/<application_xxxxxxxxxxx_xxxxxxx>,/数据/10/Yarn/纳米/用户缓存//应用程序缓存/<application_xxxxxxxxxxx_xxxxxxx>,/数据/11/Yarn/纳米/用户缓存//应用程序缓存/<application_xxxxxxxxxxx_xxxxxxx>,...
但是是的,它基本上会指向
DiskBlockManager
创建的UUID随机化子目录的父目录(由YARN创建),正如@KoedIt提到的:1szpjjfi2#
这将取决于您的集群设置和您的Spark版本,但您或多或少会看到正确的位置。
对于这个解释,我将谈论Spark v3.3.1。这是截至本文发表时的最新版本。
在
org.apache.spark.util.Utils
中有一个有趣的方法叫做getConfiguredLocalDirs
,它看起来像这样:这很有趣,因为它让我们了解了每个配置设置的优先级顺序。
getYarnLocalDirs
应该提供本地目录,这取决于LOCAL_DIRS
环境变量SPARK_EXECUTOR_DIRS
,则它将是其中之一SPARK_LOCAL_DIRS
,则它将是以下值之一MESOS_SANDBOX
和!shuffleServiceEnabled
,那么它就是MESOS_SANDBOX
spark.local.dir
,它将是java.io.tmpdir
现在,我们如何找到此目录?
幸运的是,在
DiskBlockManager.createLocalDirs
中有一个很好的日志记录行,如果日志记录级别是INFO,它会打印出这个目录。So, set your default logging level to INFO in log4j.properties ( like so ), restart your spark application and you should be getting a line saying something like
Created local directory at YOUR-DIR-HERE