解决hbase热点数据的问题?
1.一个region是一个无边界的,所有的rowkey都会写入同一个rowkey,当rowkey的size大到一定的阈值时,hbase就会将region一分为二,这个过程叫做分裂
–解决方案
1.rowkey的散列或者预分区
(1).预分区一开始就预建好了一部分region,这些region都维护着自己的start-end keys,我们将rowkey做一些处理,比如RowKey%i,写数据能均衡的命中这些预建的region,就能解决上面的那些缺点,大大提供性能
(2).而将rowkey散列化就是避免rowkey自增,这样也能解决上面所说的缺点。2.加盐
一把rowkey前缀,决定了在哪一个分区。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sQeZRcic-1621440138797)(https://i.loli.net/2021/05/19/FuYUTk4WbE3D8Rl.png)]
降低热点问题,但是会造成读的时候,效率下降。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OfPxb3Nt-1621440138802)(https://i.loli.net/2021/05/19/O6yZmUgufE3FkzT.png)]
哈希
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ar1FM70C-1621440138806)(https://i.loli.net/2021/05/19/OMZULxky1nqVdFE.png)]
反转
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PDJoAAXq-1621440138821)(https://i.loli.net/2021/05/19/hWaBEpOzjC1TR4l.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QhQYjCiN-1621440138824)(https://i.loli.net/2021/05/19/1RDWOFejA7i35GZ.png)]
前缀都是一样,可能都会往一个region里面写数据时,就会出现热点问题。
返回来,把号码倒过来,就会是不同的数字,解决了热点问题。
时间戳反转
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hDo5KRCx-1621440138825)(https://i.loli.net/2021/05/19/ZhG476XcKHaxNsq.png)]
HBASE总结
1、尽量减少行和列的大小[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EvcyM3o7-1621440138828)(https://i.loli.net/2021/05/19/1uRqE5cBseN67tj.png)]
2、列簇尽可能越短越好,最好是一个字符
3、冗长的属性名虽然可读性好,但是更短的属性存储在HBase中会更好
NoSQL
什么是NoSQL?
NoSQL:not only SQL,非关系型数据库
NoSQL是一个通用术语
指不遵循传统RDBMS模型的数据库
数据是非关系的,且不使用SQL作为主要查询语言
解决数据库的可伸缩性和可用性问题
不针对原子性或一致性问题
NoSQL的基本概念
三大基石
CAP、BASE、 最终一致性
Indexing(索引)、Query(查询)
MapReduce
Sharding(分片)
[CAP原理]
[1.强一致性(Consistency)]
在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
[2.可用性(Availability)]
每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据。在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。
[3.分区容错性(Partition tolerance)]
分区容错性其实是约束了分布式系统需要具有如下的特性:分布式在遇到任何网络分区故障的时候,仍然需要保证对外提供满足一致性和可用性的服务,除非整个网络均已瘫痪。也就是说,它容忍错误的出现,在发生错误的情况下可以继续进行操作。
1.CAP理论的核心
一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三大类
CA:单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
CP:满足一致性,分区容忍性的系统,通常性能不是特别高。
AP:满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-syPmP7MX-1621440138830)(https://i.loli.net/2021/05/17/PyYZREzckqVfMSo.png)]
[BASE原理]
BASE就是为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案。他的思想就是通过让系统在某一时刻牺牲数据一致性的要求来换取系统整体的伸缩性和性能上的改观。(也就是说牺牲C(数据一致性) 来实现A(可用性)P(容错性),以BASE的理论来达成最终一致性)
[1.基本可用(Basically Available)]
这里是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心功能或者当前最重要功能可用。对于用户来说,他们当前最关注的功能或者最常用的功能的可用性将会获得保证,但是其他功能会被削弱。
[2.软状态(Soft state)]
允许系统数据存在中间状态,但不会影响到系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步时存在延时。
[3.最终一致(Eventually consistent)]
要求系统数据副本最终能够一致,而不需要实时保证数据副本一致。最终一致性是弱一致性的一种特殊情况。最终一致性有5个变种:因果一致性,读己之所写(例如发微博的时候,自己可以马上看到,但是粉丝要过几秒钟),会话一致性,单调读一致性,单调写一致性。
为什么使用NoSQL?
互联网的发展,传统关系型数据库存在瓶颈
高并发读写
高存储量
高可用性
高扩展性
低成本
NoSQL和关系型数据库比较
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VfLNGGL1-1621440138831)(https://i.loli.net/2021/05/17/M4THfeh67CXVdjn.png)]
NoSQL的特点
最终一致性
应用程序增加了维护一致性和处理事务等职责
冗余数据存储
NoSQL != 大数据
NoSQL产品是为了帮助解决大数据存储问题
大数据不仅仅包含数据存储的问题
Hadoop
Kafka
Spark, etc
索引和查询
Indexing(索引)
大多数NoSQL是按key进行索引
部分NoSQL允许二级索引
HBase使用HDFS,append-only
批处理写入Logged
重新创建并排序文件
Query(查询)
没有专门的查询语言,通常使用脚本语言查询
有些开始支持SQL查询
有些可以使用MapReduce代码查询
MapReduce、Sharding
MapReduce
不是Hadoop的MapReduce,概念相关
可进行数据的处理查询
Sharding(分片)
一种分区模式
可以复制分片
有利于灾难恢复
NoSQL分类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q8FW7m3D-1621440138833)(https://i.loli.net/2021/05/17/Atqg7dnN1GRm6Qr.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qc3qqz6u-1621440138834)(https://i.loli.net/2021/05/17/wxT4nKYC2GNLQuW.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EPqgVnGA-1621440138836)(https://i.loli.net/2021/05/17/mFuMLZaOK4bUxX3.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hcAzrOrO-1621440138837)(https://i.loli.net/2021/05/17/yjPB4lXDGRTw9Cf.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IgpT1BRD-1621440138838)(https://i.loli.net/2021/05/17/EltaFDnOM3Tzh5e.png)]
NoSQL和BI、大数据的关系
BI(Business Intelligence):商务智能
它是一套完整的解决方案
BI应用涉及模型,模型依赖于模式
BI主要支持标准SQL,对NoSQL支持弱于关系型数据库
NoSQL和大数据相关性较高
通常大数据场景采用列存储数据库
如:HBase和Hadoop
HBase
基本操作
1.进入hbase的客户端bin目录下
hbase shell
2.创建表,并指定列族
create 'tablename','order'
3.添加数据
表名 rowkey 列族中指定列名 value put 'tablename','rowkey','order:id','1001'
4.查看数据
1.方式一 get 'tablename','rowkey' 2.方式二 sacn 'tablename'
5.删除表
1.禁用表 disable 'tablename' 2.删除 drop 'tablename'
6.查看表信息
desc 'tablename'
7.统计有多少个行键RowKey
count 'tablename'
- 删除一列
delete 'customer','rowkey','addr:city'
9.禁用表
disable 'tablename'
10.启用表
enbale 'tablename'
11.删除1个行键RowKey所有信息
deleteall 'customer','njones'
12.手动预设分区10进制
create 'tablename','a','b',SPLITS => ['1','2','3','4']
13.生成16进制序列预分区
create 'tablename','a','b',{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
14.按照文件中设置的规则预分区
创建splits.txt文件内容如下: aaaa bbbb cccc dddd create 'tablename','a','b',SPLITS_FILE => 'splits.txt'
15.将文档数据导入HBase
--建表 create 'importdate','order' --不是在hbase shell命令行里操作,是在外面 hbase org.apache.hadoop.hbase.mapreduce.ImportTsv \ --文件格式 -Dimporttsv.separator=, \ --指定文件分隔符 -Dimporttsv.columns="HBASE_ROW_KEY,order:numb,order:date" \ --hbase 中表的rowkey customer file:///opt/data/hbase_import_data.csv --文件存放的位置 --文件存放本地 hbase org.apache.hadoop.hbase.mapreduce.ImportTsv \ -Dimporttsv.separator=, \ -Dimporttsv.columns="HBASE_ROW_KEY,order:numb,order:date" \ customer file:///opt/data/hbase_import_data.csv --文件存放HDFS hbase org.apache.hadoop.hbase.mapreduce.ImportTsv \ -Dimporttsv.separator=, \ -Dimporttsv.columns="HBASE_ROW_KEY,order:numb,order:date" \ customer hdfs://192.168.126.135:8020/data/hbase_import_data.csv
16.hive与 hbase的集成
1.首先需要在hbase中创建表 create 'test_hive','order','addr' 2在hive中创建外部表 create external table test_hive( name string, order_numb string,order_date string,addr_city string,addr_state string) stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' --指定文件格式为HBASE with serdeproperties ("hbase.columns.mapping"=":key,order:numb,order:date,addr:city,addr:state")--映射hbase tblproperties("hbase.table.name" = "test_hive"); --指定hbase中的表名 3.插入数据 insert into test_hive values('zhangsan','1001','2021-05-19','changsha','china');
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0mUcPHlI-1621440138841)(C:%5CUsers%5CAdministrator%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210519123403210.png)]
HBASE API操作
1.依赖
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <hive.version>1.2.1</hive.version> <hadoop.version>2.7.2</hadoop.version> <hbase.version>1.3.1</hbase.version> </properties> <dependencies> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>${hbase.version}</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>${hive.version}</version> <exclusions> <exclusion> <artifactId>jdk.tools</artifactId> <groupId>jdk.tools</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>${hadoop.version}</version> <exclusions> <exclusion> <artifactId>jdk.tools</artifactId> <groupId>jdk.tools</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-jobclient</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-core</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-common</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-hs</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-examples</artifactId> <version>${hadoop.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-assembly-plugin --> <dependency> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> </dependency> </dependencies> <build> <!--一定要指定正确的Sources Root目录--> <sourceDirectory>src/main/java</sourceDirectory> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <!--assembly的配置--> <configuration> <finalName>${project.name}</finalName> <!--这里先使用自带的打包,后续再修改成复杂的--> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <!--入口文件--> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>com.cssl.hbase.api.HbaseJavaApi</mainClass> <!-- 你的主类名 --> </manifest> </archive> </configuration> <!--在package生命周期执行--> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
2.java代码
package com.lhh.hbaseapi; 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.TableName; import org.apache.hadoop.hbase.client.*; /** * @program: lhh * @description: * @author: 华仔 * @create: 2021-05-18 15:31 */ public class HBaseJavaApi { public static void main(String[] args) { createTbale(); insertIntoTable(); getTable(); } //创建表 public static void createTbale() { Configuration conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum", "192.168.126.135"); //配置zookeeper的主机 conf.set("hbase.zookeeper.property.clientPort", "2181"); //配置zookeeper的端口 conf.set("hbase.master", "192.168.126.135:16000"); //hbase IPC 端口 Connection connection = null; Admin admin = null; try { //连接HBASE connection = ConnectionFactory.createConnection(conf); admin = connection.getAdmin();//创建DDL定义 if (admin.isTableAvailable(TableName.valueOf("testcustomer1"))) { //表已存在,删除表 //禁用表 admin.disableTable(TableName.valueOf("testcustomer1")); //删除表 admin.deleteTable(TableName.valueOf("testcustomer1")); System.out.println("删除成功"); } //创建表 //表名 HTableDescriptor customer = new HTableDescriptor(TableName.valueOf("testcustomer1")); //指定列族 customer.addFamily(new HColumnDescriptor("personalInfo")); customer.addFamily(new HColumnDescriptor("recordInfo")); customer.addFamily(new HColumnDescriptor("assetsInfo")); //创建 admin.createTable(customer); System.out.println("创建成功"); } catch (Exception e) { e.printStackTrace(); } finally { try { admin.close(); connection.close(); System.out.println("关闭资源"); } catch (Exception e) { e.printStackTrace(); } } } //添加数据 public static void insertIntoTable() { Configuration conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum", "192.168.126.135"); //配置zookeeper的主机 conf.set("hbase.zookeeper.property.clientPort", "2181"); //配置zookeeper的端口 conf.set("hbase.master", "192.168.126.135:16000"); //hbase IPC 端口 Connection connection = null; Admin admin = null; Table table = null; try { //连接HBASE connection = ConnectionFactory.createConnection(conf); admin = connection.getAdmin();//创建DML定义 if (admin.tableExists(TableName.valueOf("testcustomer1"))) { //如果表存在就添加数据 //指定表名 table = connection.getTable(TableName.valueOf("testcustomer1")); //指定rowkey Put put_key = new Put("1001_lhh".getBytes()); //指定列族并且指定列族的列名,并且添加value Put put_column1 = put_key.addColumn("personalInfo".getBytes(), "id".getBytes(), "1001".getBytes()); Put put_column2 = put_key.addColumn("recordInfo".getBytes(), "id".getBytes(), "1001".getBytes()); Put put_column3 = put_key.addColumn("assetsInfo".getBytes(), "id".getBytes(), "1001".getBytes()); //添加 table.put(put_key); System.out.println("添加数据完成"); } } catch (Exception e) { e.printStackTrace(); } finally { try { table.close(); admin.close(); connection.close(); System.out.println("关闭资源"); } catch (Exception e) { e.printStackTrace(); } } } //查看数据 public static void getTable() { Configuration conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum", "192.168.126.135"); //配置zookeeper的主机 conf.set("hbase.zookeeper.property.clientPort", "2181"); //配置zookeeper的端口 conf.set("hbase.master", "192.168.126.135:16000"); //hbase IPC 端口 Connection connection = null; Admin admin = null; Table table = null; try { //连接HBASE connection = ConnectionFactory.createConnection(conf); admin = connection.getAdmin();//创建DML定义 if (admin.tableExists(TableName.valueOf("testcustomer1"))) { //如果表存在就查看数据 table = connection.getTable(TableName.valueOf("testcustomer1")); //指定rowkey Get get = new Get("1001_lhh".getBytes()); //指定rowkey Result result = table.get(get); //获取值 byte[] value = result.getValue("personalInfo".getBytes(), "id".getBytes()); System.out.println("获取值-->"+new String(value)); byte[] value1 = result.getValue("recordInfo".getBytes(), "id".getBytes()); System.out.println("获取值1-->"+new String(value1)); byte[] value2 = result.getValue("assetsInfo".getBytes(), "id".getBytes()); System.out.println("获取值2-->"+new String(value2)); } } catch (Exception e) { e.printStackTrace(); } finally { try { table.close(); admin.close(); connection.close(); System.out.println("关闭资源"); } catch (Exception e) { e.printStackTrace(); } } } }
2.rowkey的模糊查询
package com.lhh.hbaseapi.rowkeyhbase; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.filter.CompareFilter; import org.apache.hadoop.hbase.filter.RegexStringComparator; import org.apache.hadoop.hbase.filter.RowFilter; /** * @program: lhh * @description: * @author: 华仔 * @create: 2021-05-19 15:32 */ //根据rowkey模糊查询 public class RowkeyHbase { public static void main(String[] args) { roekeyget(); } public static void roekeyget(){ Configuration conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum", "192.168.126.135"); //配置zookeeper的主机 conf.set("hbase.zookeeper.property.clientPort", "2181"); //配置zookeeper的端口 conf.set("hbase.master", "192.168.126.135:16000"); //hbase IPC 端口 Connection connection = null; Admin admin = null; Table table = null; try { //连接HBASE connection = ConnectionFactory.createConnection(conf); admin = connection.getAdmin();//创建DML定义 if (admin.tableExists(TableName.valueOf("testcustomer1"))) { //如果表存在就添加数据 table = connection.getTable(TableName.valueOf("testcustomer1")); //创建scan对象 Scan scan = new Scan(); //指定模糊查询的rowke使用正则表达式 RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator(".*1001.*")); //添加到scan scan.setFilter(rowFilter); //指定rowkey将scan添加到table中 ResultScanner scanner = table.getScanner(scan); //获取结果 Result next = scanner.next(); while (next!=null){ byte[] value = next.getValue("assetsInfo".getBytes(), "id".getBytes()); byte[] value1 = next.getValue("personalInfo".getBytes(), "id".getBytes()); byte[] value2 = next.getValue("recordInfo".getBytes(), "id".getBytes()); System.out.println("值--"+new String(value)); System.out.println("值1--"+new String(value1)); System.out.println("值2--"+new String(value2)); next=scanner.next(); } } } catch (Exception e) { e.printStackTrace(); } finally { try { table.close(); admin.close(); connection.close(); System.out.println("关闭资源"); } catch (Exception e) { e.printStackTrace(); } } } }
HBase的概念
HBase是一个领先的NoSQL数据库
是一个面向列存储的数据库
是一个分布式hash map
基于Google Big Table论文
使用HDFS作为存储并利用其可靠性
HBase特点
数据访问速度快,响应时间约2-20毫秒
支持随机读写,每个节点20k~100k+ ops/s
可扩展性,可扩展到20,000+节点
HBase的发展史
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ir7004gr-1621440138845)(https://i.loli.net/2021/05/17/bd1gJawZnjWA98S.png)]
HBase应用场景1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CXJdlceb-1621440138847)(https://i.loli.net/2021/05/17/XaJofk1e3zuLcWP.png)]
HBase应用场景2
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bhkwTx1u-1621440138848)(https://i.loli.net/2021/05/17/6y4n8IlwARkfaxW.png)]
HBase应用场景3
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pfktIKvo-1621440138850)(https://i.loli.net/2021/05/17/7DAwKuS2BQEevdi.png)]
HBase应用场景示列
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O6FepSwN-1621440138852)(https://i.loli.net/2021/05/17/6laXUTwKQntxqmz.png)]
Apache HBase生态圈
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pheM2j32-1621440138853)(https://i.loli.net/2021/05/17/MPHKXlnytq5oYuW.png)]
HBase物理架构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J8MK4ffa-1621440138854)(https://i.loli.net/2021/05/17/kU3pl4YrbV6IsZ8.png)]
HBase逻辑架构
Rowkey(行键)是唯一的并已排序
Schema可以定义何时插入记录
每个Row都可以定义自己的列,即使其他Row不使用
相关列定义为列族
使用唯一时间戳维护多个Row版本
在不同版本中值类型可以不同
HBase数据全部以字节存储
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7zqLDtU0-1621440138862)(https://i.loli.net/2021/05/17/meBc1RdxXvSUnkY.png)]
HBase数据管理
数据管理目录
系统目录表hbase:meta
存储元数据等
HDFS目录中的文件
Servers上的region实例
HBase数据在HDFS上
可以通过HDFS进行修复File
修复路径
RegionServer->Table-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WuZGeYp5-1621440138863)(https://i.loli.net/2021/05/17/Wrz2PnKFL1oflyv.png)]
HBase的架构特点
强一致性
自动扩展
当Region变大会自动分割
使用HDFS扩展数据并管理空间
写恢复
使用WAL(Write Ahead Log)
与Hadoop集成
HBase Shell
HBase Shell是一种操作HBase的交互模式
支持完整的HBase命令集
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tnPeoJPU-1621440138865)(https://i.loli.net/2021/05/17/u3RqcPhySpKwznf.png)]
通过hbase shell进入
version – 查看版本
status – 查看集群状态
whoami – 查看
help --帮助
基本操作
create ‘customer’, {NAME=>‘addr’}, {NAME=>‘order’} – 创建一个表
list – 列出HBase所有的表
desc ‘customer’ – 查看表的详细信息
put ‘customer’, ‘jsmith’, ‘addr:city’, ‘montreal’ – 添加数据
get ‘customer’, ‘jsmith’ – 获取数据
MongoDB
mongodb命令
mongodb与hive的集成
在 Hive 中创建 MongoDB 关联表:
--创建表 CREATE TABLE eventlog ( id string, userid string, type string, objid string, time string, source string ) STORED BY 'com.mongodb.hadoop.hive.MongoStorageHandler' WITH SERDEPROPERTIES ('mongo.columns.mapping'='{"id":"_id"}') TBLPROPERTIES ('mongo.uri'='mongodb://192.168.126.135:27017/hive.eventlog'); ('mongo.uri'='mongodb://username:password@ip:port/xxx.xx xxxx'); --在猛odb中插入数据 var even=({userid:"101",type:"error",time:new Date(),source:"mongodb"}) db.hive.eventlog(even)
-- 列出HBase所有的表
desc ‘customer’ – 查看表的详细信息
put ‘customer’, ‘jsmith’, ‘addr:city’, ‘montreal’ – 添加数据
get ‘customer’, ‘jsmith’ – 获取数据
MongoDB
mongodb命令
mongodb与hive的集成
在 Hive 中创建 MongoDB 关联表:
--创建表 CREATE TABLE eventlog ( id string, userid string, type string, objid string, time string, source string ) STORED BY 'com.mongodb.hadoop.hive.MongoStorageHandler' WITH SERDEPROPERTIES ('mongo.columns.mapping'='{"id":"_id"}') TBLPROPERTIES ('mongo.uri'='mongodb://192.168.126.135:27017/hive.eventlog'); ('mongo.uri'='mongodb://username:password@ip:port/xxx.xx xxxx'); --在猛odb中插入数据 var even=({userid:"101",type:"error",time:new Date(),source:"mongodb"}) db.hive.eventlog(even)