一、概念
使用BlukLoad方式利用Hbase的数据信息是 按照特点格式存储在HDFS里的特性,直接在HDFS中生成持久化的Hfile数据格式文件,然后完成巨量数据快速入库的操作,配合MapReduce完成这样的操作。
二、优点
1、不占用Region资源
2、不会产生巨量的写入I/O、
3、只需要较少的CPU和网络资源
三、实现原理
通过一个MapReduce Job来实现的,通过job直接生成一个Hbase的内部HFile格式文件 ,用来形成一个特殊的Hbase数据表,然后直接将数据文件加载到运行的集群中,与使用Hbase API相比,使用BulkLoad导入数据占用更少的CPU和网络资源
 
四、BulkLoad过程主要包括三部分:
1、从数据源(通常是文本文件或其他的数据库)提取数据并上传到HDFS,抽取数据到HDFS和Hbase。
2、利用MapReduce作业处理事先准备的数据,并且大多数情况下需要我们自己编写Map函数,而Reduce函数不需要我们考虑,由Hbase提供。
      该作业需要使用rowkey(行键)作为输出key;keyvalue、put或者delete作为输出value。MapReduce作业需要使用HFileOutputFormat2
      来生成Hbase数据文件。为了有效的导入数据,需要配置HFileOutputFormat2使得每一个输出文件都在一个合适的区域中。为达到这个目的,
      MapReduce作业会使用Hadoop的TotalOrderPartitioner类根据表的key值将输出分割开来。HFileOutputFormat2的方法configureIncrementalLoad()
      会自动的完成上面的工作。
3、告诉RegionServers数据的位置并导入数据,通常使用LoadIncrementalHFiles(更为人所知是completebulkload工具),将文件在HDFS上的位置传递给它,它会利用RegionServer将数据导入到相应的区域
 

五、实践操作(kerberos认证)

1、创建表

create 'hfiletable','fm1','fm2'

2、数据准备

**
* @Author: xiaolaotou
* @Date: 2018/11/29
*/
public class CreateData {
public static void main(String[] args) throws IOException, InterruptedException {
    StringBuffer str = new StringBuffer();
    String rowkey="key";
    String family1="fm1:name";
    String family2="fm2:age";
    String value="za";
    Integer age=12;
    for(int i=1;i<5000;i++) {
        str=str.append(rowkey + i + "\t" + family1 + "\t" + value+i + "\n" + rowkey+i + "\t" + family2 + "\t" +i+"\n");
    System.out.println(str);
}
    //写入本地文件
    String fileTxt="/mnt/sata1/yang/BulkLoadHbase/data.txt";
    File file=new File(fileTxt);
    if(!file.getParentFile().exists()){
        file.getParentFile().mkdirs();
    }
    if(!file.exists()){
        file.createNewFile();
        FileWriter fw=new FileWriter(file,false);
        BufferedWriter bw=new BufferedWriter(fw);
        System.out.println("写入完成");
        bw.write(String.valueOf(str));
        bw.flush();
        bw.close();
        fw.close();
    }
    PutDataToHdfs();
}
//将数据文件上传到hdfs
public static void PutDataToHdfs() throws IOException, InterruptedException {
    Configuration conf = new Configuration();
    FileSystem fs = org.apache.hadoop.fs.FileSystem.get(URI.create("hdfs://172.20.237.104:9000"),conf,"root");
    //上传文件到hdfs
    fs.copyFromLocalFile(new Path("/mnt/sata1/yang/BulkLoadHbase/data.txt"),new Path("/yang"));
    }
}
注意:在hdfs开启kerberos认证这个将数据上传到hdfs不能用,采用生成数据手动上传

3、使用Mapreduce将数据通过Bulkload入到hbase表中

/**
* @Author: xiaolaotou
* @Date: 2018/11/27
* 使用MapReduce生成HFile文件
*/
public class BulkLoadMapper extends Mapper<LongWritable,Text,ImmutableBytesWritable,Put> {
    public void map(LongWritable key, Text value, Mapper.Context context) throws IOException, InterruptedException {
        String[] valueStrSplit = value.toString().split("\t");//划分一行数据
        String hkey = valueStrSplit[0];//rowkey
        String family = valueStrSplit[1].split(":")[0];//列族
        String column = valueStrSplit[1].split(":")[1];//字段
        String hvalue = valueStrSplit[2];//值
        final byte[] rowKey = Bytes.toBytes(hkey);
        final ImmutableBytesWritable HKey = new ImmutableBytesWritable(rowKey);
        Put HPut = new Put(rowKey);
        byte[] cell = Bytes.toBytes(hvalue);
        HPut.add(Bytes.toBytes(family), Bytes.toBytes(column), cell);
        context.write(HKey, HPut);
    }
 
/**
* @Author: xiaolaotou
* @Date: 2018/11/27
*/
public class BulkLoadJob {
            static Logger logger = LoggerFactory.getLogger(BulkLoadJob.class);
            private static Configuration conf = null;
 
static {
       Configuration HBASE_CONFIG = new Configuration();
        HBASE_CONFIG.set("hbase.zookeeper.quorum", "172.20.237.104,172.20.237.105,172.20.237.106");
        HBASE_CONFIG.set("hbase.master.kerberos.principal", "hbase/_HOST@TDH");
        HBASE_CONFIG.set("hbase.regionserver.kerberos.principal", "hbase/_HOST@TDH");
        HBASE_CONFIG.set("hbase.security.authentication", "kerberos");
        HBASE_CONFIG.set("zookeeper.znode.parent", "/hyperbase1");
        HBASE_CONFIG.set("hadoop.security.authentication", "kerberos");
        conf = HBaseConfiguration.create(HBASE_CONFIG);
}
 
public static void main(String[] args) throws Exception {
        UserGroupInformation.setConfiguration(conf);
        UserGroupInformation.loginUserFromKeytab("hbase/gz237-104", "/etc/hyperbase1/conf/hyperbase.keytab");
        String inputPath = "/yang/data.txt";
        String outputPath = "/yang/BulkLoad";
        Job job = Job.getInstance(conf, "BulkLoadToHbase");
        job.setJarByClass(BulkLoadJob.class);
        job.setMapperClass(BulkLoadMapper.class);
        job.setMapOutputKeyClass(ImmutableBytesWritable.class);
        job.setMapOutputValueClass(Put.class);
        //拒绝推测式task的运行
        job.setSpeculativeExecution(false);
        job.setReduceSpeculativeExecution(false);
        //in/out format
        job.setInputFormatClass(TextInputFormat.class);
        job.setOutputFormatClass(HFileOutputFormat2.class);
        //指定来源
        FileInputFormat.addInputPath(job, new Path(inputPath));
        //指定输出地
        FileOutputFormat.setOutputPath(job, new Path(outputPath));
 
        HTable table = new HTable(conf, "hfiletable");
        HFileOutputFormat2.configureIncrementalLoad(job, table);
 
        boolean b = job.waitForCompletion(true);
if (b) {
        FsShell shell = new FsShell(conf);
try {
        shell.run(new String[]{"-chmod", "-R", "777", outputPath});
} catch (Exception e) {
        logger.error("不能改变文件权限 ", e);
        throw new IOException(e);
}
        //加载到hbase表
        LoadIncrementalHFiles loader = new LoadIncrementalHFiles(conf);
        loader.doBulkLoad(new Path(outputPath), table);
        System.out.println("执行成功");
} else {
        System.out.println("执行失败");
        logger.error("加载失败!");
        System.exit(1);
    }
    }
}
 
 
过程中遇到的报错:

解决:protobuf-java-2.5.0.jar因为包冲突,由于我创建project时,结构为父模块和子模块,可能在导包的时候,被其他子模块的包给冲突了。因此,我新建了一个project重新打包到linux运行成功。

通过BulkLoad快速将海量数据导入到Hbase(TDH,kerberos认证)的更多相关文章

  1. 在Spark上通过BulkLoad快速将海量数据导入到Hbase

    我们在<通过BulkLoad快速将海量数据导入到Hbase[Hadoop篇]>文中介绍了一种快速将海量数据导入Hbase的一种方法,而本文将介绍如何在Spark上使用Scala编写快速导入 ...

  2. 通过BulkLoad快速将海量数据导入到Hbase

    在第一次建立Hbase表的时候,我们可能需要往里面一次性导入大量的初始化数据.我们很自然地想到将数据一条条插入到Hbase中,或者通过MR方式等. 但是这些方式不是慢就是在导入的过程的占用Region ...

  3. sqoop将关系型的数据库得数据导入到hbase中

    1.sqoop将关系数据库导入到hbase的参数说明

  4. BulkLoad加载本地文件到HBase表

    BulkLoad加载文件到HBase表 1.功能 将本地数据导入到HBase中 2.原理 BulkLoad会将tsv/csv格式的文件编程hfile文件,然后再进行数据的导入,这样可以避免大量数据导入 ...

  5. HBase(三): Azure HDInsigt HBase表数据导入本地HBase

    目录: hdfs 命令操作本地 hbase Azure HDInsight HBase表数据导入本地 hbase hdfs命令操作本地hbase: 参见  HDP2.4安装(五):集群及组件安装 , ...

  6. HBase结合MapReduce批量导入(HDFS中的数据导入到HBase)

    HBase结合MapReduce批量导入 package hbase; import java.text.SimpleDateFormat; import java.util.Date; import ...

  7. 干货 | 快速实现数据导入及简单DCS的实现

    干货 | 快速实现数据导入及简单DCS的实现 原创: 赵琦 京东云开发者社区  4月18日 对于多数用户而言,在利用云计算的大数据服务时首先要面临的一个问题就是如何将已有存量数据快捷的导入到大数据仓库 ...

  8. 使用Spark的newAPIHadoopRDD接口访问有kerberos认证的hbase

    使用newAPIHadoopRDD接口访问hbase数据,网上有很多可以参考的例子,但是由于环境使用了kerberos安全加固,spark使用有kerberos认证的hbase,网上的参考资料不多,访 ...

  9. zookeeper、hbase集成kerberos

    1.KDC创建principal 1.1.创建认证用户 登陆到kdc服务器,使用root或者可以使用root权限的普通用户操作: # kadmin.local -q “addprinc -randke ...

随机推荐

  1. apache、nginx、Tomcat、IIS引擎解析漏洞

                                            引擎解析漏洞 常见的web容器有IIS.Apache.Nginx.Tomcat等,以下是详细讲解 IIS IIS简介 是 ...

  2. SQL Server常用函数及命令

    1.字符串函数 --ascii函数,返回字符串最左侧字符的ascii码值 SELECT ASCII('a') AS asciistr --ascii代码转换函数,返回指定ascii值对应的字符 SEL ...

  3. Day3 Scrum 冲刺博客

    ·线上会议: 昨天已完成的工作与今天计划完成的工作及工作中遇到的困难: 成员姓名 昨天完成工作 今天计划完成的工作 工作中遇到的困难 纪昂学 创建一个Cell类,用来表示一个小方块 就创建一个Tetr ...

  4. webstorm实现手机预览页面

    效果:在webstorm中开发页面,复制该页面在电脑中的浏览网址,发给手机,在手机上点击链接,可以直接访问本地开发的页面.并且,电脑上修改后保存,手机上刷新即可看到效果. 步骤: 1.webstorm ...

  5. 侧边栏js样式代码

    <!-- menu html --> <div class="container"> <div class="menu-wrap optis ...

  6. CSS-backgroound和radial-giadient的常见用法

    前言 这里主要介绍下css中background和radial-giadient径向渐变的使用,工作中用到的地方可能也不太多,但是每次用到了都需要查阅官网,查资料就比较麻烦,这里记录一下我自己整理的常 ...

  7. python 通过pip freeze、dowload打离线包及自动安装【适用于保密的离线环境】

    python的pip是其包管理工具,相当方便好用.本文只介绍pip 如何通过其freeze命令打离线包,及其离线包的安装脚本.这个知识点,特别适用于不适合连通互联网,设备需要物理隔绝,保密要求严格的客 ...

  8. svn提交时提示 Aborting commit: remains in conflict 解决办法,更改svn服务地址

    TortoiseSVN客户端如何更改新的URL 问题: 我们的服务器换了新的URL地址,这时候我们本地的SVN访问帐号和地址就要重新定义了. 解决步骤: 1:重新定义SVN的URL,右键(Tortoi ...

  9. JavaSE12-内部类&API

    1. 参数传递 1.1 类名作为形参和返回值 1.类名作为方法的形参 方法的形参是类名,其实需要的是该类的对象 实际传递的是该对象的[地址值] 2.类名作为方法的返回值 方法的返回值是类名,其实返回的 ...

  10. jvm基本结构和解析

    jvm的基本结构图如下 这只是代表我的个人理解  不是很深刻  欢迎各类大神进行补充和纠正 jvm之所以强大就是因为他从软件层面屏蔽不用操作系统在底层硬件与指令上的区别,从而可以在不同系统上兼容 主要 ...