最近一个群友的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当中的更多相关文章

  1. MapReduce生成HFile入库到HBase

    转自:http://www.cnblogs.com/shitouer/archive/2013/02/20/hbase-hfile-bulk-load.html 一.这种方式有很多的优点: 1. 如果 ...

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

    转自:http://blog.csdn.net/stark_summer/article/details/44174381 未实验 最近一个群友的boss让研究hbase,让hbase的入库速度达到5 ...

  3. MapReduce生成HFile入库到HBase及源码分析

    http://blog.pureisle.net/archives/1950.html

  4. Java进阶(五十二)利用LOG4J生成服务日志

    Java进阶(五十二)利用LOG4J生成服务日志 前言 由于论文写作需求,需要进行流程挖掘.前提是需要有真实的事件日志数据.真实的事件日志数据可以用来发现.监控和提升业务流程. 为了获得真实的事件日志 ...

  5. (转)SpringMVC学习(十二)——SpringMVC中的拦截器

    http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...

  6. HBase学习(二) 基本命令 Java api

    一.Hbase shell 1.Region信息观察 创建表指定命名空间 在创建表的时候可以选择创建到bigdata17这个namespace中,如何实现呢? 使用这种格式即可:'命名空间名称:表名' ...

  7. 【Hbase学习之二】Hbase 搭建

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 hbase-2.1.3 一.单机模 ...

  8. Scala学习十二——高阶函数

    一.本章要点 在Scala中函数是”头等公民“(可以作为参数,返回值,赋值给其他); 可以创建匿名函数,通常还会交给其他函数; 函数参数可以给出需要稍后执行的行为; 许多集合方法都接受函数参数,将函数 ...

  9. hbase学习(二)hbase单机和高可用完全分布式安装部署

    hbase版本 2.0.4  与hadoop兼容表http://hbase.apache.org/book.html#hadoop  我的 hadoop版本是3.1   1.单机版hbase 1.1解 ...

随机推荐

  1. Linux版迅雷(Xware)安装配置方法

    Linux版迅雷下载请见:Xware下载 解压下载的压缩包 核对MD5或SHA1校验值 解压得到以下三个文件 安装文件 在/usr/local/下创建thunder文件夹,将上面的三个文件放入,然后运 ...

  2. 关于java代码提交HTTP POST请求中文乱码的解决方法

    首先说明下这些只是根据我工作常用经验的总结,可能不一定完全对,也不一定全面,但却是最通用的. JAVA里HTTP提交方式 httpurlconnection:jdk里自带的 httpclient:ap ...

  3. DCOS中监控和弹性伸缩方案经验

    监控的选型 我们的DCOS 主要是面向2种业务形态:互联网应用,NFV组件和相关的数据库.2种不同的业务虽然说都是跑在容器内部,但是其实需要监控的信息和指标都是各不相同.因此在选择监控方案的时候我们更 ...

  4. windows库的创建和使用:静态库+动态库

    windows库的创建和使用:静态库+动态库   一.静态库的创建和使用 1. 静态库创建 (1)首先创建projecttest,測试代码例如以下: 1) test.h void test_print ...

  5. go 从入门到精通(二)基本数据类型和操作符

    一.文件名&关键字&标识符 所有go源码都是以.go结尾 标识符以字母或下划线开头,大小写敏感 下划线_是特殊标识符,用户忽略结果 保留关键字 导入包时可以设置别名 下面是保留关键字: ...

  6. spring(四) 手动整合web项目(SSH)

    清楚了spring的IOC 和 AOP,最后一篇就来整合SSH框架把,记录下来,以后应该会用的到. --WH 一.web项目中如何使用spring? 当tomcat启动时,就应该加载spring的配置 ...

  7. 【Unity】10.1 类人动画的导入和设置

    分类:Unity.C#.VS2015 创建日期:2016-05-02 一.制作或购买类人模型 为了充分使用 Mecanim 类人动画系统和类人动画的动画重定位功能,需要先使用其他3D建模软件(例如3d ...

  8. vue.js $refs和$emit 父子组件交互

    父调子 $refs (把父组件的数据传给子组件)  <template> <div id="app"> <input type="butto ...

  9. 每日英语:The Invasion of the Online Tutors

    It's a nightly dilemma in many households: A student hits a wall doing homework, and parents are too ...

  10. 【Qt】qt库结构及示例

    QT库结构 Qt图形库是一个组织严谨的C++类库,其结构如图所示 细说Qt库 Qt类库中包含了上百个类,结构十分复杂,上图展示了Qt_3.2类库的基本结构. Qt类库中的类可以分成两种类型: 一种是直 ...