IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 【hadoop 学习笔记-4】基于 hbase 的mapreduce -> 正文阅读

[大数据]【hadoop 学习笔记-4】基于 hbase 的mapreduce

说明

hbase?数据说明

member表

result?表,用于存储 mapreduce?结果

?

mapreduce?程序功能

统计 member?表中 address.city?的值出现的次数

比如?上面截图中的数据,

beijing?出现了2次

ningde?出现了2次

Mapper

package com.test;

import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableMapper;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

public class AMapper extends TableMapper<Text, IntWritable> {

    @Override
    protected void map(ImmutableBytesWritable key, Result value, Context context) throws IOException, InterruptedException {
        byte[] family = Bytes.toBytes("address");
        byte[] column = Bytes.toBytes("city");
        String data = Bytes.toString(value.getValue(family, column));
        context.write(new Text(data), new IntWritable(1));
    }
}

和之前从文件中逐行输入字符串不同,这里的Mapper?类型是 TableMapper<Text, IntWritable>

Text , IntWritable?分别是 Mapper?的输出的?键和值的类型。

Mapper?的输入直接体现在 map()函数的参数上

map(ImmutableBytesWritable key, Result value, Context context)

hbase的每一行数据,执行一次map函数,第一个参数是hbase数据的行键,第二个参数是整行的数据。

Reducer

package com.test;

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.hbase.util.Bytes;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text
import java.io.IOException;

public class AReducer extends TableReducer<Text, IntWritable, ImmutableBytesWritable> {

    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        //super.reduce(key, values, context);
        int total = 0;
        for (IntWritable v : values) {
            total += v.get();
        }

        byte[] rowKey = key.getBytes();

        byte[] family = Bytes.toBytes("content");
        byte[] column = Bytes.toBytes("count");

        Put put = new Put(rowKey);
        put.addColumn(family, column, Bytes.toBytes(total + ""));

        context.write(new ImmutableBytesWritable(rowKey), put);
    }
}

TableReducer<Text, IntWritable, ImmutableBytesWritable>

三个类,前两个是Reducer的输入

context.write?的第一个参数是?ImmutableBytesWritable(rowKey)?和第二个参数 put?的 rowkey?保持一致

(TODO:?这里我不太理解的是为何 context.write?不是直接?传入 put?就可以了,这里 put?里有了 hbase?写入行数据所需要的信息里,??ImmutableBytesWritable(rowKey)? 的作用是什么??

Main

package com.test;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;

public class Main {

    public static void main(String[] args) throws Exception {


        Configuration conf = new Configuration();
        conf.set("hbase.zookeeper.quorum", "127.0.0.1");

        Job job = Job.getInstance(conf);

        job.setJarByClass(Main.class);

        byte[] family = Bytes.toBytes("address");
        byte[] column = Bytes.toBytes("city");
        Scan scan = new Scan();
        scan.addColumn(family, column);
        TableMapReduceUtil.initTableMapperJob("member", scan, AMapper.class, Text.class, IntWritable.class, job);
        TableMapReduceUtil.initTableReducerJob("result", AReducer.class, job);

        job.waitForCompletion(true);
    }

}


? ? ? ? TableMapReduceUtil.initTableMapperJob(

"member", //?数据源对应的表

scan, //?查询

AMapper.class, // MAPPER对应的类

Text.class,? // MAPPER的输出键的类型

IntWritable.class,? // MAPPER的输出值的类型

job);


? ? ? ? TableMapReduceUtil.initTableReducerJob(

"result",//?存储结果数据的表

AReducer.class,? // REDUCER对应的

job);

运行结果

参考资料:

http://people.apache.org/~jdcryans/hbase-0.20.5-candidate-3/hbase-0.20.5/docs/api/org/apache/hadoop/hbase/mapreduce/TableReducer.html

org.apache.hadoop.hbase.mapreduce
Class TableReducer<KEYIN,VALUEIN,KEYOUT>

java.lang.Object
  org.apache.hadoop.mapreduce.Reducer<KEYIN,VALUEIN,KEYOUT,org.apache.hadoop.io.Writable>
      org.apache.hadoop.hbase.mapreduce.TableReducer<KEYIN,VALUEIN,KEYOUT>

Type Parameters:

KEYIN?- The type of the input key.

VALUEIN?- The type of the input value.

KEYOUT?- The type of the output ke

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-07-28 07:53:02  更:2021-07-28 07:53:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 20:56:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码