我有一个应用程序,使用map reduce将数据从远程系统传输到HDFS。然而,当我不得不处理网络故障等问题时,我迷失了方向。也就是说,当远程数据源的连接丢失并且我的mapreduce应用程序无法访问数据时。我总是可以重新启动作业,但是当数据很大时,重新启动是一个昂贵的选择。我知道mapreduce会创建临时文件夹,但它会将数据放在那里吗?我可以读出那些数据吗然后我可以以某种方式开始阅读其余的数据吗?
答案 0 :(得分:1)
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文件系统。当你有很多小文件时,它就可以工作。
答案 1 :(得分:0)
您尚未指定将数据导入HDFS / Hadoop的工具。
可用于将数据输入HDFS / Hadoop以支持可恢复性的一些工具是Flume,Scribe& Chukwa(用于日志文件)和它们都支持各种可配置级别的文件传输可靠性保证,Sqoop用于将关系数据库数据传输到HDFS或Hive等。