контрольная точка: всегда ли fsimage копируется из namenode

В контрольно-пропускных пунктах Definitive Guides говорят

1. The secondary asks the primary to roll its edits file, so new edits goes to a new file
2. The secondary retrieves fsimage and edits from primary (using HTTP GET)

и в конце контрольной точки вторичный namenode отправляет обновленный fsimage на namenode.

Теперь вторичный namenode имеет последний fsimage, в следующей контрольной точке вторичный namenode снова скопирует fsimage из namenode?? Если да то почему?? не может ли он просто сравнить два, используя контрольную сумму


person banjara    schedule 04.07.2013    source источник


Ответы (1)


Да, когда размер файла редактирования в namenode увеличивается до определенного размера (по умолчанию: fs.checkpoint.size= 4194304), вторичное имя будет копировать fsimage и файл редактирования с сервера namenode.

Этот код из SecondaryNameNode.java объясняет, что -

        long size = namenode.getEditLogSize();
        if (size >= checkpointSize || 
            now >= lastCheckpointTime + 1000 * checkpointPeriod) {
          doCheckpoint();
          lastCheckpointTime = now;
        }

Пожалуйста, проверьте, когда вызывается doCheckpoint();.

Ответ на вопрос, почему, находится в дизайне, которому следует Hadoop (хотя я не знаю, почему он следует этому дизайну) - см. Код ниже, что делается (я сохраняю только утверждения, относящиеся к этому вопросу). Вероятно, вы видите, как вызываются функции downloadCheckpointFiles(sig) и doMerge(sig).

/**
   * Create a new checkpoint
   */
  void doCheckpoint() throws IOException {

    //---other code skipped---

    // Tell the namenode to start logging transactions in a new edit file
    // Retuns a token that would be used to upload the merged image.
    CheckpointSignature sig = (CheckpointSignature)namenode.rollEditLog();


    downloadCheckpointFiles(sig);   // Fetch fsimage and edits
    doMerge(sig);                   // Do the merge

    //
    // Upload the new image into the NameNode. Then tell the Namenode
    // to make this new uploaded image as the most current image.
    //
    putFSImage(sig);


    namenode.rollFsImage();
    checkpointImage.endCheckpoint();

     //----other code skipped----
  }

Затем, как downloadCheckpointFiles(sig); звонил изнутри doCheckpoint() сверху. См. код ниже -

/**
       * Download <code>fsimage</code> and <code>edits</code>
       * files from the name-node.
       * @throws IOException
       */
      private void downloadCheckpointFiles(final CheckpointSignature sig
                                          ) throws IOException {
        try {
          UserGroupInformation.getCurrentUser().doAs(new PrivilegedExceptionAction<Void>() {

            @Override
            public Void run() throws Exception {


              // get fsimage
              String fileid = "getimage=1";
              File[] srcNames = checkpointImage.getImageFiles();
              assert srcNames.length > 0 : "No checkpoint targets.";
              TransferFsImage.getFileClient(fsName, fileid, srcNames);
              LOG.info("Downloaded file " + srcNames[0].getName() + " size " +
                       srcNames[0].length() + " bytes.");

              // get edits file
              fileid = "getedit=1";
              srcNames = checkpointImage.getEditsFiles();
              assert srcNames.length > 0 : "No checkpoint targets.";
              TransferFsImage.getFileClient(fsName, fileid, srcNames);
              LOG.info("Downloaded file " + srcNames[0].getName() + " size " +
                  srcNames[0].length() + " bytes.");

              checkpointImage.checkpointUploadDone();
              return null;
            }
          });
        } catch (InterruptedException e) {
          throw new RuntimeException(e);
        }

      }

И на ваш третий последний вопрос - "не может ли он просто сравнить два, используя контрольную сумму" -

Одна из возможных причин заключается в том, что они не хотят рисковать, поскольку контрольная сумма для двух разных файлов может иногда совпадать. Скажем, в Namenode у вас есть fsImage, который отличается от того, что находится во вторичном namenode, но их контрольная сумма каким-то образом становится одинаковой. Это может случиться, о чем вы никогда не узнаете. Копирование кажется лучшим вариантом, чтобы гарантировать, что копии одинаковы.

Надеюсь это поможет.

person SSaikia_JtheRocker    schedule 04.07.2013
comment
Спасибо за ответ. После 1-й контрольной точки и namenode, и вторичный namenode имеют одинаковый fsimage. для следующего запуска вместо прямого копирования fsimage вторичный namenode может сравнить контрольную сумму локальной копии fsimage и копии на основном namenode, если они отличаются, только тогда скопируйте fsimage, в противном случае используйте локальную копию - person banjara; 05.07.2013
comment
Может быть потому, что контрольная сумма для двух разных файлов может иногда совпадать. - person SSaikia_JtheRocker; 05.07.2013
comment
Обновил мой ответ соответственно. Взглянуть! Спасибо! - person SSaikia_JtheRocker; 05.07.2013
comment
Проверьте эту ссылку для примера: win.tue.nl/hashclash/SoftIntCodeSign - person SSaikia_JtheRocker; 05.07.2013
comment
они могут использовать лучшую контрольную сумму, например sha1024. - person banjara; 05.07.2013
comment
Вы никогда не знаете, как это может быть взломано даже злоумышленниками :) sha1024 лучше не работает на 100%, а Hadoop чертовски публичен, следующая большая вещь. Не думаю, что они действительно хотели бы рисковать. - person SSaikia_JtheRocker; 05.07.2013
comment
они используют контрольные суммы для проверки данных блока. - person banjara; 05.07.2013
comment
Спасибо, на мой основной вопрос ответили, что он всегда копирует fsimage. - person banjara; 05.07.2013