• Hbase作业题--社交关系表


    题目

    在社交网站,社交APP上会存储有大量的用户数据以及用户之间的关系数据,比如A用户的好友列表会展示出他所有的好友,现有一张Hbase表,存储就是当前注册用户的好友关系数据。

    需求

    1. 使用Hbase相关API创建一张结构如上的表
    2. 删除好友操作实现(好友关系双向,一方删除好友,另一方也会被迫删除好友)
    例如:uid1用户执行删除uid2这个好友,则uid2的好友列表中也必须删除uid1

    环境搭建

    -- 创建表
    create 'relations', {NAME => 'friends', VERSIONS => '1'}
    -- 添加数据 put 'relations', 'uid1', 'friends:uid2', 'uid2' put 'relations', 'uid1', 'friends:uid3', 'uid3' put 'relations', 'uid1', 'friends:uid4', 'uid4' put 'relations', 'uid2', 'friends:uid1', 'uid1' put 'relations', 'uid2', 'friends:uid3', 'uid3' put 'relations', 'uid3', 'friends:uid1', 'uid1' -- 查看数据 scan 'relations'
    ROW COLUMN+CELL uid1 column=friends:uid2, timestamp=1608010040706, value=uid2 uid1 column=friends:uid3, timestamp=1608010077381, value=uid3 uid1 column=friends:uid4, timestamp=1608010083645, value=uid4 uid2 column=friends:uid1, timestamp=1608010098725, value=uid1 uid2 column=friends:uid3, timestamp=1608010090459, value=uid3 uid3 column=friends:uid1, timestamp=1608010090459, value=uid1

    实现

    1.编写协处理器

    package com.lagou.hbase;
    
    import org.apache.hadoop.hbase.Cell;
    import org.apache.hadoop.hbase.CellUtil;
    import org.apache.hadoop.hbase.TableName;
    import org.apache.hadoop.hbase.client.*;
    import org.apache.hadoop.hbase.coprocessor.BaseRegionObserver;
    import org.apache.hadoop.hbase.coprocessor.ObserverContext;
    import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;
    import org.apache.hadoop.hbase.regionserver.wal.WALEdit;
    import org.apache.hadoop.hbase.util.Bytes;
    
    import java.io.IOException;
    import java.util.List;
    import java.util.Map;
    import java.util.NavigableMap;
    import java.util.Set;
    
    // 继承协处理器BaseRegionObserver
    
    public class DelRelation extends BaseRegionObserver {
        // 重写postDelete
        @Override
        public void postDelete(final ObserverContext<RegionCoprocessorEnvironment> e, final Delete delete, final WALEdit edit, final Durability durability) throws IOException {
            super.postDelete(e, delete, edit, durability);
            //获取表对象
            HTableWrapper roles = (HTableWrapper)e.getEnvironment().getTable(TableName.valueOf("roles"));
            //获取执行删除的列族队列集合
            NavigableMap<byte[], List<Cell>> familyCellMap = delete.getFamilyCellMap();
            //通过队列集合
            Set<Map.Entry<byte[], List<Cell>>> entries = familyCellMap.entrySet();
            //循环队列获取cells对象
            for (final Map.Entry<byte[], List<Cell>> entry : entries) {
                System.out.println(Bytes.toString(entry.getKey()));
                List<Cell> cells = entry.getValue();
                //循环cells对象获取每个cell的rowkey以及列族
                for (final Cell cell : cells) {
                    byte[] rowkey = CellUtil.cloneRow(cell);
                    byte[] qualifier = CellUtil.cloneQualifier(cell);
                    //判断是否存在删除的rowkey的cell
                    boolean flag = roles.exists(new Get(qualifier).addColumn(Bytes.toBytes("friends"), rowkey));
    
                    if (flag){
                        //生成一个delete对象对需要删除的列族进行删除
                        Delete delQualifier = new Delete(qualifier).addColumn(Bytes.toBytes("friends"), rowkey);
                        roles.delete(delQualifier);
                    }
    
                }
            }
        }
    }
    

    2.打成Jar包,上传HDFS

    -- 复制文件到linux系统并修改名称
    cd /opt/lagou/softwares mv original-hbaseStudy-1.0-SNAPSHOT.jar precessor2.jar

    -- 上传jar包至hdfs hdfs dfs -mkdir -p /processor hdfs dfs -put precessor2.jar /processor

    3. 挂载协处理器

    -- 查看表信息
    describe 'relations'

    -- 挂在协处理器 alter 'relations',METHOD =>'table_att','Coprocessor'=>'hdfs://centos7-1:9000/processor/processor.jar|com.lagou.hbase.DelRelation|1001|'

    -- 再次查看表信息(注意变化的地方) describe 'relations'

    4.验证协处理器

    -- 删除数据,查看功能实现
    delete 'relations', 'uid1', 'friends:uid2'

    验证结果

     

  • 相关阅读:
    知乎
    热磁性储存系统转载
    超薄纳米纸张 比钢强250倍转载
    TFT LCD数据存储为BMP文件的C语言代码
    GPS NMEA0183协议详解 转载
    JPG文件结构分析转载
    SD/TF 引脚
    调试错误:No Algorithm found for(转载)
    STM32 USB IAP 步骤
    追踪“善恶有报” 解开生命健康福寿秘密(转载)
  • 原文地址:https://www.cnblogs.com/aloneme/p/14956774.html
Copyright © 2020-2023  润新知