map 或 reduce 任务的临时输出数据在哪里
Where is the temp output data of map or reduce tasks
使用 MapReduce v2,当所有任务完成时,来自 map 或 reduce 任务的输出数据将保存在本地磁盘或 HDFS 中。
由于任务在不同时间结束,我希望数据是在任务完成时写入的。例如,任务 0 完成并写入输出,但任务 1 和任务 2 仍然是 运行。现在task 2写完输出了,而task 1还是运行。最后,任务 1 完成并写入最后一个输出。但这不会发生。当所有任务完成时,输出仅出现在本地磁盘或 HDFS 中。
我想在生成数据时访问任务输出。所有任务完成前的输出数据在哪里?
更新
我在 mapred-site.xml
中设置了这些参数之后
<property><name>mapreduce.task.files.preserve.failedtasks</name><value>true</value></property>
<property><name>mapreduce.task.files.preserve.filepattern</name><value>*</value></property>
以及 hdfs-site.xml
中的这些参数
<property> <name>dfs.name.dir</name> <value>/tmp/data/dfs/name/</value> </property>
<property> <name>dfs.data.dir</name> <value>/tmp/data/dfs/data/</value> </property>
而这个值在core-site.xml
<property> <name>hadoop.tmp.dir</name> <value>/tmp/hadoop-temp</value> </property>
但我仍然找不到中间输出或最终输出的保存位置,因为它们是由任务生成的。
我列出了 hdfs dfs -ls -R /
中的所有目录,而在 tmp
目录中我只找到了作业配置文件。
drwx------ - root supergroup 0 2016-08-11 16:17 /tmp/hadoop-yarn/staging/root/.staging/job_1470912033891_0002
-rw-r--r-- 1 root supergroup 0 2016-08-11 16:17 /tmp/hadoop-yarn/staging/root/.staging/job_1470912033891_0002/COMMIT_STARTED
-rw-r--r-- 1 root supergroup 0 2016-08-11 16:17 /tmp/hadoop-yarn/staging/root/.staging/job_1470912033891_0002/COMMIT_SUCCESS
-rw-r--r-- 10 root supergroup 112872 2016-08-11 16:14 /tmp/hadoop-yarn/staging/root/.staging/job_1470912033891_0002/job.jar
-rw-r--r-- 10 root supergroup 6641 2016-08-11 16:14 /tmp/hadoop-yarn/staging/root/.staging/job_1470912033891_0002/job.split
-rw-r--r-- 1 root supergroup 797 2016-08-11 16:14 /tmp/hadoop-yarn/staging/root/.staging/job_1470912033891_0002/job.splitmetainfo
-rw-r--r-- 1 root supergroup 88675 2016-08-11 16:14 /tmp/hadoop-yarn/staging/root/.staging/job_1470912033891_0002/job.xml
-rw-r--r-- 1 root supergroup 439848 2016-08-11 16:17 /tmp/hadoop-yarn/staging/root/.staging/job_1470912033891_0002/job_1470912033891_0002_1.jhist
-rw-r--r-- 1 root supergroup 105176 2016-08-11 16:14 /tmp/hadoop-yarn/staging/root/.staging/job_1470912033891_0002/job_1470912033891_0002_1_conf.xml
输出保存在哪里?我说的是任务生成时存储的输出,而不是所有映射或化简任务完成时的最终输出。
HDFS /tmp 目录主要用作mapreduce 操作期间的临时存储。 Mapreduce 工件、中间数据等将保存在此目录下。当 mapreduce 作业执行完成时,这些文件将被自动清除。如果删除此临时文件,可能会影响当前 运行 个 mapreduce 作业。
来自this Whosebug link的回答:
It's not a good practice to depend on temporary files, whose location and format can change anytime between releases.
Anyway, setting mapreduce.task.files.preserve.failedtasks
to true will keep the temporary files for all the failed tasks and setting mapreduce.task.files.preserve.filepattern
to regex of the ID of the task will keep the temporary files for the matching pattern irrespective of the task success or failure.
同一个 post 中还有更多信息。
一个任务的输出put在<output dir>/_temporary/1/_temporary
.
使用 MapReduce v2,当所有任务完成时,来自 map 或 reduce 任务的输出数据将保存在本地磁盘或 HDFS 中。
由于任务在不同时间结束,我希望数据是在任务完成时写入的。例如,任务 0 完成并写入输出,但任务 1 和任务 2 仍然是 运行。现在task 2写完输出了,而task 1还是运行。最后,任务 1 完成并写入最后一个输出。但这不会发生。当所有任务完成时,输出仅出现在本地磁盘或 HDFS 中。
我想在生成数据时访问任务输出。所有任务完成前的输出数据在哪里?
更新
我在 mapred-site.xml
<property><name>mapreduce.task.files.preserve.failedtasks</name><value>true</value></property>
<property><name>mapreduce.task.files.preserve.filepattern</name><value>*</value></property>
以及 hdfs-site.xml
<property> <name>dfs.name.dir</name> <value>/tmp/data/dfs/name/</value> </property>
<property> <name>dfs.data.dir</name> <value>/tmp/data/dfs/data/</value> </property>
而这个值在core-site.xml
<property> <name>hadoop.tmp.dir</name> <value>/tmp/hadoop-temp</value> </property>
但我仍然找不到中间输出或最终输出的保存位置,因为它们是由任务生成的。
我列出了 hdfs dfs -ls -R /
中的所有目录,而在 tmp
目录中我只找到了作业配置文件。
drwx------ - root supergroup 0 2016-08-11 16:17 /tmp/hadoop-yarn/staging/root/.staging/job_1470912033891_0002
-rw-r--r-- 1 root supergroup 0 2016-08-11 16:17 /tmp/hadoop-yarn/staging/root/.staging/job_1470912033891_0002/COMMIT_STARTED
-rw-r--r-- 1 root supergroup 0 2016-08-11 16:17 /tmp/hadoop-yarn/staging/root/.staging/job_1470912033891_0002/COMMIT_SUCCESS
-rw-r--r-- 10 root supergroup 112872 2016-08-11 16:14 /tmp/hadoop-yarn/staging/root/.staging/job_1470912033891_0002/job.jar
-rw-r--r-- 10 root supergroup 6641 2016-08-11 16:14 /tmp/hadoop-yarn/staging/root/.staging/job_1470912033891_0002/job.split
-rw-r--r-- 1 root supergroup 797 2016-08-11 16:14 /tmp/hadoop-yarn/staging/root/.staging/job_1470912033891_0002/job.splitmetainfo
-rw-r--r-- 1 root supergroup 88675 2016-08-11 16:14 /tmp/hadoop-yarn/staging/root/.staging/job_1470912033891_0002/job.xml
-rw-r--r-- 1 root supergroup 439848 2016-08-11 16:17 /tmp/hadoop-yarn/staging/root/.staging/job_1470912033891_0002/job_1470912033891_0002_1.jhist
-rw-r--r-- 1 root supergroup 105176 2016-08-11 16:14 /tmp/hadoop-yarn/staging/root/.staging/job_1470912033891_0002/job_1470912033891_0002_1_conf.xml
输出保存在哪里?我说的是任务生成时存储的输出,而不是所有映射或化简任务完成时的最终输出。
HDFS /tmp 目录主要用作mapreduce 操作期间的临时存储。 Mapreduce 工件、中间数据等将保存在此目录下。当 mapreduce 作业执行完成时,这些文件将被自动清除。如果删除此临时文件,可能会影响当前 运行 个 mapreduce 作业。
来自this Whosebug link的回答:
It's not a good practice to depend on temporary files, whose location and format can change anytime between releases.
Anyway, setting
mapreduce.task.files.preserve.failedtasks
to true will keep the temporary files for all the failed tasks and settingmapreduce.task.files.preserve.filepattern
to regex of the ID of the task will keep the temporary files for the matching pattern irrespective of the task success or failure.
同一个 post 中还有更多信息。
一个任务的输出put在<output dir>/_temporary/1/_temporary
.