原子hadoop fs移动
在为我当前的一个项目构建基础设施时,我遇到了替换现有HDFS文件的问题。更准确地说,我想做以下几点:原子hadoop fs移动,hadoop,atomic,hdfs,infrastructure,Hadoop,Atomic,Hdfs,Infrastructure,在为我当前的一个项目构建基础设施时,我遇到了替换现有HDFS文件的问题。更准确地说,我想做以下几点: hdfs:/spool/.../logs/2012-09-26.09.00.log.v1 hdfs:/spool/.../logs/2012-09-26.09.00.log.v2 hdfs:/spool/.../logs/2012-09-26.09.00.log.v3 hdfs:/spool/.../logs/2012-09-26.10.00.log.v1 hdfs:/spool/.../log
hdfs:/spool/.../logs/2012-09-26.09.00.log.v1
hdfs:/spool/.../logs/2012-09-26.09.00.log.v2
hdfs:/spool/.../logs/2012-09-26.09.00.log.v3
hdfs:/spool/.../logs/2012-09-26.10.00.log.v1
hdfs:/spool/.../logs/2012-09-26.10.00.log.v2
我们有一些机器(日志服务器)在不断生成日志。我们有一台专用机器(日志预处理器),负责从日志服务器接收日志块(每个块长约30分钟,大小约500-800 mb),对其进行预处理并上传到Hadoop集群的HDFS
预处理分3步完成:
hdfs:/spool/.../logs/YYYY-MM-DD.HH.MM.log
问题描述:
步骤3中使用的映射随着时间的推移而变化,我们需要通过重新计算步骤3并用新的HDFS文件替换旧的HDFS文件来反映这些变化。至少在过去12小时内,以一定的周期(例如,每10-15分钟)执行此更新。请注意,如果映射已更改,则在同一输入文件上应用步骤3的结果可能会显著不同(它将不仅仅是以前结果的超集/子集)。因此,我们需要覆盖HDFS中的现有文件
但是,我们不能只做hadoop fs-rm,然后再做hadoop fs-copyToLocal,因为如果某个hadoop应用程序正在使用临时删除的文件,那么该应用程序可能会失败。我使用的解决方案是:将一个新文件放在旧文件附近,这些文件具有相同的名称,但表示文件版本的后缀不同。现在布局如下所示:
hdfs:/spool/.../logs/2012-09-26.09.00.log.v1
hdfs:/spool/.../logs/2012-09-26.09.00.log.v2
hdfs:/spool/.../logs/2012-09-26.09.00.log.v3
hdfs:/spool/.../logs/2012-09-26.10.00.log.v1
hdfs:/spool/.../logs/2012-09-26.10.00.log.v2
任何Hadoop应用程序在启动(安装)期间都会选择具有最新版本的文件并使用它们。因此,即使正在进行某些更新,应用程序也不会遇到任何问题,因为没有删除任何输入文件
问题:
提前谢谢 IMO,文件重命名方法绝对适合使用 高达1.x的HDFS缺少原子重命名(它们是脏更新IIRC)-但该操作通常被认为是“原子式”的,并且从来没有给您想到的特定场景带来问题。由于源文件已经创建并关闭,因此您可以依赖于此,而不必担心部分状态 HDFS 2.x以后的版本支持正确的原子重命名(通过一个新的API调用),该重命名已经取代了早期版本的脏重命名。如果使用API,这也是重命名的默认行为