hadoop - 如何从hadoop的临时文件中获取数据?

标签 hadoop mapreduce

我有一个应用程序使用 map reduce 将数据从远程系统传输到 HDFS。然而,当我不得不处理网络故障等问题时,我迷路了。也就是说,当来自远程数据源的连接丢失并且我的 mapreduce 应用程序不再可以访问数据时。我总是可以重新启 Action 业,但是当数据很大时,重新启动是一个昂贵的选择。我知道 mapreduce 会创建临时文件夹,但它会把数据放在那里吗?我能否读出该数据,然后我能否以某种方式开始读取其余数据?

最佳答案

mapreduce 作业可以写入任意文件,而不仅仅是 Hadoop 管理的文件。

Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
out = fs.create(new Path(fileName));

使用此代码,您可以创建任意文件,这些文件像本地文件系统中的普通文件一样工作。然后,您管理连接异常,这样当一个源不可访问时,您可以很好地关闭文件并记录发生中断的某个地方(例如在 HDFS 本​​身中)以及发生中断的时间点。 对于 FTP,您可以只写文件路径和文件夹的列表。当作业完成下载文件时,在下载列表中写下它的路径,当下载整个文件夹时写下文件夹路径,这样在恢复的情况下,您将不必遍历目录内容来检查所有文件是否已下载.

另一方面,在程序启动时,它会检查这个文件来决定之前的尝试是否失败,如果失败的话,从哪里开始下载。

一般来说,如果 Hadoop 没有超时写入/读取任何内容,Hadoop 将终止您的程序。您的应用程序可以告诉它等待,但一般来说,有一个空闲的工作是不好的,所以最好结束工作而不是等待网络再次工作。

您也可以通过这种方式创建自己的文件编写器:

conf.setOutputFormat(MyOwnOutputFormat.class);

您的文件编写器可以以您喜欢的格式保存自己的临时文件,因此如果应用程序崩溃,您知道文件是如何保存的。 HDFS 默认以 64MB 的 block 保存文件,当作业失败时,除非您使用自己的编写器,否则您甚至可能没有临时文件。

这是一个通用的解决方案,它取决于哪个是数据源(ftp、samba、http...)及其对下载简历的支持。

编辑:如果是 FTP,您可以只使用 csync使用本地文件系统同步 FTP 服务器,使用 hdfs-fuse 挂载 HDFS 文件系统。当您有很多小文件时,它会起作用。

关于hadoop - 如何从hadoop的临时文件中获取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13856690/

相关文章:

java - build 象鸟时出错

java - 在 Hive 中创建、添加和使用 UDF

hadoop - 如何获取 Phoenix URL 的 HBase IP 地址

hadoop - outputcollector如何工作?

当文件格式为自定义格式时,Hadoop MultipleOutputs 不会写入多个文件

java - setMapoutputkeyclass和setMapoutputvalueclass方法

hadoop - hadoop RecordReader如何识别记录

amazon-s3 - Hadoop S3设备上没有剩余空间

hadoop - 我可以获得 Hadoop 的分区号​​吗?

hadoop - 从本地通过网络应用程序调用MapReduce