我有一个使用 map reduce 将数据从远程系统传输到 HDFS 的应用程序。但是,当我必须处理网络故障等问题时,我会迷失方向。也就是说,当来自远程数据源的连接丢失并且我的 mapreduce 应用程序不再可以访问数据时。我总是可以重新开始工作,但是当数据很大时,重新启动是一个昂贵的选择。我知道 mapreduce 会创建临时文件夹,但它会将数据放在那里吗?我可以读出这些数据然后我能以某种方式开始读取其余的数据吗?
2 回答
mapreduce 作业可以写入任意文件,而不仅仅是 Hadoop 管理的文件。
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
out = fs.create(new Path(fileName));
使用此代码,您可以创建与本地文件系统中的普通文件一样工作的任意文件。然后,您管理连接异常,以便当源不可访问时,您可以很好地关闭文件并记录发生中断的某处(例如,在 HDFS 本身中)以及发生中断的时间点。在 FTP 的情况下,您可以只写文件路径和文件夹的列表。当作业完成下载文件时,将其路径写入下载列表,当整个文件夹下载时写入文件夹路径,因此在恢复的情况下,您不必遍历目录内容来检查所有文件是否已下载.
另一方面,在程序启动时,它会检查这个文件,以决定之前的尝试是否失败,以及从哪里开始下载。
一般来说,如果超时没有写入/读取任何内容,Hadoop 会终止您的程序。你的应用程序可以告诉它等待,但一般来说有一个空闲的工作是不好的,所以最好结束工作而不是等待网络再次工作。
您还可以通过以下方式创建自己的文件编写器:
conf.setOutputFormat(MyOwnOutputFormat.class);
您的文件编写器可以以您喜欢的格式保存自己的临时文件,因此如果应用程序崩溃,您知道文件是如何保存的。HDFS 默认情况下以 64MB 的块保存文件,当作业失败时,除非您使用自己的编写器,否则您甚至可能没有临时文件。
这是一个通用的解决方案,它取决于哪个是数据源(ftp、samba、http...)及其对下载简历的支持。
编辑:在 FTP 的情况下,您可以使用csync将 FTP 服务器与本地文件系统同步,并使用 hdfs-fuse 挂载 HDFS 文件系统。当您有许多小文件时,它可以工作。
您尚未指定用于将数据输入 HDFS/Hadoop 的工具。
Flume、Scribe 和 Chukwa(用于日志文件)可用于将数据输入 HDFS/Hadoop 并支持可恢复性的一些工具,它们都支持各种可配置级别的文件传输可靠性保证,以及用于将关系数据库数据传输到 Sqoop HDFS 或 Hive 等