大数据应用之HBase数据插入性能优化实测教程
引言:
大家在使用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 | 默认开启,需要手动关闭 |
… |
|
|
… |
|
|
二、源码程序
1 import java.io.IOException; 2 import java.util.ArrayList; 3 import java.util.List; 4 import java.util.Random; 5 6 import org.apache.hadoop.conf.Configuration; 7 import org.apache.hadoop.hbase.HBaseConfiguration; 8 import org.apache.hadoop.hbase.HColumnDescriptor; 9 import org.apache.hadoop.hbase.HTableDescriptor; 10 import org.apache.hadoop.hbase.KeyValue; 11 import org.apache.hadoop.hbase.MasterNotRunningException; 12 import org.apache.hadoop.hbase.ZooKeeperConnectionException; 13 import org.apache.hadoop.hbase.client.Delete; 14 import org.apache.hadoop.hbase.client.Get; 15 import org.apache.hadoop.hbase.client.HBaseAdmin; 16 import org.apache.hadoop.hbase.client.HTable; 17 import org.apache.hadoop.hbase.client.Result; 18 import org.apache.hadoop.hbase.client.ResultScanner; 19 import org.apache.hadoop.hbase.client.Scan; 20 import org.apache.hadoop.hbase.client.Put; 21 import org.apache.hadoop.hbase.util.Bytes; 22 23 /* 24 * -------优化案例说明------------ 25 * 1.优化参数1:Autoflush 默认关闭,需要手动开启 26 * 2.优化参数2:put list size 支持单条与批量 27 * 3.优化参数3:JVM heap size 默认值是平台而不同,需要手动设置 28 * 4.优化参数4:Write Buffer Size 默认值2M 29 * 5.优化参数5:Write Ahead Log 默认开启,需要手动关闭 30 * */ 31 32 public class TestInsert { 33 static Configuration hbaseConfig = null; 34 35 public static void main(String[] args) throws Exception { 36 Configuration HBASE_CONFIG = new Configuration(); 37 HBASE_CONFIG.set("hbase.master", "192.168.230.133:60000"); 38 HBASE_CONFIG.set("hbase.zookeeper.quorum", "192.168.230.133"); 39 HBASE_CONFIG.set("hbase.zookeeper.property.clientPort", "2181"); 40 hbaseConfig = HBaseConfiguration.create(HBASE_CONFIG); 41 //关闭wal,autoflush,writebuffer = 24M 42 insert(false,false,1024*1024*24); 43 //开启AutoFlush,writebuffer = 0 44 insert(false,true,0); 45 //默认值,全部开启 46 insert(true,true,0); 47 } 48 49 private static void insert(boolean wal,boolean autoFlush,long writeBuffer) 50 throws IOException { 51 String tableName="etltest"; 52 HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig); 53 if (hAdmin.tableExists(tableName)) { 54 hAdmin.disableTable(tableName); 55 hAdmin.deleteTable(tableName); 56 } 57 58 HTableDescriptor t = new HTableDescriptor(tableName); 59 t.addFamily(new HColumnDescriptor("f1")); 60 t.addFamily(new HColumnDescriptor("f2")); 61 t.addFamily(new HColumnDescriptor("f3")); 62 t.addFamily(new HColumnDescriptor("f4")); 63 hAdmin.createTable(t); 64 System.out.println("table created"); 65 66 HTable table = new HTable(hbaseConfig, tableName); 67 table.setAutoFlush(autoFlush); 68 if(writeBuffer!=0){ 69 table.setWriteBufferSize(writeBuffer); 70 } 71 List<Put> lp = new ArrayList<Put>(); 72 long all = System.currentTimeMillis(); 73 74 System.out.println("start time = "+all); 75 int count = 20000; 76 byte[] buffer = new byte[128]; 77 Random r = new Random(); 78 for (int i = 1; i <= count; ++i) { 79 Put p = new Put(String.format("row d",i).getBytes()); 80 r.nextBytes(buffer); 81 p.add("f1".getBytes(), null, buffer); 82 p.add("f2".getBytes(), null, buffer); 83 p.add("f3".getBytes(), null, buffer); 84 p.add("f4".getBytes(), null, buffer); 85 p.setWriteToWAL(wal); 86 lp.add(p); 87 if(i%1000 == 0){ 88 table.put(lp); 89 lp.clear(); 90 } 91 } 92 93 System.out.println("WAL="+wal+",autoFlush="+autoFlush+",buffer="+writeBuffer+",count="+count); 94 long end = System.currentTimeMillis(); 95 System.out.println("total need time = "+ (end - all)*1.0/1000+"s"); 96 97 98 System.out.println("insert complete"+",costs:"+(System.currentTimeMillis()-all)*1.0/1000+"ms"); 99 } 100 }
三、集群配置
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同步直播中,敬请关注。
作者:张子良
出处:http://www.cnblogs.com/hadoopdev
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
HBase Shell输入命令无法删除问题解决技巧
一、引言: HBase shell使用过程中,使用CRT客户端,命令输入后无法删除一直困绕着我,今天终于受不了,几番度娘,谷哥之后,终于有了解决方法,特共享给大家。 二、操作步骤 secureCRT中,点击【选项】【回话选项】【终端】【仿真】,右边的终端选择linux 英文版本请对应选择输入: 三、删除操作 执行删除操作时,需要使用组合键:Ctrl+Back Space同时按下,不妨现在就开始尝试一下吧。 四、遗憾 我一直比较喜欢黄色字体,黑色背景,设置Linux后原来的背景色不起作用了。也不知道是什么原因导致的,希望下一步能找到答案。 作者:张子良 出处:http://www.cnblogs.com/hadoopdev 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
- 下一篇
远程提交Map/Reduce任务
1. 将开发好MR代码打包成jar。添加到distributed cache中。 Xml代码 bin/hadoopfs-copyFromLocal/root/stat-analysis-mapred-1.0-SNAPSHOT.jar/user/root/lib bin/hadoop fs -copyFromLocal /root/stat-analysis-mapred-1.0-SNAPSHOT.jar /user/root/lib 2. 在服务器端创建和你客户端一模一样的用户。创建目录 /tmp/hadoop-root/stagging/用户 3. 客户端提交job的代码 Java代码 Configurationconf=HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum","node.tracker1"); conf.set("fs.default.name","hdfs://node.tracker1:9000/hbase"); conf.set("mapred.job.tracker","...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Hadoop3单机部署,实现最简伪集群
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度