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",结果如下图所示:

image.png

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

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

image

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


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

        }

}

}

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

image

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

image

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

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

推荐阅读更多精彩内容

  • HBase那些事 @(大数据工程学院)[HBase, Hadoop, 优化, HadoopChen, hbase]...
    分痴阅读 3,941评论 3 17
  • 简介 HBase是高可靠性,高性能,面向列,可伸缩的分布式存储系统,利用HBase技术可在廉价PC Serve...
    九世的猫阅读 2,192评论 1 6
  • 一、简介 Hbase:全名Hadoop DataBase,是一种开源的,可伸缩的,严格一致性(并非最终一致性)的分...
    菜鸟小玄阅读 2,388评论 0 12
  • HBase存储架构图 HBase Master 为Region server分配region 负责Region s...
    kimibob阅读 5,584评论 0 52
  • 本文首先简单介绍了HBase,然后重点讲述了HBase的高并发和实时处理数据 、HBase数据模型、HBase物理...
    达微阅读 2,735评论 1 13