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());elseput.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、scoreInfoString[] 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");}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux学习】Linux指令(四)

文章标题 &#x1f680;zip/unzip指令&#xff1a;&#x1f680;tar指令&#xff08;重要&#xff09;&#xff1a;&#x1f680;uname –r指令&#xff1a;&#x1f680;关机指令&#x1f680;几个常用操作 &#x1f680;zip/unzip指令&#xff1a; zip 与 unzip的安装 yum i…

【Git学习笔记(二)】Git的基本操作

Git的基本操作 前言正文1、Git本地仓库创建和一些基本概念1.1 本地仓库创建1.2 本地项目创建1.3 仓库区和工作区1.4 暂存区1.5 提交1.6 查看状态1.7 查看日志 2、Git服务器和远程仓库创建2.1 搭建自己的Git服务器2.2 免费服务器2.2.1 github.com2.2.2 gitee.com2.2.3 创建远程仓…

MySQL基础知识——MySQL事务

事务背景 什么是事务&#xff1f; 一组由一个或多个数据库操作组成的操作组&#xff0c;能够原子的执行&#xff0c;且事务间相互独立&#xff1b; 简单来说&#xff0c;事务就是要保证一组数据库操作&#xff0c;要么全部成功&#xff0c;要么全部失败。 注&#xff1a;MyS…

TCGAplot在线版:输入基因,一键绘制TCGA基因表达与TMB相关性雷达图

1.TCGAplot简介 华科同济医院的王雄老师课题组利用TCGA数据库&#xff0c;开发了一个TCGA多组学数据泛癌分析和可视化R包TCGAplot[1]。用于泛癌表达以及基因表达与 TMB、MSI、TIME 和启动子甲基化之间相关性等分析。 2.TMB简介 肿瘤突变负荷&#xff08;Tumor Mutation Burd…

【LLM】认识LLM

文章目录 1.LLM1.1 LLM简介1.2 LLM发展1.3 市面常见的LLM1.4 LLM涌现的能力 2.RAG2.1 RAG简介2.2 RAG 的工作流程2.3 RAG 和 Finetune 对比2.4 RAG的使用场景分析 3. LangChain3.1 LangChain简介3.2 LangChain的核心组件3.3 LangChain 入门 4.开发 RAG 应用的整体流程5. 环境配…

线上扭蛋机小程序成为年轻人创业选择

随着大众娱乐消费观的提升&#xff0c;带给消费者神秘感和惊喜感的扭蛋机开始走红&#xff0c;成为一个拥有广阔发展空间的行业。在当下二次元文化的火热下&#xff0c;扭蛋机的受众群体也遍布到了各个年龄层&#xff0c;深受大众的喜爱。 然而&#xff0c;玩家对扭蛋机的需求…

陇剑杯 省赛 攻击者1 CTF wireshark 流量分析

陇剑杯 省赛 攻击者1 题目 链接&#xff1a;https://pan.baidu.com/s/1KSSXOVNPC5hu_Mf60uKM2A?pwdhaek 提取码&#xff1a;haek ├───LogAnalize │ ├───linux简单日志分析 │ │ linux-log_2.zip │ │ │ ├───misc日志分析 │ │ acce…

伦敦银过夜费之——不能忽略的成本因素

众所周知&#xff0c;伦敦银是收益很好的投资品种&#xff0c;因为它采用了资金杠杆的原理&#xff0c;使投资者可以放大自己本金&#xff0c;而且还可以双向交易&#xff0c;并实现t0的资金回转。但在实际交易的过程中&#xff0c;投资者要充分考虑各种交易费用&#xff0c;对…

Zynq学习笔记--AXI 总线仿真(AXI VIP)

目录 1. 概述 2. Simulation with AXI VIP 2.1 axi_vip_pkg 2.2 design_1_axi_vip_0_0_pkg 2.3 参数指定 3. 实例化注意事项 3.1 名称对应关系 3.2 寄存器地址 3.3 block design 1. 概述 AXI Verification IP&#xff08;AXI VIP&#xff09;是一种用于验证AXI总线协议的…

MySQL行格式(row format)

MySQL行格式&#xff08;row format&#xff09; 表的行格式决定了其行的物理存储方式&#xff0c;这反过来又会影响查询和 DML 操作的性能。随着单个磁盘页面容纳更多行&#xff0c;查询和索引查找可以更快地工作&#xff0c;缓冲池中需要的高速缓存内存更少&#xff0c;写出…

Linux的学习之路:6、Linux编译器-gcc/g++使用

摘要 本文主要是说一些gcc的使用&#xff0c;g和gcc使用一样就没有特殊讲述。 目录 摘要 一、背景知识 二、gcc如何完成 1、预处理(进行宏替换) 2、编译&#xff08;生成汇编&#xff09; 3、汇编&#xff08;生成机器可识别代码 4、链接&#xff08;生成可执行文件或…

安宝特方案 | AR工业解决方案系列-工厂督查

在工业4.0时代&#xff0c;增强现实&#xff08;AR&#xff09;技术正全面重塑传统工业生产&#xff0c;在工厂监督领域&#xff0c;其应用不仅大幅提升了生产效率、监测准确性和规范执行程度&#xff0c;而且为整体生产力带来了质的飞跃。 01 传统挑战与痛点 在制造业生产流程…

uni.uploadFile上传图片后台接收不到数据

今天遇到一个很奇怪的问题&#xff0c;通过使用uni.uploadFile上传文件时后端接收不到文件&#xff0c;查过很多资料&#xff0c;原来是自定义了header的Content-Type问题。取消即可&#xff0c;另把自定义文件上传的代码贴出来。 分析&#xff1a;当我们加上请求头的时候 不…

DY视频评论ID爬取采集工具|短视频评论怕两提取获客

DY评论批量抓取工具&#xff1a;轻松拓展客户群&#xff0c;实时监控用户反馈 在当今竞争激烈的市场环境下&#xff0c;了解用户的反馈和需求对于企业的发展至关重要。作为一款风靡全球的社交媒体平台&#xff0c;&#xff08;DY&#xff09;汇聚了大量用户&#xff0c;而这些…

SQL表连接详解:JOIN与逗号(,)的使用及其性能影响

省流版 在这个详细的解释中&#xff0c;我们将深入探讨SQL中表连接的概念&#xff0c;特别是JOIN和逗号&#xff08;,&#xff09;在连接表时的不同用法及其对查询性能的影响。通过实际示例和背后的逻辑分析&#xff0c;我们将揭示在不同场景下选择哪种连接方式更为合适。 1.…

ChatGPT及GIS、生物、地球、农业、气象、生态、环境科学领域案例

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

使用Docker部署Node.js

第一步&#xff1a;在Node.js项目的根目录中新建Dockerfile文件 # 使用官方 Node.js 镜像作为基础镜像 FROM node:latest# 设置工作目录 WORKDIR /usr/src/app# 将项目文件复制到容器中 COPY . .# 将npm源设置为淘宝镜像 RUN npm config set registry https://registry.npmmir…

算法部署 | 使用TensorRT部署AlphaPose姿态估计算法

项目应用场景 面向 AlphaPose 姿态估计算法的推理加速场景&#xff0c;项目采用 TensorRT 进行 GPU 算法加速推理。 项目效果 项目细节 > 具体参见项目 README.md (1) 模型转换 python pytorch2onnx.py --cfg ./configs/coco/resnet/256x192_res50_lr1e-3_1x.yaml --chec…

【机器学习300问】67、均方误差与交叉熵误差,两种损失函数的区别?

一、均方误差&#xff08;Mean Squared Error, MSE&#xff09; 假设你是一个教练&#xff0c;在指导学生射箭。每次射箭后&#xff0c;你可以测量子弹的落点距离靶心的差距&#xff08;误差&#xff09;。MSE就像是计算所以射击误差的平方后的平均值。它强调了每一次偏离靶心的…

python/pygame 挑战魂斗罗 笔记(三)

感觉最难的部分已经解决了&#xff0c;下面开始发射子弹。 一、建立ContraBullet.py文件&#xff0c;Bullit类&#xff1a; 1、设定子弹速度 Config.py中设定子弹移动速度为常量Constant.BULLET_SPEED 8。 2、载入子弹图片&#xff1a; 图片也是6张&#xff0c;子弹发出后…