文档章节

非mapreduce生成Hfile,然后导入hbase当中

stark_summer
 stark_summer
发布于 2015/03/10 15:19
字数 708
阅读 93
收藏 1

最近一个群友的boss让研究hbase,让hbase的入库速度达到5w+/s,这可愁死了,4台个人电脑组成的集群,多线程入库调了好久,速度也才1w左右,都没有达到理想的那种速度,然后就想到了这种方式,但是网上多是用mapreduce来实现入库,而现在的需求是实时入库,不生成文件了,所以就只能自己用代码实现了,但是网上查了很多资料都没有查到,最后在一个网友的指引下,看了源码,最后找到了生成Hfile的方式,实现了之后,发现单线程入库速度才达到1w4左右,和之前的多线程的全速差不多了,百思不得其解之时,调整了一下代码把列的Byte.toBytes(cols)这个方法调整出来只做一次,速度立马就到3w了,提升非常明显,这是我的电脑上的速度,估计在它的集群上能更快一点吧,下面把代码和大家分享一下。

    String tableName = "taglog";
            byte[] family = Bytes.toBytes("logs");
            //配置文件设置
            Configuration conf = HBaseConfiguration.create();
            conf.set("hbase.master", "192.168.1.133:60000");
            conf.set("hbase.zookeeper.quorum", "192.168.1.135");
            //conf.set("zookeeper.znode.parent", "/hbase");
            conf.set("hbase.metrics.showTableName", "false");
            //conf.set("io.compression.codecs", "org.apache.hadoop.io.compress.SnappyCodec");
            
            String outputdir = "hdfs://hadoop.Master:8020/user/SEA/hfiles/";
            Path dir = new Path(outputdir);
            Path familydir = new Path(outputdir, Bytes.toString(family));
            FileSystem fs = familydir.getFileSystem(conf);
            BloomType bloomType = BloomType.NONE;
            final HFileDataBlockEncoder encoder = NoOpDataBlockEncoder.INSTANCE;
            int blockSize = 64000;
            Configuration tempConf = new Configuration(conf);
            tempConf.set("hbase.metrics.showTableName", "false");
            tempConf.setFloat(HConstants.HFILE_BLOCK_CACHE_SIZE_KEY, 1.0f);
            //实例化HFile的Writer,StoreFile实际上只是HFile的轻量级的封装
            StoreFile.Writer writer = new StoreFile.WriterBuilder(conf, new CacheConfig(tempConf),
                    fs, blockSize)
                    .withOutputDir(familydir)
                    .withCompression(Compression.Algorithm.NONE)
                    .withBloomType(bloomType).withComparator(KeyValue.COMPARATOR)
                    .withDataBlockEncoder(encoder).build();
            long start = System.currentTimeMillis();
            
            DecimalFormat df = new DecimalFormat("0000000");
            
            
            
            KeyValue kv1 = null;
            KeyValue kv2 = null;
            KeyValue kv3 = null;
            KeyValue kv4 = null;
            KeyValue kv5 = null;
            KeyValue kv6 = null;
            KeyValue kv7 = null;
            KeyValue kv8 = null;
            
            //这个是耗时操作,只进行一次
            byte[] cn = Bytes.toBytes("cn");
            byte[] dt = Bytes.toBytes("dt");
            byte[] ic = Bytes.toBytes("ic");
            byte[] ifs = Bytes.toBytes("if");
            byte[] ip = Bytes.toBytes("ip");
            byte[] le = Bytes.toBytes("le");
            byte[] mn = Bytes.toBytes("mn");
            byte[] pi = Bytes.toBytes("pi");
            
            int maxLength = 3000000;
            for(int i=0;i<maxLength;i++){
                String currentTime = ""+System.currentTimeMillis() + df.format(i);
                long current = System.currentTimeMillis();
                 //rowkey和列都要按照字典序的方式顺序写入,否则会报错的
                 kv1 = new KeyValue(Bytes.toBytes(currentTime), 
                         family, cn,current,KeyValue.Type.Put,Bytes.toBytes("3"));
                
                 kv2 = new KeyValue(Bytes.toBytes(currentTime), 
                         family, dt,current,KeyValue.Type.Put,Bytes.toBytes("6"));
                
                 kv3 = new KeyValue(Bytes.toBytes(currentTime), 
                         family, ic,current,KeyValue.Type.Put,Bytes.toBytes("8"));
                
                 kv4 = new KeyValue(Bytes.toBytes(currentTime), 
                         family, ifs,current,KeyValue.Type.Put,Bytes.toBytes("7"));
                
                 kv5 = new KeyValue(Bytes.toBytes(currentTime), 
                         family, ip,current,KeyValue.Type.Put,Bytes.toBytes("4"));
                
                 kv6 = new KeyValue(Bytes.toBytes(currentTime), 
                         family, le,current,KeyValue.Type.Put,Bytes.toBytes("2"));
                
                 kv7 = new KeyValue(Bytes.toBytes(currentTime), 
                         family, mn,current,KeyValue.Type.Put,Bytes.toBytes("5"));
                
                 kv8 = new KeyValue(Bytes.toBytes(currentTime), 
                         family,pi,current,KeyValue.Type.Put,Bytes.toBytes("1"));
                
                writer.append(kv1);
                writer.append(kv2);
                writer.append(kv3);
                writer.append(kv4);
                writer.append(kv5);
                writer.append(kv6);
                writer.append(kv7);
                writer.append(kv8);
            }
            
            
            writer.close();
            
            //把生成的HFile导入到hbase当中
            HTable table = new HTable(conf,tableName);
            LoadIncrementalHFiles loader = new LoadIncrementalHFiles(conf);
            loader.doBulkLoad(dir, table);


  


  最后再附上查看hfile的方式,查询正确的hfile和自己生成的hfile,方便查找问题。
  hbase org.apache.hadoop.hbase.io.hfile.HFile -p -f hdfs://hadoop.Master:8020/user/SEA/hfiles/logs/51aa97b2a25446f89d5c870af92c9fc1

© 著作权归作者所有

共有 人打赏支持
stark_summer
粉丝 60
博文 75
码字总数 51050
作品 0
朝阳
CEO
HBase BulkLoad批量写入数据实战

1.概述 在进行数据传输中,批量加载数据到HBase集群有多种方式,比如通过HBase API进行批量写入数据、使用Sqoop工具批量导数到HBase集群、使用MapReduce批量导入等。这些方式,在导入数据的过...

哥不是小萝莉
08/19
0
0
利用BulkLoad导入Hbase表

1、插入HBase表传统方法具有什么问题? 我们先看下 HBase 的写流程: 通常 MapReduce 在写HBase时使用的是TableOutputFormat方式,在map/reduce中直接生成put对象写入HBase,该方式在大量数据...

混绅士
06/28
0
0
HBase 写优化之 BulkLoad 实现数据快速入库

1、为何要 BulkLoad 导入?传统的 HTableOutputFormat 写 HBase 有什么问题? 我们先看下 HBase 的写流程: 通常 MapReduce 在写HBase时使用的是 TableOutputFormat 方式,在reduce中直接生成...

大数据之路
2013/12/25
0
1
HBase实战之HBase BulkLoad批量写入数据

1.概述 在进行数据传输时,批量加载数据到HBase集群有多种方式,比如通过HBase API进行批量写入数据、使用Sqoop工具批量导数到HBase集群、使用MapReduce批量导入等。这些方式,导入数据的过程...

HBase技术社区
10/02
0
0
Hive 数据导入HBase的2种方法详解

最近经常被问到这个问题,所以简单写一下总结。 Hive数据导入到HBase基本有2个方案: 1、HBase中建表,然后Hive中建一个外部表,这样当Hive中写入数据后,HBase中也会同时更新 2、MapReduce...

王二铁
2015/08/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

秒杀网站系统设计详解

最近总有一些朋友问高并发问题,后来就想自己把一个秒杀系统作为例子详细分解一下,也是一个学习过程。 首先假设场景,预计该活动可能有1万人参加,那最大并发数为1万。 主要面对的问题分析:...

小海bug
19分钟前
2
0
TypeScript基础入门之装饰器(一)

转发 TypeScript基础入门之装饰器(一) 介绍 随着TypeScript和ES6中Classes的引入,现在存在某些场景需要额外的功能来支持注释或修改类和类成员。 装饰器提供了一种为类声明和成员添加注释和元...

durban
29分钟前
1
0
sed命令扩展使用操作

打印某行到某行之间的内容 假若文件test.txt的内容是: ertfff**[abcfd]123324444[rty]**fgfgf 怎么能截取 [abcfd]123324444[rty] 这一部分出来呢? 操作命令: 知道开始行和结...

野雪球
45分钟前
1
0
JVM内存笔记

Hotspot JVM 中的 Java 线程与原生操作系统线程有直接的映射关系。当线程本地存储、缓 冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。 Java 线程结束,原...

凌渡
51分钟前
1
0
284. Peeking Iterator

Description Tag: Design Difficulties: Medium Given an Iterator class interface with methods: next() and hasNext(), design and implement a PeekingIterator that support the pee......

52iSilence7
53分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部