大数据应用之HBase数据插入性能优化实测教程

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介:

引言:

  大家在使用HBase的过程中,总是面临性能优化的问题,本文从HBase客户端参数设置的角度,研究HBase客户端数据批量插入性能优化的问题。事实胜于雄辩,数据比理论更有说服力,基于此,作者设计了这么一个HBase数据插入性能优化实测实验,希望大家用自己的服务器跑出的结果,给自己一个值得信服的结论。

一、客户单优化参数

  1.Put List Size
HBase的Put支持单条插入,也支持批量插入。

2. AutoFlush  
AutoFlush指的是在每次调用HBase的Put操作,是否提交到HBase Server。 默认是true,每次会提交。如果此时是单条插入,就会有更多的IO,从而降低性能

3.Write Buffer Size
Write Buffer Size在AutoFlush为false的时候起作用,默认是2MB,也就是当插入数据超过2MB,就会自动提交到Server

 4.WAL
WAL是Write Ahead Log的缩写,指的是HBase在插入操作前是否写Log。默认是打开,关掉会提高性能,但是如果系统出现故障(负责插入的Region Server  挂掉),数据可能会丢失。

参数

默认值

说明

JVM Heap Size

 

平台不同值不同自行设置

AutoFlush

True

默认逐条提交

Put List Size

1

支持逐条和批量

Write Buffer Size

2M

autoflush配合使用

Write Ahead Log

True

默认开启,需要手动关闭

 

 

 

 

二、源码程序


import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
 
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.MasterNotRunningException;
import org.apache.hadoop.hbase.ZooKeeperConnectionException;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.util.Bytes;

/*
 * -------优化案例说明------------
 * 1.优化参数1:Autoflush                默认关闭,需要手动开启
 * 2.优化参数2:put list size            支持单条与批量
 * 3.优化参数3:JVM heap size             默认值是平台而不同,需要手动设置
 * 4.优化参数4:Write Buffer Size        默认值2M    
 * 5.优化参数5:Write Ahead Log             默认开启,需要手动关闭
 * */

public class TestInsert {
    static Configuration hbaseConfig = null;

    public static void main(String[] args) throws Exception {
        Configuration HBASE_CONFIG = new Configuration();
        HBASE_CONFIG.set("hbase.master", "192.168.230.133:60000");
        HBASE_CONFIG.set("hbase.zookeeper.quorum", "192.168.230.133");
        HBASE_CONFIG.set("hbase.zookeeper.property.clientPort", "2181");
        hbaseConfig = HBaseConfiguration.create(HBASE_CONFIG);
        //关闭wal,autoflush,writebuffer = 24M
        insert(false,false,1024*1024*24);
        //开启AutoFlush,writebuffer = 0
        insert(false,true,0);
        //默认值,全部开启
        insert(true,true,0);
    }

    private static void insert(boolean wal,boolean autoFlush,long writeBuffer)
            throws IOException {
        String tableName="etltest";
        HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig);
        if (hAdmin.tableExists(tableName)) {
            hAdmin.disableTable(tableName);
            hAdmin.deleteTable(tableName);
        }

        HTableDescriptor t = new HTableDescriptor(tableName);
        t.addFamily(new HColumnDescriptor("f1"));
        t.addFamily(new HColumnDescriptor("f2"));
        t.addFamily(new HColumnDescriptor("f3"));
        t.addFamily(new HColumnDescriptor("f4"));
        hAdmin.createTable(t);
        System.out.println("table created");
        
        HTable table = new HTable(hbaseConfig, tableName);
        table.setAutoFlush(autoFlush);
        if(writeBuffer!=0){
            table.setWriteBufferSize(writeBuffer);
        }
        List<Put> lp = new ArrayList<Put>();
        long all = System.currentTimeMillis();
        
        System.out.println("start time = "+all);
        int count = 20000;
        byte[] buffer = new byte[128];
        Random r = new Random();
        for (int i = 1; i <= count; ++i) {
            Put p = new Put(String.format("row d",i).getBytes());
            r.nextBytes(buffer);
            p.add("f1".getBytes(), null, buffer);
            p.add("f2".getBytes(), null, buffer);
            p.add("f3".getBytes(), null, buffer);
            p.add("f4".getBytes(), null, buffer);
            p.setWriteToWAL(wal);
            lp.add(p);
            if(i%1000 == 0){
                table.put(lp);
                lp.clear();
            }
        }
        
        System.out.println("WAL="+wal+",autoFlush="+autoFlush+",buffer="+writeBuffer+",count="+count);
        long end = System.currentTimeMillis();
        System.out.println("total need time = "+ (end - all)*1.0/1000+"s");
        
        
        System.out.println("insert complete"+",costs:"+(System.currentTimeMillis()-all)*1.0/1000+"ms");
    }
}

三、集群配置

3.1 服务器硬件配置清单

序号

节点名称

CUP

内存

硬盘

带宽

1

HMaster

 

 

 

 

2

HregionServer1

 

 

 

 

3

HregionServer2

 

 

 

 

4

 

 

 

 

5

 

 

 

 

 

6

 

 

 

 

 

7

 

 

 

 

 

3.2 客户端硬件配置清单

设备

节点名称

 

Cpu

 

 

内存

 

 

硬盘

 

 

带宽

 

 

四、测试报告

数据量

JVM

AutoFlush

Put List Size

WriteBufferSize

WAL

耗时

1000

512m

false

1000

1024*1024*24

false

 

2000

 

 

 

 

 

 

5000

 

 

 

 

 

 

10000

 

 

 

 

 

 

20000

 

 

 

 

 

 

50000

 

 

 

 

 

 

100000

 

 

 

 

 

 

200000

 

 

 

 

 

 

500000

 

 

 

 

 

 

100000

 

 

 

 

 

 

备注:该技术专题讨论正在群Hadoop高级交流群:293503507同步直播中,敬请关注。


相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
25天前
|
SQL 数据可视化 大数据
从数据小白到大数据达人:一步步成为数据分析专家
从数据小白到大数据达人:一步步成为数据分析专家
203 92
|
23天前
|
存储 搜索推荐 大数据
数据大爆炸:解析大数据的起源及其对未来的启示
数据大爆炸:解析大数据的起源及其对未来的启示
87 15
数据大爆炸:解析大数据的起源及其对未来的启示
|
15天前
|
分布式计算 大数据 流计算
玩转数据:初学者的大数据处理工具指南
玩转数据:初学者的大数据处理工具指南
69 14
|
18天前
|
数据采集 存储 机器学习/深度学习
数据的秘密:如何用大数据分析挖掘商业价值
数据的秘密:如何用大数据分析挖掘商业价值
46 9
|
28天前
|
数据采集 存储 分布式计算
解密大数据:从零开始了解数据海洋
解密大数据:从零开始了解数据海洋
66 17
|
5月前
|
分布式计算 Java Hadoop
java使用hbase、hadoop报错举例
java使用hbase、hadoop报错举例
141 4
|
4月前
|
分布式计算 Hadoop Shell
Hadoop-35 HBase 集群配置和启动 3节点云服务器 集群效果测试 Shell测试
Hadoop-35 HBase 集群配置和启动 3节点云服务器 集群效果测试 Shell测试
114 4
|
4月前
|
SQL 分布式计算 Hadoop
Hadoop-37 HBase集群 JavaAPI 操作3台云服务器 POM 实现增删改查调用操作 列族信息 扫描全表
Hadoop-37 HBase集群 JavaAPI 操作3台云服务器 POM 实现增删改查调用操作 列族信息 扫描全表
54 3
|
4月前
|
分布式计算 Hadoop Shell
Hadoop-36 HBase 3节点云服务器集群 HBase Shell 增删改查 全程多图详细 列族 row key value filter
Hadoop-36 HBase 3节点云服务器集群 HBase Shell 增删改查 全程多图详细 列族 row key value filter
78 3
|
4月前
|
SQL 分布式计算 Hadoop
Hadoop-34 HBase 安装部署 单节点配置 hbase-env hbase-site 超详细图文 附带配置文件
Hadoop-34 HBase 安装部署 单节点配置 hbase-env hbase-site 超详细图文 附带配置文件
143 2