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解 ...
随机推荐
- Echarts 新认知 地图的label到底怎么居中?
试过了offset和很多Api,都无法实现label居中 后来无意中发现,原来在geojson注册的时候,可以定义 properties.cp 属性,实现文本的坐标自定义,实现居中. echarts. ...
- flowable 的ProcessEngine配置
1 flowable process engine 是通过 flowable.cfg.xml 配置文件配置的.在spring 环境中是使用 flowable-context.xml 配置文件的, P ...
- Node.js中,获取req请求的原始IP
Node.js代码 var express = require('express'); var app = express(); var http = require('http'); var ser ...
- Android网络功能之会话发起协议SIP
原文:http://android.eoe.cn/topic/android_sdk * 会话发起协议* Android提供了一个支持会话发起协议(SIP)的API,这可以让你添加基于SIP的网络电话 ...
- java.util.Date和java.sql.Date 一点区别
最近无意中发现,在oracle中同一样的一个Date类型字段,存储的日期格式有两种不同的情况,第一种是2011-1-1 12:00:00,第二种是2011-1-1,仔细查找发现在向数据库中写数据的时候 ...
- Android使用Custom debug keystore
有时候须要用到第三方API的时候,须要一个key store 的SH1值,比如使用百度地图API,假设是协同开发,就须要全部Eclipse使用同一keystore. 例如以下图所看到的: 这里须要注意 ...
- mongodb更新数组中的所有匹配项
假如集合中有如下数据 { "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : & ...
- 由于出现以下异常,无法生成模型:“System.Data.StrongTypingException: 表“TableDetails”中列“IsPrimaryKey”的值为 DBNull。
Entity Framework (version 6.0.0.0) and MySQL Server (>= 5.7.11) 在使用EF中,从数据库中更新模型 操作.报错! 解决办法: 1. ...
- Mac上把python源文件编译成so文件
把python源文件编译成so文件 前言 实际上属于一种代码混淆/加密的技术,大家知道python的源文件放在那里,大家是都可以看的,不像C语言编译出来可以拿编译后的东西去运行,所以就出现了这种需求. ...
- vi卡死解决办法
玩了这么多年linux 居然不知道这个..特此记录. 使用vim时,如果你不小心按了 Ctrl + s后,你会发现不能输入任何东西了,像死掉了一般,其实vim并没有死掉,这时vim只是停止向终端输出而 ...