非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

时间: 2024-12-26 11:32:16

非mapreduce生成Hfile,然后导入hbase当中的相关文章

用Mapreduce 方式生成HFile,导入HBase

详细代码信息 package com.tansun.di.hbase.put; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.KeyValue; import org.

MapReduce生成HFile文件,再使用BulkLoad导入HBase中(完全分布式运行)

声明: 若要转载, 请标明出处. 前提: 在对于大量的数据导入到HBase中, 如果一条一条进行插入, 则太耗时了, 所以可以先采用MapReduce生成HFile文件, 然后使用BulkLoad导入HBase中. 引用: 一.这种方式有很多的优点: 1. 如果我们一次性入库hbase巨量数据,处理速度慢不说,还特别占用Region资源, 一个比较高效便捷的方法就是使用 "Bulk Loading"方法,即HBase提供的HFileOutputFormat类. 2. 它是利用hbase

利用BulkLoad导入Hbase表

1.插入HBase表传统方法具有什么问题? 我们先看下 HBase 的写流程: 通常 MapReduce 在写HBase时使用的是TableOutputFormat方式,在map/reduce中直接生成put对象写入HBase,该方式在大量数据写入时效率低下,因为HBase会block写入,频繁进行flush.split.compact等大量IO操作,这样对HBase节点的稳定性也会造成一定的影响,例如GC时间过长,响应变慢,导致节点超时退出,并引起一系列连锁反应,而HBase支持BulkLoa

使用MapReduce将HDFS数据导入到HBase(二)

package com.bank.service; import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.conf.Configured;import org.apache.hadoop.hbase.client.Put;import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;import org.apache.hadoop.hbase.mapred

使用MapReduce将HDFS数据导入到HBase(一)

package com.bank.service; import java.io.IOException; import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.conf.Configured;import org.apache.hadoop.fs.Path;import org.apache.hadoop.hbase.HBaseConfiguration;import org.apache.hadoop.hba

数据导入HBase最常用的三种方式及实践分析

数据导入HBase最常用的三种方式及实践分析         摘要:要使用Hadoop,需要将现有的各种类型的数据库或数据文件中的数据导入HBase.一般而言,有三种常见方式:使用HBase的API中的Put方法,使用HBase 的bulk load工具和使用定制的MapReduce Job方式.本文均有详细描述. [编者按]要使用Hadoop,数据合并至关重要,HBase应用甚广.一般而言,需要 针对不同情景模式将现有的各种类型的数据库或数据文件中的数据转入至HBase 中.常见方式为:使用H

Hive 数据导入HBase的2中方法详解

最近经常被问到这个问题,所以简单写一下总结. Hive数据导入到HBase基本有2个方案: 1.HBase中建表,然后Hive中建一个外部表,这样当Hive中写入数据后,HBase中也会同时更新 2.MapReduce读取Hive数据,然后写入(API或者Bulkload)到HBase 1.Hive 外部表 创建hbase表 (1) 建立一个表格classes具有1个列族user create 'classes','user' (2) 查看表的构造 hbase(main):005:0> desc

数据批量导入HBase

测试数据: datas 1001 lilei 17 13800001111 1002 lily 16 13800001112 1003 lucy 16 13800001113 1004 meimei 16 13800001114 数据批量导入使用mr,先生成HFile文件然后在用completebulkload工具导入. 1.需要先在hbase 创建表名: hbase> create 'student', {NAME => 'info'} maven pom.xml配置文件如下: <de

【甘道夫】通过bulk load将HDFS上的数据导入HBase

引言 通过bulkload将HDFS上的数据装载进HBase是常用的入门级HBase技能,下面简单记录下关键步骤. bulkload的详细情况请参见官网文档. 过程 第一步:每台机器执行 ln -s $HBASE_HOME/conf/hbase-site.xml $HADOOP_HOME/etc/hadoop/hbase-site.xml 第二步:编辑$HADOOP_HOME/etc/hadoop/hadoop-env.sh,拷贝到所有节点 末尾添加: export HADOOP_CLASSPA