`
chaijuntao
  • 浏览: 24766 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

基于HBase的入库方案效率对比验证(二)

 
阅读更多

上节中,我们采用JavaAPI的方式来操作HBase,接连和访问方式都比较简单直接,而本节我们采用MapReduce的方式来操作HBase,那么就要先配置好Eclipse-Hadoop的插件。

 

一、安装Eclipse-Hadoop插件

由于网上这方面的资料非常全,所以本人推荐一个参考博文,照着配置就OK:

http://www.cnblogs.com/flyoung2008/archive/2011/12/09/2281400.html

 

二、定义Map

package txt_to_hbase;

import java.io.IOException;
import java.util.Random;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class THMapper extends Mapper<LongWritable, Text, Text, Text> {
    public void map(LongWritable key, Text value, Context context) {
        long begintime = System.currentTimeMillis();
        System.out.println("map开始时间:"+begintime);
        String[] items = value.toString().split("--");
        String k = String.valueOf((new Random()).nextLong());//生成随机rowkey
        String v = items[1];
       // System.out.println("key:" + k + "," + "value:" + v);
        try {

            context.write(new Text(k), new Text(v));

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        long endtime = System.currentTimeMillis();
       // System.out.println("map耗时:"+(endtime - begintime));
    }
}

 Map跟普通的mapreduce函数没有多大区别,正常的TextInputFormat方式输入,按行读取。

 Reduce中要把处理之后的结果写入hbase的表中,所以与普通的mapreduce程序有些区别,由以上代码可以知道,reduce类继承的是TableReducer,通过查询API(如下图1)知道,它也是一种基本的Reducer类,与其他的reduce类一样,它的输入k/v对是对应Map的输出k/v对,它的输出key可以是任意的类型,但是value必须是一个put或delete实例。

 

三、定义reduce:

package txt_to_hbase;

import java.io.IOException;

import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableReducer;
import org.apache.hadoop.io.Text;

public class THReducer extends TableReducer<Text, Text, ImmutableBytesWritable>{
    public void reduce(Text key, Iterable<Text> values, Context context) {
        long begintime = System.currentTimeMillis();
        String k = key.toString();
        String v = values.iterator().next().toString(); // 由数据知道value就只有一行
        Put putrow = new Put(k.getBytes());
        putrow.addColumn("fam1".getBytes(), "qualifier".getBytes(), v.getBytes());
        try {

            
            context.write(new ImmutableBytesWritable(key.getBytes()), putrow);

            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        long endtime = System.currentTimeMillis();
        if(Jishu.stac==0L) {
            Jishu.stac = System.currentTimeMillis();
        }
        Jishu.endc = System.currentTimeMillis();
        System.out.println("stac="+Jishu.stac+",endc="+Jishu.endc+",total="+(Jishu.endc-Jishu.stac));
    }

}

Reduce的输出key是ImmutableWritable类型(org.apache.hadoop.hase.io),API中的解释,它是一个可以用作key或value类型的字节序列,该类型基于BytesWritable,不能调整大小。Reduce的输出value是一个put。

 

四、定义drive:

package txt_to_hbase;

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.hbase.mapreduce.TableMapReduceUtil;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.util.Tool;

public class THDriver extends Configured implements Tool {

    @Override
    public int run(String[] arg0) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("11111111111111111111");
        Configuration conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum", "192.168.13.74"); 
        conf.set("hbase.zookeeper.property.clientPort", "2181");
        
        Job job = Job.getInstance(conf,"Txt-to-Hbase");
        job.setJarByClass(TxtHbase.class);
        Path in = new Path("hdfs://192.168.13.74:9000/cjt/input");
        job.setInputFormatClass(TextInputFormat.class);
        FileInputFormat.addInputPath(job, in);

        long begintime = System.currentTimeMillis();
        System.out.println("当前时间1:"+System.currentTimeMillis());
        job.setMapperClass(THMapper.class);
        job.setReducerClass(THReducer.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(Text.class);

        System.out.println("当前时间2:"+System.currentTimeMillis());
        TableMapReduceUtil.initTableReducerJob("tab1", THReducer.class, job);

        long endtime = System.currentTimeMillis();
        System.out.println("当前时间3:"+System.currentTimeMillis());
       job.waitForCompletion(true);
       return 0;
    }

}

 跟普通的MapReduce操作基本一样,唯一不同的是,在执行Hbase写入操作时使用的是TableMapReduceUtil.initTableReducerJob,同理执行Hbase读取操作应该使用TableMapReduceUtil.initTableMapperJob。而我们的例子中,读取的是文件,非Hbase表数据,所以用到的是:

 

	Path in = new Path("hdfs://192.168.13.74:9000/cjt/input");
        job.setInputFormatClass(TextInputFormat.class);
        FileInputFormat.addInputPath(job, in);

 

五、定义主类:

package txt_to_hbase;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.util.ToolRunner;

public class TxtHbase {
    public static void main(String [] args) throws Exception{
        int mr;
        mr = ToolRunner.run(new Configuration(),new THDriver(),args);
        System.exit(mr);
    }
}

 

ok,至此我们可以运行该测试类,首先我们把数据文件上传到HDFS上,我这边测试了1千,1万,3万,10万,15万,30万,60万条记录的入库速度,结果如下:

 

 

结论:
1、通过JavaAPI方式调用,单线程入库速度为2000条/s~7000条/s之间,而在多线程并发状态下,最高速度能达到10900条/s,明显优于Mysql单节点的入库速度。
2、以MapReduce的方式调用,速度得到进一步提升,速度区间为11500条/s~15500条/s,而且在10万量级之前,入库速度与量级成线性正相关,10万量级以上,入库速度稳定在15500条/s(Hbase未经过深度调优)
3、无论小数据量还是大数据量的入库操作,MapReduce的效率均远远高于直接JavaAPI的调用效率,小数据量时效率差达到5倍,大数据量时效率差为1.5倍
4、以上的验证,均基于同一hadoop和Hbase环境,单条记录与总数据量均保持一致,故两种调用结果可以直接进行量比。
5、综上,采用MapReduce入库Hbase是最高效的,而且一次MR操作数量级在10万条以上时,能达到最快的入库速度。

 

 

  • 大小: 5.6 KB
分享到:
评论

相关推荐

    Hbase几种入库方式

    Hbase 入库方式比较 Hbase 入库是指将数据从外部数据源加载到 Hbase 中的过程。Hbase 提供了多种入库方式,每种方式都有其特点和优缺点。本文将对 Hbase 的几种入库方式进行比较,帮助读者选择合适的入库方式。 1....

    基于Hbase的大数据查询优化

    类比于传统型数据库里的一些查询方式,本文对Hbase的存储原理进行了研究,借助分布式计算框架Mapreduce在Hbase上构建了二级索引,就可以对表进行有针对性的定位和高效率的查找,同时也减轻zookeeper服务对资源调度的压力...

    基于HBase的遥感数据分布式存储与查询方法研究.pdf

    本研究文档题为《基于HBase的遥感数据分布式存储与查询方法研究》,它针对遥感数据处理中的关键问题,如单节点故障、扩展性低和处理效率低,提出了一种新的数据分布式存储与查询方案。以下是对文档内容的详细解析和...

    1-9+基于+HBase+实时数仓探索实践.pdf

    其中,第二代实时数仓是基于HBase的实时数仓,具有实时采集、实时处理和实时查询的能力。 二、技术选型 在选择技术栈时,需要考虑多个因素,包括数据量、查询性能和可扩展性。Maxwell、HBase和Phoenix是基于HBase...

    Hbase 二级索引方案

    的方案出现了。 Solr Solr 是一个独立的企业级搜索应用服务器,是 Apache Lucene 项目的开源企业搜索平台, 其主要功能包括全文检索、命中标示、分面搜索、动态聚类、数据库集成,以及富文本(如 Word、PDF)的处理...

    基于HBase的分布式空间数据库技术

    基于HBase的分布式空间数据库技术是针对大型地理信息系统(GIS)中海量空间数据存储与高效查询的问题提出的一种解决方案。随着地理信息系统技术的迅速发展,数据的时间和空间精度不断提高,同时,GIS系统面临着数据...

    中国HBase技术社区第4届-MeetUp-上海站_基于HBase实时数仓探索实践.pptx

    【描述】:本演讲主要介绍了上海久耶供应链在大数据平台中基于HBase实现的实时数仓的实践与探索,涵盖了从第一代离线数仓到第二代实时数仓的转变,以及业务场景、开发流程、集群调优监控等方面的内容,并分享了两个...

    hbase-sdk是基于hbase-client和hbase-thrift的原生API封装的一款轻量级的HBase ORM框架

    hbase-sdk是基于hbase-client和hbase-thrift的原生API封装的一款轻量级的HBase ORM框架。 针对HBase各版本API(1.x~2.x)间的差异,在其上剥离出了一层统一的抽象。并提供了以类SQL的方式来读写HBase表中的数据。对...

    基于hbase+solr的搜索引擎毕业论文

    Nutch抓取指定网址数据,存储在HBase数据库中,存储过程由zookeeper管理。脚本调用索引器部件将数据索引化,经过索引化的数据被前端检索查询,最后前端展示查询结果,用户点击结果列表查看目标资料。

    基于HBase的大数据解决方案.pdf

    "基于HBase的大数据解决方案" HBase是一个基于分布式文件系统的NoSQL数据库,专门为大数据应用设计,具有高可扩展性、可靠性、性能强等特点。在大数据领域,HBase是一个非常重要的解决方案,广泛应用于电商、新闻、...

    MyHBase_一种基于Hbase的NewSQL数据库的设计与实现

    本文介绍了MyHBase数据库的设计与实现,它是基于HBase的新SQL数据库存储引擎。HBase是一个开源的非关系型数据库,建立在Hadoop之上,是Apache Software Foundation的一部分,HBase使用了Hadoop的HDFS作为其文件存储...

    基于HBase的矢量空间数据分布式存储研究.pdf

    通过理解HBase的存储模型,我们可以更好地设计适用于空间矢量数据的存储方案。 文章接着提出了一个基于HBase的矢量空间数据存储模型,该模型包括数据准备、数据存储和数据检索三个部分。在数据准备阶段,需要对原始...

    基于HBase实时数仓探索实践.pdf

    6. 基于HBase的实时数仓架构设计:文中介绍了数据仓库模型的三个层次,第一层为基础表,第二层为事实表和维度表,第三层为领域表。此外,还涉及了数据校验环节,即数据量的比对工作,确保数据的准确性和完整性。 7....

    基于Hbase的海量视频存储简单模拟

    本文将深入探讨一个基于Hbase的海量视频存储简单模拟项目,旨在利用Hadoop和Hbase这两个强大的开源工具来解决这个问题。 首先,我们要理解Hadoop和Hbase的角色。Hadoop是分布式计算框架,其核心组件包括HDFS...

    HBase视频教程下载|基于微博数据应用的HBase实战开发

    课时4:基于HBase Client API的CRUD实战 课时5:批处理与扫描器实战 课时6:使用Ganglia监控HBase 课时7:过滤器实战之比较过滤器 课时8:过滤器实战之专用过滤器与FilterList 课时9:过滤器实战之自定义过滤器 ...

Global site tag (gtag.js) - Google Analytics