首页 文章

在其他应用程序访问数据时替换HDFS文件

提问于
浏览
1

我一直在研究刷新HDFS文件的方法,而其他消费者/应用程序访问数据 . 我有一个HDFS目录,其中的文件可供用户访问,我需要每天更换最新的传入数据,我的刷新过程只有几秒/毫秒 . 但仍然面临的挑战是,由于此刷新过程,已经读取此数据以进行分析的作业将受到影响 . 我刷新文件的方法不是将spark作业结果数据写入用户访问的实际数据位置,而是首先将数据写入临时位置,然后用hdfs文件替换API替换 . 但我的问题仍然没有解决 . 请建议任何解决方案或解决方法来处理HDFS文件替换而不会对下游产生影响 .

val conf: Configuration = new Configuration()
      val fs: FileSystem = FileSystem.get(conf)
      val currentDate = java.time.LocalDate.now
      val destPath = outputPath + "/data"
      val archivePath = outputPath + "/archive/" + currentDate

      val dataTempPath = new Path(destPath + "_temp")
      val dataPath = new Path(destPath)
      if(fs.exists(dataPath)){
        fs.delete(dataPath, true)
      }
      if(fs.exists(dataTempPath)){
        fs.rename(dataTempPath, dataPath)
      }

      val archiveTempData = new Path(archivePath+"_temp")
      val archive = new Path(archivePath)
      if(fs.exists(archive)){
        fs.delete(archive,true)
      }
      if(fs.exists(archiveTempData)){
        fs.rename(archiveTempData, archive)
      }

1 回答

  • 1

    Simpler approach

    每个源或目标循环使用2个HDFS位置,分别用表defs t1_x和t2_x加载,并使用view_x同样在t1_x和t2_x之间切换 .

    查询应始终使用view_x .

    您可以在下一个周期之前及时清理不再使用的HDFS位置 .

    线索是将新旧数据保留一段时间 .

    Comment to make 唯一的缺点是,如果需要针对旧版本的数据运行一组查询 . 如果更改的数据具有"added to"的性质,那么没有问题,但如果它可以覆盖,则存在问题 .

    More complicated approach

    在后一种情况下,不确定是否存在问题,您需要应用如下所述的烦人解决方案 .

    这是用一些值来版本化数据(通过分区) .

    并使用current_version控制表并选择此值并在所有相关查询中使用它,直到您可以使用新的current_version .

    然后进行维护 .

相关问题