Uploaded image for project: 'Hadoop HDFS'
  1. Hadoop HDFS
  2. HDFS-11881

NameNode consumes a lot of memory for snapshot diff report generation

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • 3.0.0-alpha1
    • 2.9.0, 3.0.0-alpha4, 2.8.2
    • hdfs, snapshots
    • None

    Description

      Problem:
      HDFS supports a snapshot diff tool which can generate a detailed report of modified, created, deleted and renamed files between any 2 snapshots.

      hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot>
      

      However, if the diff list between 2 snapshots happens to be huge, in the order of millions, then NameNode can consume a lot of memory while generating the huge diff report. In a few cases, we are seeing NameNode getting into a long GC lasting for few minutes to make room for this burst in memory requirement during snapshot diff report generation.

      RootCause:

      • NameNode tries to generate the diff report with all diff entries at once which puts undue pressure
      • Each diff report entry has the diff type (enum), source path byte array, and destination path byte array to the minimum. Let's take file deletions use case. For file deletions, there would be only source or destination paths in the diff report entry. Let's assume these deleted files on average take 128Bytes for the path. 4 million file deletion captured in diff report will thus need 512MB of memory
      • The snapshot diff report uses simple java ArrayList which tries to double its backing contiguous memory chunk every time the usage factor crosses the capacity threshold. So, a 512MB memory requirement might be internally asking for a much larger contiguous memory chunk

      Proposal:

      • Make NameNode snapshot diff report service follow the batch model (like directory listing service). Clients (hdfs snapshotDiff command) will then receive diff report in small batches, and need to iterate several times to get the full list.
      • Additionally, snap diff report service in the NameNode can make use of ChunkedArrayList data structure instead of the current ArrayList so as to avoid the curse of fragmentation and large contiguous memory requirement.

      Attachments

        1. HDFS-11881.01.patch
          7 kB
          Manoj Govindassamy
        2. 1_ChunkedArrayList_SnapshotDiffReport.png
          148 kB
          Manoj Govindassamy
        3. 2_ArrayList_SnapshotDiffReport.png
          146 kB
          Manoj Govindassamy

        Issue Links

          Activity

            People

              manojg Manoj Govindassamy
              manojg Manoj Govindassamy
              Votes:
              1 Vote for this issue
              Watchers:
              11 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: