HBase与MapReduce集成

HBase集成MapReduce

通过 HBase 的相关 JavaAPI,我们可以实现伴随 HBase 操作的 MapReduce 过程,比如使用MapReduce 将数据从本地文件系统导入到 HBase 的表中,比如我们从 HBase 中读取一些原始数据后使用 MapReduce 做数据分析。

官方 HBase-MapReduce

1.查看 HBase 的 MapReduce 任务的执行

$ bin/hbase mapredcp

2.环境变量的导入

(1)执行环境变量的导入(临时生效,在命令行执行下述操作)

$ export HBASE_HOME=/opt/module/hbase 
$ export HADOOP_HOME=/opt/module/hadoop3
$ export HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase mapredcp` 

(2)永久生效:在/etc/profile 配置

export HBASE_HOME=/opt/module/hbase 
export HADOOP_HOME=/opt/module/hadoop3

并在 hadoop-env.sh 中配置:(注意:在 for 循环之后配

export HADOOP_CLASSPA TH=$HADOOP_CLASSPA TH:/opt/module/hbase/lib/* 

3.运行官方的 MapReduce 任务

– 案例一:统计 Student 表中有多少行数据

$ /opt/module/hadoop-2.7.2/bin/yarn jar lib/hbase-server-1.3.1.jar rowcounter student 

– 案例二:使用 MapReduce 将本地数据导入到 HBase

1)在本地创建一个 tsv 格式的文件:fruit.tsv

1001  Apple Red 
1002  Pear  Yellow 
1003  Pineapple Yellow 

2)创建 Hbase 表

Hbase(main):001:0> create 'fruit','info' 

3)在 HDFS 中创建 input_fruit 文件夹并上传 fruit.tsv 文件

$ /opt/module/hadoop-2.7.2/bin/hdfs dfs -mkdir /input_fruit/ 
$ /opt/module/hadoop-2.7.2/bin/hdfs  dfs  -put  fruit.tsv /input_fruit/ 

4)执行 MapReduce 到 HBase 的 fruit 表中

$ /opt/module/hadoop-2.7.2/bin/yarn jar lib/hbase-server-1.3.1.jar importtsv \ 
-Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:color fruit \ hdfs://hadoop102:9000/input_fruit 

5)使用 scan 命令查看导入后的结果

Hbase(main):001:0> scan ‘fruit’ 

自定义 HBase-MapReduce1

目标:将 fruit 表中的一部分数据,通过 MR 迁入到 fruit_mr 表中。

分步实现:

1.构建 ReadFruitMapper 类,用于读取 fruit 表中的数据

public  class  ReadFruitMapper  extends 
TableMapper<ImmutableBytesWritable, Put> { 
 
  @Override 
   protected void map(ImmutableBytesWritable key, Result value, 
Context context)  
  throws IOException, InterruptedException { 
  //将 fruit 的 name 和 color 提取出来,相当于将每一行数据读取出来放入到 Put
对象中。 
   Put put = new Put(key.get()); 
   //遍历添加 column 行 
   for(Cell cell: value.rawCells()){ 
    //添加/克隆列族:info 
  
  if("info".equals(Bytes.toString(CellUtil.cloneFamily(cell)))){ 
     //添加/克隆列:name 
   
  if("name".equals(Bytes.toString(CellUtil.cloneQualifier(cell))
)){ 
      //将该列 cell 加入到 put 对象中 
      put.add(cell); 
      //添加/克隆列:color 
     }else 
if("color".equals(Bytes.toString(CellUtil.cloneQualifier(cell))))
{ 
      //向该列 cell 加入到 put 对象中 
      put.add(cell); 
     } 
    } 
   } 
   //将从 fruit 读取到的每行数据写入到 context 中作为 map 的输出 
   context.write(key, put); 
  } 
}

2. 构建 WriteFruitMRReducer 类, 用于将读取到的 fruit 表中的数据写入到 fruit_mr 表中

public  class  WriteFruitMRReducer  extends 
TableReducer<ImmutableBytesWritable, Put, NullWritable> { 
  @Override 
  protected void reduce(ImmutableBytesWritable key, Iterable<Put> values, Context context)  throws IOException, InterruptedException { 
       //读出来的每一行数据写入到 fruit_mr 表中 
       for(Put put: values){ 
        	context.write(NullWritable.get(), put); 
   } 
  } 
} 

3.构建 Fruit2FruitMRRunner extends Configured implements T ool 用于组装运行 Job任务

//组装 Job 
  public int run(String[] args) throws Exception { 
   //得到 Configuration 
   Configuration conf = this.getConf(); 
   //创建 Job 任务 
   Job  job  =  Job.getInstance(conf, 
this.getClass().getSimpleName()); 
   job.setJarByClass(Fruit2FruitMRRunner.class); 
 
   //配置 Job 
   Scan scan = new Scan(); 
   scan.setCacheBlocks(false); 
   scan.setCaching(500); 
 
   //设置 Mapper,注意导入的是 mapreduce 包下的,不是 mapred 包下的,后者
是老版本 
   TableMapReduceUtil.initTableMapperJob( 
   "fruit", //数据源的表名 
   scan, //scan 扫描控制器 
   ReadFruitMapper.class,//设置 Mapper 类 
   ImmutableBytesWritable.class,//设置 Mapper 输出 key 类型 
   Put.class,//设置 Mapper 输出 value 值类型 
   job//设置给哪个 JOB 
   ); 
   //设置 Reducer 
   TableMapReduceUtil.initTableReducerJob("fruit_mr", 
WriteFruitMRReducer.class, job); 
   //设置 Reduce 数量,最少 1 个 
   job.setNumReduceTasks(1); 
 
   boolean isSuccess = job.waitForCompletion(true); 
   if(!isSuccess){ 
    throw new IOException("Job running with error"); 
   } 
   return isSuccess ? 0 : 1; 
  }

4.主函数中调用运行该 Job 任务

public static void main( String[] args ) throws Exception{ 
    Configuration conf = HbaseConfiguration.create(); 
    int status = ToolRunner.run(conf, new Fruit2FruitMRRunner(), args); 
    System.exit(status); 
} 

5.打包运行任务

$ /opt/module/hadoop-2.7.2/bin/yarn jar ~/softwares/jars/Hbase-0.0.1-SNAPSHOT.jar com.z.Hbase.mr1.Fruit2FruitMRRunner 

自定义 Hbase-MapReduce2

目标:实现将 HDFS 中的数据写入到 Hbase 表中。

分步实现:

1.构建 ReadFruitFromHDFSMapper 于读取 HDFS 中的文件数据

public class ReadFruitFromHDFSMapper extends Mapper<LongWritable, 
Text, ImmutableBytesWritable, Put> { 
  @Override 
  protected void map(LongWritable key, Text value, Context 
context) throws IOException, InterruptedException { 
   //从 HDFS 中读取的数据 
   String lineValue = value.toString(); 
   //读取出来的每行数据使用\t 进行分割,存于 String 数组 
   String[] values = lineValue.split("\t"); 
   
   //根据数据中值的含义取值 
   String rowKey = values[0]; 
   String name = values[1]; 
   String color = values[2]; 
   
   //初始化 rowKey 
   ImmutableBytesWritable  rowKeyWritable  =  new 
ImmutableBytesWritable(Bytes.toBytes(rowKey)); 
   
   //初始化 put 对象 
   Put put = new Put(Bytes.toBytes(rowKey)); 
   
   //参数分别:列族、列、值   
        put.add(Bytes.toBytes("info"),  Bytes.toBytes("name"),  
Bytes.toBytes(name));  
        put.add(Bytes.toBytes("info"),  Bytes.toBytes("color"),  
Bytes.toBytes(color));  
         
        context.write(rowKeyWritable, put); 
  } 
} 

2.构建 WriteFruitMRFromTxtReducer 类

public  class  WriteFruitMRFromTxtReducer  extends TableReducer<ImmutableBytesWritable, Put, NullWritable> { 
  @Override 
  protected void reduce(ImmutableBytesWritable key, Iterable<Put> values, Context context) throws IOException, InterruptedException 
{ 
   //读出来的每一行数据写入到 fruit_hdfs 表中 
   for(Put put: values){ 
    context.write(NullWritable.get(), put); 
   } 
  } 
}

**3.创建 Txt2FruitRunner 组装 Job **

public int run(String[] args) throws Exception { 
//得到 Configuration 
Configuration conf = this.getConf(); 
 
//创建 Job 任务 
Job job = Job.getInstance(conf, this.getClass().getSimpleName()); 
job.setJarByClass(Txt2FruitRunner.class); 
Path  inPath  =  new 
Path("hdfs://hadoop102:9000/input_fruit/fruit.tsv"); 
FileInputFormat.addInputPath(job, inPath); 
 
//设置 Mapper 
job.setMapperClass(ReadFruitFromHDFSMapper.class); 
job.setMapOutputKeyClass(ImmutableBytesWritable.class); 
job.setMapOutputValueClass(Put.class); 
 
//设置 Reducer 
TableMapReduceUtil.initTableReducerJob("fruit_mr", 
WriteFruitMRFromTxtReducer.class, job); 
 
//设置 Reduce 数量,最少 1 个 
job.setNumReduceTasks(1); 
 
boolean isSuccess = job.waitForCompletion(true); 
if(!isSuccess){ 
throw new IOException("Job running with error"); 
} 
 
return isSuccess ? 0 : 1; 
}

4.调用执行 Job

public static void main(String[] args) throws Exception { 
   Configuration conf = HBaseConfiguration.create(); 
     int status = ToolRunner.run(conf, new Txt2FruitRunner(), 
args); 
     System.exit(status); 
} 

5.打包运行

$ /opt/module/hadoop-2.7.2/bin/yarn jar hbase-0.0.1-SNAPSHOT.jar com.gis.hbase.mr2.Txt2FruitRunner 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 当HBase遇上MapReduce,可以实现大规模数据的分布式处理和存储。HBase是一个分布式的NoSQL数据库,可以存储海量数据,并提供快速的读写能力。而MapReduce是一种分布式计算框架,可以对大规模数据进行并行处理。将HBaseMapReduce结合起来,可以实现对海量数据的高效处理和存储,提高数据处理的效率和性能。同时,HBaseMapReduce都是Apache开源项目,具有广泛的社区支持和丰富的生态系统。 ### 回答2: 当HBase遇上MapReduce时,会发生一系列的事情。HBase是一种分布式的、可扩展的非关系型数据库,而MapReduce是一种用于大规模数据处理的编程模型。它们能够结合使用,以实现高效的数据处理和分析。 首先,MapReduce可以将大规模的数据集分成小块,并将这些小块分发给不同的节点进行处理。而HBase则可以在这些节点上存储和检索数据。通过将HBase作为输入和输出源,MapReduce可以直接从HBase中读取数据,并将计算结果写回到HBase中。 其次,HBase的数据模型适用于快速读取和写入大量数据,而MapReduce可以利用Hadoop的分布式计算框架,以并行的方式进行数据处理。通过将MapReduce应用于HBase的数据,可以实现高效的数据处理和分析,从而实现更快的速度和更好的性能。 此外,HBaseMapReduce还可以通过Hadoop的JobTracker和TaskTracker进行协调和管理。JobTracker负责分配任务给不同的节点,而TaskTracker负责执行任务。这种分布式的任务调度和执行机制可以最大程度地利用集群的计算资源,从而提高整体的效率和性能。 综上所述,当HBase遇上MapReduce时,可以实现高效的数据处理和分析。通过结合HBase的数据存储和检索能力与MapReduce的分布式计算能力,我们可以更好地利用大数据,并从中获取有价值的信息。这种结合为我们提供了强大且灵活的数据处理解决方案,有助于应对数据爆炸时代的挑战。 ### 回答3: 头歌是一款开源的分布式数据库系统,而MapReduce是一种用于处理大数据集的编程模型。当头歌遇上MapReduce时,可以带来许多优势和便利。 首先,头歌作为分布式数据库系统,提供了高可靠性和可扩展性。它可以将数据分布在集群的多个节点上,实现数据的冗余存储和副本备份,从而保证数据的可靠性和持久性。而MapReduce作为一种并行计算模型,可以充分利用集群中的计算资源,并通过数据的切片、并行计算和结果的合并,实现对大数据集的高效处理和分析。 其次,头歌的数据模型和MapReduce的计算模型相互配合。头歌采用列存储的数据模型,在数据存储和查询方面具有高效性能。而MapReduce模型则适合处理批量的数据,通过将数据切片为多个小的处理单元,分而治之地进行计算。因此,当头歌遇上MapReduce时,可以通过MapReduce对头歌中的数据进行灵活的计算和分析,实现更广泛的数据处理需求。 此外,头歌和MapReduce之间通过Hadoop生态系统进行集成,提供了更强大的功能和工具支持。Hadoop生态系统包括HDFS分布式文件系统、YARN资源管理器等。头歌可以将数据直接存储在HDFS上,而MapReduce可以通过YARN对头歌中的数据进行并行计算。这种集成能力使得头歌和MapReduce可以无缝地协同工作,充分发挥各自的优势,实现大规模数据的存储、处理和分析。 总之,当头歌遇上MapReduce时,可以实现分布式数据库和并行计算的完美结合。这种组合能够为大规模数据处理带来高可靠性、高效性和可扩展性。同时,通过Hadoop生态系统的支持,头歌和MapReduce之间的协同工作更加便捷和灵活。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牧码文

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值