Hadoop+Spark大数据技术(微课版)曾国荪、曹洁版思维导图第四次作业 (第4章 HBase分布式DB)

 

  • 1.简述Hbase的特点及与传统关系数据库的区别

    • HBase与传统关系数据库的区别

      • (1)数据类型

        • 关系数据库具有丰富的数据类型,如字符串型、数值型、日期型、二进制型等。HBase只有字符串数据类型,数据的实际类型都是交由用户自己编写程序对字符串进行解析的。

      • (2)数据操作

        • 关系数据库中包含了丰富的操作,其中会涉及复杂的多表连接。HBase 操作则不存在复杂的表与表之间的关系,只有简单的插入、查询、删除、清空等,因为HBase在设计上就避免了复杂的表和表之间的关系

      • (3)存储模式

        • 关系数据库是基于行存储的,在关系数据库中读取数据时,需要顺序扫描每个元组,然后从中筛选出所需要查询的属性。HBase是基于列存储的,HBase将列划分为若干个列族,每个列族都由几个文件保存,不同列族的文件时分离的,它的优点是:可以降低IO开销,支持大量并发用户查询,仅需要处理所要查询的列,不需要处理与查询无关的大量数据列。

      • (4)数据索引

        • 关系数据库通常可以针对不同列构建复杂的多个索引,以提高数据访问性能。HBase只有一个索引一—行键,通过巧妙的设计,HBase 中的所有访问方法,或者箍过行键访简,或著通过行键扫描,从而使得整个系统不会慢下来

      • (5)数据维护

        • 在关系数据库中,更新操作会用最新的当前值去替换元组中原来的旧值。而HBase执行的更新操作不会删除数据旧的版本,而是添加一个新的版本,旧的版本仍然保留。

      • (6)可伸缩性

        • 关系数据库很难实现横向扩展,纵向扩展的空间也比较有限。相反,HBase和BigTable这些分布式数据库就是为了实现灵活的水平扩展而开发的,能够轻易施通过在集群中增加或著减少硬件数量来实现性能的伸缩

    • HBase的技术特点

      • 容量大。

        • 当关系数据库的单个表的记录在亿级时,则查询和写入的性能都会呈现指数级下降,而HBase对于单表存储百亿或更多的数据都没有性能问题。

      • 表结构不固定。

        • 可以根据需要动态的增加列,同一张表中不同的行可以有截然不同的列。

      • 列式存储。

        • 数据在表中是按列存储,可动态增加列,单独对列进行各种操作。

      • 稀疏性。

        • 空列不占用存储空间,表可以非常稀疏。

      • 数据类型单一。

        • HBase中的数据都是字符串。

    • 2.画出图4-1,简述Hbase与Hadoop中其他组件的关系。

      • HBase作为Hadoop生态系统的一部分,一方面它的运行依赖于Hadoop生态系统中的其他组件;另一方面,HBase又为Hadoop生态系统的其他组件提供了强大的数据存储和处理能力。

    • 3.通过表4-3和图4-4,简述Hbase在4个维度上的多维映射关系。

      • 行键

        • 每个HBase 表都由若干行组成,每个行由行键(row key)来标识。

      • 列族

        • 一个HBase 表被分组成许多“列族”(Column Family)的集合,它是基本的访问控制单元

      • 列限定符

        • 列族里的数据通过列限定符(或列)来定位

      • 单元格

        • 在HBase 表中,通过行·列成健和列限定符确定一个 “单元格”(cell),单元格中存储的数据没有数据类型,总被视为字节数组byte[]

      • 时间戳

        • 每个单元格都保存着同一份数据的多个版本,这些版本采用时间戳进行索引

      • HBase中需要根据行键、列族、列限定符和时间戳来确定一个单元格 因此,可以视为一个“四维坐标”,即[行键,列族,列限定符,时间戳]

    • 4.简述HBase Shell命令的分类和作用。

      • 基本命令

        • 1.获取帮助help

        • 2.查看服务器状态status

        • 3.查看当前用户whoami

        • 4.命名空间相关命令

          • (1)列出所有命名空间命令list_namespace

          • (2)创建命名空间命令create namespace

          • (3)查看命名空间命令describe_namespace

          • (4)创建表命令create

          • (5)列出指定命名空间下的所有表命令list_namespace_tables

          • (6)使表无效命令disable

          • (7)删除表命令drop

          • (8)删除命名空间命令drop namespace

      • 创建表

        • create<表名称>,<列族名称1>[,'列族名称2'...]

        • HBase中的表至少要有一个列族,列族直接影响HBasc数据存储的物理特性。

      • 插入与更新表中的数据

        • put<表名>,<行键>,<列族名:列名>,<值>[,时间戳]

      • 查看表中的数据

        • 1.查询某行数据get

        • 2.浏览表中全部数据scan

      • 删除表中的数据

        • delete命令用于删除一个单元格数据

        • deleteall命令用于删除一行数据

        • truncate命令用于删除表中的所有数据

      • 表的启用/禁用

        • enable和disable可以启用/禁用表

        • is_enabled和is_disabled来检查表是否被禁用。

      • 修改表结构

        • 修改表结构必须先禁用表。

          • disable 'student'#禁用student表

        • 1.添加列族alter '表名',列族名'

        • 2删除列族 alter '表名',{NAME=>'列族名',METHOD => 'delete'}

          • alter 'student',{NAME=> 'teacherInfo',METHOD => 'delete"}

      • 删除HBase表

        • 第一步禁用表,第二步删除表。

        • disable 'student’#禁用student表

        • drop 'student'#删除student表

    • 5.分析教材中P89-91中Java程序的功能,试改写程序为一个类实现。

教材P89-91内容如下:

//1.创建建表类 CreateHTable
import org.apache.hadoop.conf.configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import java.io.IOException;
public class CreateHTable{
	public static void create (String tableName, String[] columnFamily) throws IOException {
        Configuration cfg = HBaseConfiguration.create();//生成Configuration对象
        //生成HBaseAdmin对象,用于管理 HBase数据库的表
        HBaseAdmin admin = new HBaseAdmin(cfg);
        //创建表,先判断表是否存在,若存在,先删除旧表再建表
        if(admin.tableExists(tableName))(
            admin.disableTable(tableName);//禁用表
            admin.deleteTable(tableName);//删除表
        )
        //利用HBaseAdmin对象的createTable (HTableDescriptor desc)方法创建表
        //通过tableName建立HTableDescriptor对象(包含HBase表的详细信息)
        //通过HTableDescriptor对象的addFamily (HColumnDescriptor hcd)方法添加列族
        //HColumnDescriptor对象是以列族名作为参数创建的
        HTableDescriptor htd = new HTableDescriptor(tableName);
        for(String column : columnFamily){
            htd.addFamily(new HColumnDescriptor(column));
        }
        admin.createTable(htd);//创建表
    }
}
//2.创建插入数据类InsertHData
//利用前面在HBaseExample项目中创建CreateHTable类的方法创建插入数据类InsertHData,在InsertHData.java的源代码文件中输入以下代码:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import java.io.IOException;
public class InsertHData {
    public static void insertData (string tableName, String row, String columnFamily,String column , String data) throws IOException {
        Configuration cfg = HBaseConfiguration.create();
        // HTable对象用于与HBase进行通信
        HTable table = new HTable (cfg, tableName);
        //通过Put对象为已存在的表添加数据
        Put put = new Put (row.getBytes());
        if(column==null) //判断列限定符是否为空,如果为空,则直接添加列数据
            put.add (columnFamily.getBytes(),null, data.getBytes());
        else
            put.add (columnFamily.getBytes (), column. getBytes () , data.getBytes());
            //table对象的put()方法的输入参数 Put对象表示单元格数据
        table.put (put);
    }
}
//3.创建建表测试类TestCreateHTable
//利用前面在HBascExample项目中创建CreateHTable类的方法创建建表测试类TestCreateHTable,在TestCreatcHTable的源代码文件中输入以下代码:
import java.io.IOException;
public class TestCreateHTable{
    public static void main(String[] args)throws IOException{
        //先创建一个名为student的表,列族有baseinfo、scoreInfo
        String[] columnFamily = {"baseInfo" , "scoreInfo"};
        String tableName = "Student";
        CreateHTable.create(tableName, columnFamily);
        //插入数据
        //插入Ding的信息和成绩
        InsertHData.insertData ("student ", "Ding", "baseInfo", "Ssex" , "female");
        InsertHData.insertData ("student", "Ding", "baseInfo", "Sno","10106");
        InsertHData.insertData ( "student", "Ding" , "scoreInfo", "c","86");
        InsertHData.insertData ("student" ,"Ding" , "scoreInfo", "Java" , "82");
        InsertHData.insertData ( "Student" , "Ding", "scoreInfo" , "Python" , "87");
        //插入Yan的信息和成绩
        InsertHData.insertData ("student" , "Yan", "baseInfo" , "Ssex" , "female");
        InsertHData.insertData ("student", "Yan", "baseInfo" , "Sno", "10108");
        InsertHData.insertData ( "student" , "Yan", "scoreInfo", "c", "90");
        InsertHData.insertData ("Student", "Yan", "scoreInfo" , "Java", "91");
        InsertHData.insertData("student", "Yan" , "scoreInfo" , "python", "93");
        //插入Feng的信息和成绩
        InsertHData.insertData ("Student", "Feng" , "baseInfo" , "Ssex" ,"female");
        InsertHData.insertData ("Student" , "Feng" , "baseInfo" , "Sno","10107");
        InsertHData.insertData ("Student", "Feng", "scoreInfo", "c","89");
        InsertHData.insertData ("student", "Feng", "scoreInfo" , "Java", "83");
        InsertHData.insertData("Student", "Feng" , "scoreInfo" , "Python", "85");
    }
}
  • (1)CreateHTable 类

    • 创建一个 HBase 表。

    • 首先检查表是否已经存在,如果存在则先删除旧表,然后创建一个新表。

    • 通过 HTableDescriptor 对象定义表的名称和列族,然后使用 HBaseAdmin 对象创建表。

  • (2)InsertHData 类

    • 向 HBase 表中插入数据。

    • 使用 HTable 对象与 HBase 进行通信,并创建 Put 对象来表示要插入的单元格数据。

    • 根据是否指定列限定符,使用不同的方法向表中添加数据。

  • (3)TestCreateHTable 类

    • 测试类,用于测试前面两个类的功能。

    • 首先创建了一个名为 "Student" 的表,列族为 "baseInfo" 和 "scoreInfo"。

    • 然后使用 InsertHData 类向表中插入了三个学生的信息和成绩。

改写为一个类实现:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;

import java.io.IOException;

/**
 * HBaseManager 类提供了创建 HBase 表和向表中插入数据的功能。
 */
public class HBaseManager {
    private Configuration configuration;
    private HBaseAdmin admin;

    /**
     * 构造函数,初始化 HBase 配置和管理员对象。
     *
     * @throws IOException 如果初始化过程中出现 I/O 异常
     */
    public HBaseManager() throws IOException {
        this.configuration = HBaseConfiguration.create();
        this.admin = new HBaseAdmin(configuration);
    }

    /**
     * 创建 HBase 表。
     *
     * @param tableName       表名
     * @param columnFamilies  列族名数组
     * @throws IOException 如果创建表过程中出现 I/O 异常
     */
    public void createTable(String tableName, String[] columnFamilies) throws IOException {
        // 检查表是否已存在
        if (admin.tableExists(tableName)) {
            // 如果表存在,先禁用并删除旧表
            admin.disableTable(tableName);
            admin.deleteTable(tableName);
        }

        // 创建新表
        HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);
        for (String columnFamily : columnFamilies) {
            // 为表添加列族
            tableDescriptor.addFamily(new HColumnDescriptor(columnFamily));
        }
        admin.createTable(tableDescriptor);
    }

    /**
     * 向 HBase 表中插入数据。
     *
     * @param tableName     表名
     * @param row           行键
     * @param columnFamily  列族名
     * @param column        列限定符(可为null)
     * @param data          要插入的数据
     * @throws IOException 如果插入数据过程中出现 I/O 异常
     */
    public void insertData(String tableName, String row, String columnFamily, String column, String data) throws IOException {
        // 获取表对象
        HTable table = new HTable(configuration, tableName);
        // 创建 Put 对象表示要插入的单元格数据
        Put put = new Put(row.getBytes());
        // 判断是否指定了列限定符
        if (column == null) {
            // 如果没有指定列限定符,直接添加列数据
            put.add(columnFamily.getBytes(), null, data.getBytes());
        } else {
            // 如果指定了列限定符,使用列限定符添加列数据
            put.add(columnFamily.getBytes(), column.getBytes(), data.getBytes());
        }
        // 将 Put 对象写入表
        table.put(put);
    }
}

public class HBaseManagerTest {
    public static void main(String[] args) throws IOException {
        HBaseManager manager = new HBaseManager();

        // 创建表
        String[] columnFamilies = {"baseInfo", "scoreInfo"};
        String tableName = "Student";
        manager.createTable(tableName, columnFamilies);

        // 插入数据
        // 插入 Ding 的信息和成绩
        manager.insertData("Student", "Ding", "baseInfo", "Ssex", "female");
        manager.insertData("Student", "Ding", "baseInfo", "Sno", "10106");
        manager.insertData("Student", "Ding", "scoreInfo", "C", "86");
        manager.insertData("Student", "Ding", "scoreInfo", "Java", "82");
        manager.insertData("Student", "Ding", "scoreInfo", "Python", "87");

        // 插入 Yan 的信息和成绩
        manager.insertData("Student", "Yan", "baseInfo", "Ssex", "female");
        manager.insertData("Student", "Yan", "baseInfo", "Sno", "10108");
        manager.insertData("Student", "Yan", "scoreInfo", "C", "90");
        manager.insertData("Student", "Yan", "scoreInfo", "Java", "91");
        manager.insertData("Student", "Yan", "scoreInfo", "Python", "93");

        // 插入 Feng 的信息和成绩
        manager.insertData("Student", "Feng", "baseInfo", "Ssex", "female");
        manager.insertData("Student", "Feng", "baseInfo", "Sno", "10107");
        manager.insertData("Student", "Feng", "scoreInfo", "C", "89");
        manager.insertData("Student", "Feng", "scoreInfo", "Java", "83");
        manager.insertData("Student", "Feng", "scoreInfo", "Python", "85");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/543711.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Google Imagen 2对比OpenAI的Dall-E 3 - 同一提示,不同结果

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

python怎么输出小数

先将整型转换成float型&#xff0c;再进行计算&#xff0c;结果就有小数了。 >>> a 10 >>> b 4 >>> c a/b >>> a,b,c (10, 4, 2) >>> a float(a) >>> d a/b >>> a,b,d (10.0, 4, 2.5) >>> 注意&…

1036: 寻找整数序列的主元素

解法&#xff1a; #include<iostream> #include<vector> #include<algorithm> using namespace std; int main() {int n;cin >> n;vector<int> arr(n);vector<int> tong(1000);for (auto& x : arr) {cin >> x;tong[x];}int pma…

如何在Windows安装LocalSend并结合内网穿透实现公网跨平台远程文件互传

文章目录 1. 在Windows上安装LocalSend2. 安装Cpolar内网穿透3. 公网访问LocalSend4. 固定LocalSend公网地址 本篇文章介绍在Windows中部署开源免费文件传输工具——LocalSend&#xff0c;并且结合cpolar内网穿透实现公网远程下载传输文件。 localsend是一款基于局域网的文件传…

宜搭无权查询该应用信息,唯一排查码:21081d4e17130865292352743e9ed8

这种问题可能是关联表单出现了问题&#xff0c;当前应用中没有这个表单 所以就出现了应用无权访问的问题

备战蓝桥杯(日益更新)(刷题)

备战蓝桥杯&#xff08;日益更新&#xff09;&#xff08;刷题&#xff09; 文章目录 备战蓝桥杯&#xff08;日益更新&#xff09;&#xff08;刷题&#xff09;前言&#xff1a;一、二分&#xff1a;1. acwing503 借教室&#xff1a;&#xff08;二分 差分&#xff09;2. ac…

荔枝派LicheePi 4A RISCV板子支持的好玩的AI模型

荔枝派LicheePi 4A 是基于 Lichee Module 4A 核心板的 高性能 RISC-V Linux 开发板&#xff0c;以 TH1520 为主控核心&#xff08;4xC9101.85G&#xff0c; RV64GCV&#xff0c;4TOPSint8 NPU&#xff0c; 50GFLOP GPU&#xff09;&#xff0c;板载最大 16GB 64bit LPDDR4X&…

JavaScript(七)-高级技巧篇

文章目录 深浅拷贝浅拷贝深拷贝 异常处理thorw抛异常try/catch捕获异常debugger 处理thisthis指向改变this 性能优化防抖lodash实现防抖手写防抖函数 节流 - throttle 深浅拷贝 浅拷贝 深拷贝 深拷贝有三种方式 通过递归实现深拷贝 一定先写数组再写对象 lodash/cloneDeep …

PostgreSQL入门到实战-第二十八弹

PostgreSQL入门到实战 PostgreSQL中数据分组操作(三)官网地址PostgreSQL概述PostgreSQL中GROUPING SETS命令理论PostgreSQL中GROUPING SETS命令实战更新计划 PostgreSQL中数据分组操作(三) 使用PostgreSQL grouping sets子句在查询中生成多个分组集。 官网地址 声明: 由于操…

[尚硅谷flink] 检查点笔记

在Flink中&#xff0c;有一套完整的容错机制来保证故障后的恢复&#xff0c;其中最重要的就是检查点。 文章目录 11.1 检查点11.1.1 检查点的保存1&#xff09;周期性的触发保存2&#xff09;保存的时间点3&#xff09;保存的具体流程 11.1.2 从检查点恢复状态11.1.3 检查点算法…

linux 内存寻址

&#xff08;持续更新&#xff09; 相关概念 查看的书籍为 深入linux内核 内存地址 当使用80x86&#xff08;32位&#xff09;微处理器时&#xff0c;一般分为三种不同的地址&#xff1a; 逻辑地址 包含在机器语言指令中用来指定一个操作数或一条指令的地址。每一个逻辑地址…

【服务器配置】Portainer环境配置

Portainer环境配置 概述 Portainer 是一种用于管理 Docker 和 Kubernetes 容器的开源工具。通过其用户友好的 Web 界面&#xff0c;用户可以轻松管理容器、镜像、网络和卷等资源 拉去最新的Portainer docker pull portainer/portainer 安装和启动 docker run -d --restarta…

WindowsServer 2022 AD域控-006-安装副域控

试验拓扑图&#xff1a; 一、测试单域控故障&#xff0c;用户无法修改密码&#xff1b; 域控断网&#xff0c;Win10测试; 二、WindowsServer2022 DC02加入域控&#xff1b; 加入成功 此时域控上只有DC02这台服务器&#xff0c;但DC02并不是域控&#xff1b; 三、WindowsS…

『VUE』17. Dom与模板引用(详细图文注释)

目录 回顾之前的操作ref 属性借助dom使用原生js总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 回顾之前的操作 之前的这些操作都是我们使用vue为我们渲染的对象,再来操作dom 内容改变{{ 模板语法 }}属性改变 v-bind:添加事…

Java 中文官方教程 2022 版(二十九)

原文&#xff1a;docs.oracle.com/javase/tutorial/reallybigindex.html BCP 47 扩展 原文&#xff1a;docs.oracle.com/javase/tutorial/i18n/locale/extensions.html Java SE 7 版本符合 IETF BCP 47 标准&#xff0c;支持向Locale添加扩展。任何单个字符都可以用于表示扩展&…

2. Spring的创建和Bean的存取

经过前面的学习我们已经大体明白了 IOC 思想以及它的实现方式 DI &#xff0c;本节要讲的是如何Spring框架实现实现DI。 本节目标&#xff1a; Spring(Core) 项目创建将对象存储到 Spring 中将对象(bean)从 Spring 中取出 1. 创建 Spring 项目 与开篇演示的 Spring Boot 项目不…

2024MathorCup数学建模B题成品论文26页+1-4小问代码全解析+答疑

B题 甲骨文智能识别中原始拓片单字自动分割与识别研究 &#xff08;完整版见文末&#xff09; 甲骨文是我国目前已知的最早成熟的文字系统&#xff0c;它是一种刻在龟甲或兽骨上的古老文字。甲骨文具有 极其重要的研究价值&#xff0c;不仅对中国文明的起源具有重要意义&#x…

解放双手,批量绕过403

将dirsearch扫描出来的结果复制到url.txt&#xff0c;如下所示 url.txt [21:18:16] 502 - 0B - /var/log/exception.log [21:18:21] 502 - 0B - /WEB-INF/jetty-env.xml [21:18:22] 502 - 0B - /WEB-INF/weblogic.xml [21:18:27] 502 - 0B - /wp-json/wp/v2/u…

云笔记小程序的实现

1.前言 云笔记, 是基于HotApp小程序统计云后台提供的api接口开发的一个微信小程序。 2.功能 离线保存笔记 云端数据同步, 更换了设备也可以找到以前的笔记 接入了好推二维码提供的数据统计工具, 可以到平台上查看用户分析、留存分析、事件分析。 3.界面效果 ***HotApp云笔…

Java 入门教程||Java 关键字

Java 关键字 Java教程 - Java关键字 Java中的关键字完整列表 关键词是其含义由编程语言定义的词。 Java关键字和保留字&#xff1a; abstract class extends implements null strictfp true assert const false import package super try …