Spark写Hbase如何提高Bulkload的速度


  对于Hbase的Bulkload基本流程这里就不多介绍可以看Bulkload流程介绍,本问主要介绍如何提升Bulkload的方式。
  很多时候我们在写HFile的时候都会进行repartition使用的是repartitionAndSortWithinPartitions,其中Spark也提供几种repartition的实现如HashPartitioner、RangePartitioner,但当数据量大的时候就会出现性能问题,就会变慢。那如何解决呢?

思路
Bulkload总体分两步:

  1. 按照Hbase的文件格式写HFile;
  2. 把写好的HFile load到Hbase对应分区里。

  第一步影响写文件的速度、第二步影响load的速度。在load的时候,是会按照Hbase的分区,把数据放到对应分区里面,这里面就会有两个问题,1.如果一个HFile文件对应多分区数据,在load的时候就会进行文件拆分(关键),2.如果多个文件对应一个分区,那可能进行合并。也就是说load的时候可能会进行拆分和合并操作,关键就在于你写HFile时的方式是如何。如果使用HashPartitioner、RangePartitioner方式基本上都会拆分,这也就会影响load的性能,因为数据并没有和Hbase的分区对齐
  这样一来思路就有了,分区对齐,写入HFile的数据按照Hbase的分区进行写入,数据一一对齐。保证每个写入的HFile文件都和Hbase的分区一一对应,这样在load的时候就不会进行拆分和合并了。具体看代码扩展Partitioner

class BulkLoadPartitioner(startKeys:Array[Array[Byte]])
  extends Partitioner {
  override def numPartitions: Int = if (startKeys.length == 0) 1 else startKeys.length

  override def getPartition(rowKey: Any): Int = {

    val comparator: Comparator[Array[Byte]] = new Comparator[Array[Byte]] {
      override def compare(o1: Array[Byte], o2: Array[Byte]): Int = {
        Bytes.compareTo(o1, o2)
      }
    }
    var partition = util.Arrays.binarySearch(startKeys, rowKey, comparator)
    if (partition < 0)
      partition = partition * -1 + -2
    if (partition < 0)
      partition = 0
    partition
  }
}

注意:

  1. Hbase的分区需要先进行预分区。
  2. 如果发现Load的时间远远高于写HFile的时间时候,就可以使用这种方式。
  3. 提高HFile的写入速度和Hbase的分区数有关。

相关推荐

  1. SparkHbase如何提高Bulkload速度

    2024-05-13 06:06:09       38 阅读
  2. Spark读取Hive数据或文件如何提升速度优化思路

    2024-05-13 06:06:09       24 阅读
  3. HBASE学习九:数据写入 -> BulkLoad

    2024-05-13 06:06:09       53 阅读
  4. 如何提高MySQL DELETE 速度

    2024-05-13 06:06:09       35 阅读
  5. PostgreSQLpg_bulkload工具

    2024-05-13 06:06:09       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-13 06:06:09       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-13 06:06:09       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-13 06:06:09       87 阅读
  4. Python语言-面向对象

    2024-05-13 06:06:09       96 阅读

热门阅读

  1. SpringMVC

    SpringMVC

    2024-05-13 06:06:09      21 阅读
  2. 单元测试之JUnit5知识点总结及代码示例

    2024-05-13 06:06:09       23 阅读
  3. pytest(一)

    2024-05-13 06:06:09       26 阅读
  4. linux使用/etc/hosts.deny拒绝恶意ssh到本机

    2024-05-13 06:06:09       31 阅读
  5. [力扣题解]406. 根据身高重建队列

    2024-05-13 06:06:09       31 阅读
  6. LeetCode刷题笔记之图论

    2024-05-13 06:06:09       24 阅读
  7. Redis 本机无法访问

    2024-05-13 06:06:09       31 阅读