hbase bulkload 写入数据

hbase 写入数据有以下三种方式:

1.利用hbase提供的api写入

2.通过mr任务将数据写入

3.通过bulkload工具将数据写入

前两种写入方式在面对大数据量写入的时候效率会很低下,因为它们都是通过请求regionserver将数据写入,这期间数据会先写入memstore,memstore达到阈值后会刷写到磁盘生成hfile文件,hfile文件过多时会发生compaction,如果region大小过大时也会发生split。这些因素都会影响hbase数据写入的效率,因此在面临大数据写入时,这两种方式是不合适的。

而bulkload正好解决了这个问题,bulkload工具是将数据直接写入到hfile文件中,写入完毕后,通知hbase去加载这些hfile文件,因此可以避免上述耗时的因素,大大增加了数据写入的效率。下面就来讲述下如何利用bulkloan加载数据。

这里通过hbase shell创建一个person表,person表有两个列族分别为 "basic","social",结果如下图所示:


person表

注:因为这里讲解的是bulkload加载数据,因此对于rowkey的设计没有做过多的处理

输入源为txt格式文件,格式类型如下所示:

数据源

这里通过mr任务生成hfile文件,再通过bulkload下载hfile到hbase中去,mr任务代码如下:

<code>

package com.zjc.spark;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.hbase.HBaseConfiguration;

import org.apache.hadoop.hbase.TableName;

import org.apache.hadoop.hbase.client.*;

import org.apache.hadoop.hbase.io.ImmutableBytesWritable;

import org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2;

import org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles;

import org.apache.hadoop.hbase.util.Bytes;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Job;

import org.apache.hadoop.mapreduce.Mapper;

import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;

import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;

/**

* Created by zjc on 2018/12/26.

*/

public class sparkApplication10 {

public static class bulkLoadextends Mapper {

@Override

        protected void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {

String[] strs = value.toString().split(",");

            String rowKey = strs[0];

            ImmutableBytesWritable ibw =new ImmutableBytesWritable(Bytes.toBytes(rowKey));

            Put put =new Put(Bytes.toBytes(rowKey));

            put.addColumn(Bytes.toBytes("basic"), Bytes.toBytes("name"), Bytes.toBytes(strs[1]));

            put.addColumn(Bytes.toBytes("basic"), Bytes.toBytes("age"), Bytes.toBytes(strs[4]));

            put.addColumn(Bytes.toBytes("basic"), Bytes.toBytes("birth"), Bytes.toBytes(strs[5]));

            put.addColumn(Bytes.toBytes("social"), Bytes.toBytes("idnum"), Bytes.toBytes(strs[2]));

            put.addColumn(Bytes.toBytes("social"), Bytes.toBytes("phone"), Bytes.toBytes(strs[3]));

            put.addColumn(Bytes.toBytes("social"), Bytes.toBytes("sex"), Bytes.toBytes(strs[6]));

            put.addColumn(Bytes.toBytes("social"), Bytes.toBytes("address"), Bytes.toBytes(strs[7]));

            put.addColumn(Bytes.toBytes("social"), Bytes.toBytes("company"), Bytes.toBytes(strs[8]));

            context.write(ibw, put);

        }

}

public static Configurationconf =null;

    public static Connectionconn =null;

    public static Tablet =null;

    public static RegionLocatorlocator =null;

    public static Adminadmin =null;

    static {

conf = HBaseConfiguration.create();

        conf.set("hbase.zookeeper.quorum", "自个儿的zk地址");

    }

public static void main(String[] args) {

try {

//获得hbase 表资源

            conn = ConnectionFactory.createConnection(conf);

            t =conn.getTable(TableName.valueOf("person"));

            locator =conn.getRegionLocator(TableName.valueOf("person"));

            admin =conn.getAdmin();

            //定义一个mr job

            Job job = Job.getInstance();

            job.setJarByClass(sparkApplication10.class);

            //定义map任务输出key value 类型

            job.setMapperClass(sparkApplication10.bulkLoad.class);

            job.setMapOutputKeyClass(ImmutableBytesWritable.class);

            job.setMapOutputValueClass(Put.class);

            //定义输入输出文件格式类型

            job.setInputFormatClass(TextInputFormat.class);

            job.setOutputFormatClass(HFileOutputFormat2.class);

            //定义输入输出文件路径

            FileInputFormat.addInputPath(job, new Path("/test6/"));

            FileOutputFormat.setOutputPath(job, new Path("/tmp/"));

            //配置bulkLoad

            HFileOutputFormat2.configureIncrementalLoad(job, t, locator);

            boolean b = job.waitForCompletion(true);

            //hbase 下载hfile文件

            LoadIncrementalHFiles load =new LoadIncrementalHFiles(conf);

            load.doBulkLoad(new Path("/tmp/"), admin, t, locator);

        }catch (Exception e) {

System.out.println(e);

        }finally {

//resources closed

        }

}

}

</code>

然后将该项目打成一个jar包,将jar包提交到yarn运行,执行结果如下:


查看hbase shell 表中是否有导入的数据:


到此,数据导入成功,笔者亲测,7000w的数据量3台虚拟机默认配置导入到Hbase中仅花费40分钟不到。本篇文章中主要运用mr 任务将数据导入到hbase中,bulkload也支持spark导入,不过spark官方文档主要运用scala来实现的。等有机会的时候再研究研究java实现方式的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容