hbase 学习(十二)非mapreduce生成Hfile,然后导入hbase当中
最近一个群友的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
hbase 学习(十二)非mapreduce生成Hfile,然后导入hbase当中的更多相关文章
- MapReduce生成HFile入库到HBase
转自:http://www.cnblogs.com/shitouer/archive/2013/02/20/hbase-hfile-bulk-load.html 一.这种方式有很多的优点: 1. 如果 ...
- 非mapreduce生成Hfile,然后导入hbase当中
转自:http://blog.csdn.net/stark_summer/article/details/44174381 未实验 最近一个群友的boss让研究hbase,让hbase的入库速度达到5 ...
- MapReduce生成HFile入库到HBase及源码分析
http://blog.pureisle.net/archives/1950.html
- Java进阶(五十二)利用LOG4J生成服务日志
Java进阶(五十二)利用LOG4J生成服务日志 前言 由于论文写作需求,需要进行流程挖掘.前提是需要有真实的事件日志数据.真实的事件日志数据可以用来发现.监控和提升业务流程. 为了获得真实的事件日志 ...
- (转)SpringMVC学习(十二)——SpringMVC中的拦截器
http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...
- HBase学习(二) 基本命令 Java api
一.Hbase shell 1.Region信息观察 创建表指定命名空间 在创建表的时候可以选择创建到bigdata17这个namespace中,如何实现呢? 使用这种格式即可:'命名空间名称:表名' ...
- 【Hbase学习之二】Hbase 搭建
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 hbase-2.1.3 一.单机模 ...
- Scala学习十二——高阶函数
一.本章要点 在Scala中函数是”头等公民“(可以作为参数,返回值,赋值给其他); 可以创建匿名函数,通常还会交给其他函数; 函数参数可以给出需要稍后执行的行为; 许多集合方法都接受函数参数,将函数 ...
- hbase学习(二)hbase单机和高可用完全分布式安装部署
hbase版本 2.0.4 与hadoop兼容表http://hbase.apache.org/book.html#hadoop 我的 hadoop版本是3.1 1.单机版hbase 1.1解 ...
随机推荐
- FileZilla FTP 登录 问题
1.一直报错220 (vsFTPd 3.0.2)-AUTH TLS 将加密方式选择为 “只是用普通FTP(不安全)”模式即可 2.服务器发回了不可路由的地址 “传输设置”,传输模式设置为主动.
- java 泛型中class<T> 和T的区别是什么?
public <T> boolean edit(T entity) 和public <T> T get(Class<T> c, Serializable id)中这 ...
- js判断客户端是否是IOS系统
在手机端应用的开发中,经常会碰到IOS系统跟Android系统去访问同一个内容时的展示效果不同,这时候我们需要区别对待,下面代码就是用js判断手机终端是否IOS系统: //判断是否为ios系统:是IO ...
- php反射获取类和方法中的注释
通过php中的反射机制,获取该类的文档注释,再通过获取其所有的方法,获取方法的注释 所用到的主要类及其方法 ReflectionClass ReflectionClass::getDocComment ...
- Talend open studio如何调试代码
Talend将设计的模型直接生成了java代码,可以直接对模型生成的java代码进行调试,排查问题比kettle灵活很多, 设计的模型如下: 生成的代码如下: 点击 Java Debug进入调试模式, ...
- haproxy 关闭ssl3
在使用的过程中,我们发现在用IE浏览器的时候 我们设置成 然后我们的网站会出现部分页面不出来 然后我们也发现在扫面网站链接的时候 所以当务之急是关闭ssl3 我这里的反向代理使用的是haproxy 版 ...
- 用原生JavaScript写AJAX
//原生js写ajax就像打电话 //打电话分下面4步//1.拿出手机//2.拨号//3.说话//4.听对方说话 //ajax也分下面4步//1.创建ajax对象//2.连接到服务器//3.发送请求( ...
- 使用Ant编译和构建项目指南
有两种方法来构建您的应用程序使用Ant构建脚本:一个用于测试/调试您的应用程序,调试模式——和一个用于构建你的最终计划发布——发布模式.不管你怎样构建你的应用程序,它必须先签名然后可以安装在一个模拟器 ...
- 一种3D空间的柱状多边形检测实现
最近无意中拓展出这个东西,基于之前写的2D多边形检测: http://www.cnblogs.com/hont/p/6105997.html 而判断两条线相交的方法替换成了我后来写的差乘判断: htt ...
- 有用的 JS 和 CSS 库
1. Moon Moon 是一个灵感源于 Vue.js 的 JavaScript UI 库,但它却更轻量.简单.它具备优化的虚拟 DOM 引擎,对用户友好的 API,并且在 gzip 压缩后仅有 6K ...