`
BlackWing
  • 浏览: 200066 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

LoadIncrementalHFiles是copy而不是move的疑惑

阅读更多
转载请标明出处:http://blackwing.iteye.com/blog/1991901

之前在另一篇文章里实现的自定义job生成HFile并使用LoadIncrementalHFiles  入库HBase :http://blackwing.iteye.com/blog/1991380

但发现入库时,非常的慢,而且几次都失败了,明明官方教材说这个操作是move的:
The completebulkload utility will move generated StoreFiles into an HBase table. This utility is often used in conjunction with output from Section 15.1.10, “ImportTsv”.


再次验证google的强大,发现官方有这个问题的解释:
https://issues.apache.org/jira/browse/HBASE-9537
https://issues.apache.org/jira/browse/HBASE-8304


主要问题是,批量导入HBase时,如果hdfs地址没有写端口,会认为是两个不同文件系统,所以要copy,而如果当是同一文件系统时,则是move,秒级入库了2GB的文件。
指令差别如下:
copy的场景:
./hbase-0.96.0-hadoop1/bin/hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles hdfs://namenode/outputtsv gonghui_test


move的场景:
./hbase-0.96.0-hadoop1/bin/hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles hdfs://namenode:8020/outputtsv gonghui_test


剩下的需要好好看看源码增加理解了。
没有secure authentication时,调用流程如下:
LoadIncrementalHFiles.doBulkLoad(Path hfofDir, final HTable table) -->
 LoadIncrementalHFiles.bulkLoadPhase(final HTable table, final HConnection conn,ExecutorService pool, Deque<LoadQueueItem> queue,final Multimap<ByteBuffer, LoadQueueItem> regionGroups) -->

 LoadIncrementalHFiles.tryAtomicRegionLoad(final HConnection conn,final TableName tableName, final byte[] first, Collection<LoadQueueItem> lqis) -->

 ProtobufUtil.bulkLoadHFile(final ClientService.BlockingInterface client,final List<Pair<byte[], String>> familyPaths,final byte[] regionName, boolean assignSeqNum) -->
 


其中ProtobufUtil.bulkLoadHFile()代码如下:
/**
   * A helper to bulk load a list of HFiles using client protocol.
   *
   * @param client
   * @param familyPaths
   * @param regionName
   * @param assignSeqNum
   * @return true if all are loaded
   * @throws IOException
   */
  public static boolean bulkLoadHFile(final ClientService.BlockingInterface client,
      final List<Pair<byte[], String>> familyPaths,
      final byte[] regionName, boolean assignSeqNum) throws IOException {
    BulkLoadHFileRequest request =
      RequestConverter.buildBulkLoadHFileRequest(familyPaths, regionName, assignSeqNum);
    try {
      BulkLoadHFileResponse response =
        client.bulkLoadHFile(null, request);
      return response.getLoaded();
    } catch (ServiceException se) {
      throw getRemoteException(se);
    }
  }

其中client是HRegionServer实例。
之后调用过程为:
HRegionServer --> HRegion.bulkLoadHFiles(...) --> HStore.bulkLoadHFile(...) --> HRegionFileSystem.bulkLoadStoreFile(...)

在HRegionFileSystem.bulkLoadStoreFile(...)这个方法判断源路径、目标路径是否同一个文件系统:
 /**
   * Bulk load: Add a specified store file to the specified family.
   * If the source file is on the same different file-system is moved from the
   * source location to the destination location, otherwise is copied over.
   *
   * @param familyName Family that will gain the file
   * @param srcPath {@link Path} to the file to import
   * @param seqNum Bulk Load sequence number
   * @return The destination {@link Path} of the bulk loaded file
   * @throws IOException
   */
  Path bulkLoadStoreFile(final String familyName, Path srcPath, long seqNum)
      throws IOException {
    // Copy the file if it's on another filesystem
    FileSystem srcFs = srcPath.getFileSystem(conf);
    FileSystem desFs = fs instanceof HFileSystem ? ((HFileSystem)fs).getBackingFs() : fs;

    // We can't compare FileSystem instances as equals() includes UGI instance
    // as part of the comparison and won't work when doing SecureBulkLoad
    // TODO deal with viewFS
    if (!srcFs.getUri().equals(desFs.getUri())) {
      LOG.info("Bulk-load file " + srcPath + " is on different filesystem than " +
          "the destination store. Copying file over to destination filesystem.");
      Path tmpPath = createTempName();
     //不是同一文件系统,则拷贝
      FileUtil.copy(srcFs, srcPath, fs, tmpPath, false, conf);
      LOG.info("Copied " + srcPath + " to temporary path on destination filesystem: " + tmpPath);
      srcPath = tmpPath;
    }

    return commitStoreFile(familyName, srcPath, seqNum, true);
  }


如果不是一个文件系统,那么就调用:
FileUtil.copy(...)

进行拷贝。

最终进行move操作的其实是一个rename操作:
 /**
   * Move the file from a build/temp location to the main family store directory.
   * @param familyName Family that will gain the file
   * @param buildPath {@link Path} to the file to commit.
   * @param seqNum Sequence Number to append to the file name (less then 0 if no sequence number)
   * @param generateNewName False if you want to keep the buildPath name
   * @return The new {@link Path} of the committed file
   * @throws IOException
   */
  private Path commitStoreFile(final String familyName, final Path buildPath,
      final long seqNum, final boolean generateNewName) throws IOException {
    Path storeDir = getStoreDir(familyName);
    if(!fs.exists(storeDir) && !createDir(storeDir))
      throw new IOException("Failed creating " + storeDir);
    
    String name = buildPath.getName();
    if (generateNewName) {
      name = generateUniqueName((seqNum < 0) ? null : "_SeqId_" + seqNum + "_");
    }
    Path dstPath = new Path(storeDir, name);
    if (!fs.exists(buildPath)) {
      throw new FileNotFoundException(buildPath.toString());
    }
    LOG.debug("Committing store file " + buildPath + " as " + dstPath);
    // buildPath exists, therefore not doing an exists() check.
    //在这里进行rename
    if (!rename(buildPath, dstPath)) {
      throw new IOException("Failed rename of " + buildPath + " to " + dstPath);
    }
    return dstPath;
  }


rename函数如下:
/**
   * Renames a directory. Assumes the user has already checked for this directory existence.
   * @param srcpath
   * @param dstPath
   * @return true if rename is successful.
   * @throws IOException
   */
  boolean rename(Path srcpath, Path dstPath) throws IOException {
    IOException lastIOE = null;
    int i = 0;
    do {
      try {
        return fs.rename(srcpath, dstPath);
      } catch (IOException ioe) {
        lastIOE = ioe;
        if (!fs.exists(srcpath) && fs.exists(dstPath)) return true; // successful move
        // dir is not there, retry after some time.
        sleepBeforeRetry("Rename Directory", i+1);
      }
    } while (++i <= hdfsClientRetriesNumber);
    throw new IOException("Exception in rename", lastIOE);
  }




分享到:
评论

相关推荐

    copy_move_forgery_detection-master.zip_copy move_copy move matla

    本项目“copy_move_forgery_detection-master.zip_copy move_copy move matla”专注于利用MATLAB实现加速版的Copy-Move伪造检测算法,以提升检测效率和准确性。 MATLAB,全称Matrix Laboratory,是一款强大的数学...

    algo-copy-move-image-forgery.rar_copy move matlab_copy_move_forg

    DWT-PCA (EVD) Based Copy-move Image Forgery Detection

    Detecting copy-move forgery under affine transforms for image.pdf

    这篇文章的标题为《Detecting copy-move forgery under affine transforms for image.pdf》,而描述表明这是一篇关于图像质量评价的文章,研究者可以免费下载。该文章的标签为“image quality access”,说明其内容...

    CMFD_PM_code.rar_TAMPERING_copy-move_copy_move_篡改_篡改检测

    "CMFD_PM_code.rar"这个压缩包文件,标题中的"TAMPERING_copy-move_copy_move_篡改_篡改检测"表明它包含的是关于“copy-move”类型的篡改检测算法或工具。这种篡改类型是指图像或文件中的某一部分被复制并粘贴到同一...

    Copy-Move-Image-Forgery-Detection-master.zip_copy move forgery_c

    copy move forgery detection matlab program mand source code

    论文研究-Copy-move forgery detection based on KAZE resistant to smooth texture.pdf

    在当前信息时代,数字图像的篡改检测技术对于维护网络信息的真实性与完整性显得尤为重要。本文介绍了一种新颖的篡改检测方法,该方法基于KAZE特征,并且能够有效抵抗平滑纹理带来的检测难题。通过理解与分析给定文件...

    快速copy&move处理文件

    标题中的“快速copy&move处理文件”指的是使用特定软件来高效地进行文件的复制和移动操作,这在处理大量数据时尤其有用。这种工具通常优化了底层的文件传输机制,以实现比系统自带功能更快的速度。 描述部分提到,...

    一种基于局部Hu矩的图像Copy-Move篡改取证方法.pdf

    基于局部Hu矩的图像Copy-Move篡改取证方法 本文提出了一种基于图像矩哈希的篡改检测算法,以检测最常见的图像Copy-Move篡改。该方法将检测图像分为若干相互重叠的区域块,提取各图像块的Hu矩,生成哈希序列,作为该...

    copy move.zip_copy move_forensics_moveii2_区域定位_矩

    综上所述,"copy move forensics" 和 "moveii2" 可能是特定的复制移动检测项目或研究系列,而"区域定位"强调了算法的重点在于确定图像中被篡改的精确位置。通过对Zernike矩的深入理解和应用,我们可以有效地揭示图像...

    matlab_图像copy-move检测 图像篡改检测

    本项目专注于“MATLAB图像copy-move检测”,这是一种常用的图像篡改检测方法。 Copy-Move篡改是指图像中的某个区域被复制并粘贴到图像的另一位置,以掩盖或伪造信息。在MATLAB中实现这种检测,主要涉及以下几个关键...

    fastcopy命令行参数解释

    21. `/junction`:复制junction点,而不是其下的内容。 22. `/symlink`:用符号链接代替实际文件进行复制。 使用示例: - 将`永恒之塔`文件夹从网络共享位置复制到E盘,使用`sync`命令和自动关闭选项:`fastopy.exe...

    高通golden copy验证方案使用说明.docx

    高通 Golden Copy 验证方案使用说明 Golden Copy 验证方案是一种在高通平台上验证 Golden Copy 的方法,该方案旨在确保 Golden Copy 的正确性和可靠性。下面是对 Golden Copy 验证方案的详细说明: 一、 目的 ...

    iCopy解码软件

    《iCopy解码软件详解与应用》 在数字化办公环境中,高效的数据传输和处理是提升工作效率的关键。iCopy解码软件作为一个专为iCopy设备设计的辅助工具,它旨在帮助用户更加便捷地处理由iCopy设备捕获的各类数据,从而...

    fastcopy 快速剪切复制

    而“可整合到右键菜单”意味着用户可以通过鼠标右键直接调用FastCopy,无需打开软件界面,极大地提高了工作效率。小巧方便的特性则意味着FastCopy安装包小,占用系统资源少,对电脑性能影响微乎其微,无论是老旧机器...

    FastCopy快速复制

    如果在复制过程中遇到错误,FastCopy会尝试恢复或者跳过错误文件,避免因单个文件问题而中断整个复制任务。 在安全方面,FastCopy也有出色的表现。它支持在复制前先校验源文件的MD5或CRC值,确保目标文件与源文件的...

    FastCopy 支持断电续传

    在日常工作中,我们经常需要处理大量的数据迁移,而系统自带的复制功能可能无法满足对速度的需求,FastCopy正是为此而生。这款软件通过优化文件传输算法,减少了在复制或移动大文件时可能出现的等待时间。 FastCopy...

Global site tag (gtag.js) - Google Analytics