hbase 学习(十二)非mapreduce生成Hfile,然后导入hbase当中

简介: 最近一个群友的boss让研究hbase,让hbase的入库速度达到5w+/s,这可愁死了,4台个人电脑组成的集群,多线程入库调了好久,速度也才1w左右,于是想到“非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

相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
7月前
|
存储 分布式数据库 数据库
Hbase学习二:Hbase数据特点和架构特点
Hbase学习二:Hbase数据特点和架构特点
106 0
|
3月前
|
Shell 分布式数据库 Hbase
如何使用 HBase Shell 进行数据的批量导入和导出?
如何使用 HBase Shell 进行数据的批量导入和导出?
277 5
|
4月前
|
存储 大数据 关系型数据库
HBase系列学习:基础知识
HBase系列学习:基础知识
HBase系列学习:基础知识
|
6月前
|
分布式计算 大数据 分布式数据库
"揭秘HBase MapReduce高效数据处理秘诀:四步实战攻略,让你轻松玩转大数据分析!"
【8月更文挑战第17天】大数据时代,HBase以高性能、可扩展性成为关键的数据存储解决方案。结合MapReduce分布式计算框架,能高效处理HBase中的大规模数据。本文通过实例展示如何配置HBase集群、编写Map和Reduce函数,以及运行MapReduce作业来计算HBase某列的平均值。此过程不仅限于简单的统计分析,还可扩展至更复杂的数据处理任务,为企业提供强有力的大数据技术支持。
110 1
|
7月前
|
Shell 分布式数据库 Hbase
使用 HBase Shell 进行数据的批量导入和导出
使用 HBase Shell 进行数据的批量导入和导出
703 6
|
6月前
|
存储 分布式计算 分布式数据库
《HBase MapReduce之旅:我的学习笔记与心得》——跟随我的步伐,一同探索HBase世界,揭开MapReduce的神秘面纱,分享那些挑战与收获,让你在数据的海洋里畅游无阻!
【8月更文挑战第17天】HBase是Apache顶级项目,作为Bigtable的开源版,它是一个非关系型、分布式数据库,具备高可扩展性和性能。结合HDFS存储和MapReduce计算框架,以及Zookeeper协同服务,HBase支持海量数据高效管理。MapReduce通过将任务拆解并在集群上并行执行,极大提升处理速度。学习HBase MapReduce涉及理解其数据模型、编程模型及应用实践,虽然充满挑战,但收获颇丰,对职业发展大有裨益。
76 0
|
7月前
|
大数据 分布式数据库 Hbase
Hbase学习三:Hbase常用命令总结
Hbase学习三:Hbase常用命令总结
828 0
|
8月前
|
存储 SQL 分布式计算
技术心得记录:深入学习HBase架构原理
技术心得记录:深入学习HBase架构原理
|
9月前
|
存储 分布式计算 分布式数据库
对给定的数据利用MapReduce编程实现数据的清洗和预处理,编程实现数据存储到HBase数据库,实现数据的增删改查操作接口
对给定的数据利用MapReduce编程实现数据的清洗和预处理,编程实现数据存储到HBase数据库,实现数据的增删改查操作接口
102 0
|
分布式计算 分布式数据库 Hbase
99 MapReduce操作Hbase
99 MapReduce操作Hbase
114 0