非mapreduce生成Hfile,然后导入hbase当中
转自:http://blog.csdn.net/stark_summer/article/details/44174381
未实验
最近一个群友的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
非mapreduce生成Hfile,然后导入hbase当中的更多相关文章
- hbase 学习(十二)非mapreduce生成Hfile,然后导入hbase当中
最近一个群友的boss让研究hbase,让hbase的入库速度达到5w+/s,这可愁死了,4台个人电脑组成的集群,多线程入库调了好久,速度也才1w左右,都没有达到理想的那种速度,然后就想到了这种方式, ...
- MapReduce生成HFile入库到HBase
转自:http://www.cnblogs.com/shitouer/archive/2013/02/20/hbase-hfile-bulk-load.html 一.这种方式有很多的优点: 1. 如果 ...
- MapReduce生成HFile入库到HBase及源码分析
http://blog.pureisle.net/archives/1950.html
- 使用MapReduce将HDFS数据导入到HBase(三)
使用MapReduce生成HFile文件,通过BulkLoader方式(跳过WAL验证)批量加载到HBase表中 package com.mengyao.bigdata.hbase; import j ...
- MapReduce将HDFS文本数据导入HBase中
HBase本身提供了很多种数据导入的方式,通常有两种常用方式: 使用HBase提供的TableOutputFormat,原理是通过一个Mapreduce作业将数据导入HBase 另一种方式就是使用HB ...
- 通过生成HFile导入HBase
要实现DataFrame通过HFile导入HBase有两个关键步骤 第一个是要生成Hfile第二个是HFile导入HBase 测试DataFrame数据来自mysql,如果对读取mysql作为Data ...
- Spark:DataFrame批量导入Hbase的两种方式(HFile、Hive)
Spark处理后的结果数据resultDataFrame可以有多种存储介质,比较常见是存储为文件.关系型数据库,非关系行数据库. 各种方式有各自的特点,对于海量数据而言,如果想要达到实时查询的目的,使 ...
- Hbase 学习(十一)使用hive往hbase当中导入数据
我们可以有很多方式可以把数据导入到hbase当中,比如说用map-reduce,使用TableOutputFormat这个类,但是这种方式不是最优的方式. Bulk的方式直接生成HFiles,写入到文 ...
- 使用MapReduce将HDFS数据导入到HBase(二)
package com.bank.service; import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.conf. ...
随机推荐
- Spring Boot 历史
2012年10月,Mike Youngstrom在Spring jira中创建了一个功能需求,要求在Spring框架中支持无容器Web应用程序体系结构.他建议通过main方法引导的Spring容器内配 ...
- 代理模式proxy
代理模式的共同优点如下: (1) 能够协调调用者和被调用者,在一定程度上降低了系统的耦合度. (2) 客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵 ...
- reduceByKey和groupByKey区别与用法
在spark中,我们知道一切的操作都是基于RDD的.在使用中,RDD有一种非常特殊也是非常实用的format——pair RDD,即RDD的每一行是(key, value)的格式.这种格式很像Pyth ...
- Linux(CentOS7.0)下 C访问MySQL (转)
按语: 最近项目在云服务器上 centos6.8,安装了mysql5.5.39 server和client,但C连接不知所措: 后在官网下载了 devel.share .share-comp ...
- Redis 基础命令
1. 进入redis目录,启动redis cd src ./redis-server 2. 进入redis目录,启动redis客户端 cd src ./redis-cli 3. info命令 4. ...
- 基于MVC4+EasyUI的Web开发框架形成之旅(6)--基类控制器CRUD的操作
在上一篇随笔中,我对Web开发框架的总体界面进行了介绍,其中并提到了我的<Web开发框架>的控制器的设计关系,Web开发框架沿用了我的<Winform开发框架>的很多架构设计思 ...
- SSM整个配置心得
个人整合心得,还望指正
- R基于Bayes理论实现中文人员特性的性别判定
参见 基于中文人员特征的性别判定方法 理论,告诉一个名字,来猜猜是男是女,多多少少有点算命的味道.此命题是一种有监督的学习方法,从标注好的训练数据学习到一个预测模型,然后对未标注的数据进行预测. 1 ...
- Python打包文件夹的方法小结(zip,tar,tar.gz等)
本文实例讲述了Python打包文件夹的方法.分享给大家供大家参考,具体如下: 一.zip ? 1 2 3 4 5 6 7 8 9 10 11 import os, zipfile #打包目录为zip文 ...
- DOM 讲解
DOM,全称documention,文档意思 ,就是把整个html文档当成一个对象来操作,里面有很多方法,如getElementByid(),getElementByid().innerText(); ...