Hbase的JavaAPI和数据存储

怀念夏天  金牌会员 | 2023-6-12 20:38:02 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 676|帖子 676|积分 2028

导入Maven依赖
  1. <dependencies>
  2.     <dependency>
  3.         <groupId>org.apache.zookeeper</groupId>
  4.         <artifactId>zookeeper</artifactId>
  5.         <version>3.4.6</version>
  6.     </dependency>
  7.     <dependency>
  8.         <groupId>org.apache.hbase</groupId>
  9.         <artifactId>hbase-client</artifactId>
  10.         <version>2.2.5</version>
  11.     </dependency>
  12.     <dependency>
  13.         <groupId>org.apache.hadoop</groupId>
  14.         <artifactId>hadoop-client</artifactId>
  15.         <version>3.2.1</version>
  16.     </dependency>
  17.     <dependency>
  18.         <groupId>org.apache.hadoop</groupId>
  19.         <artifactId>hadoop-common</artifactId>
  20.         <version>3.2.1</version>
  21.     </dependency>
  22.     <dependency>
  23.         <groupId>org.apache.hbase</groupId>
  24.         <artifactId>hbase-server</artifactId>
  25.         <version>2.2.5</version>
  26.     </dependency>
  27.    
  28.     <dependency>
  29.         <groupId>org.apache.hbase</groupId>
  30.         <artifactId>hbase-mapreduce</artifactId>
  31.         <version>2.2.5</version>
  32.     </dependency>
  33.     <dependency>
  34.         <groupId>com.google.code.gson</groupId>
  35.         <artifactId>gson</artifactId>
  36.         <version>2.8.5</version>
  37.     </dependency>
  38.    
  39.     <dependency>
  40.         <groupId>org.apache.phoenix</groupId>
  41.         <artifactId>phoenix-core</artifactId>
  42.         <version>5.0.0-HBase-2.0</version>
  43.     </dependency>
  44.     <dependency>
  45.         <groupId>org.apache.hadoop</groupId>
  46.         <artifactId>hadoop-auth</artifactId>
  47.         <version>3.1.2</version>
  48.     </dependency>
  49. </dependencies>
  50. <build>
  51.     <plugins>
  52.         <plugin>
  53.             <groupId>org.apache.maven.plugins</groupId>
  54.             <artifactId>maven-compiler-plugin</artifactId>
  55.             <version>3.5.1</version>
  56.             <configuration>
  57.                 <source>1.8</source>
  58.                 <target>1.8</target>
  59.             </configuration>
  60.         </plugin>
  61.         <plugin>
  62.             <groupId>org.apache.maven.plugins</groupId>
  63.             <artifactId>maven-assembly-plugin</artifactId>
  64.             <version>2.6</version>
  65.             <configuration>
  66.                 <descriptorRefs>
  67.                     <descriptorRef>jar-with-dependencies</descriptorRef>
  68.                 </descriptorRefs>
  69.             </configuration>
  70.             <executions>
  71.                 <execution>
  72.                     <id>make-assembly</id>
  73.                     
  74.                     <phase>package</phase>
  75.                     <goals>
  76.                         <goal>single</goal>
  77.                     </goals>
  78.                 </execution>
  79.             </executions>
  80.         </plugin>
  81.     </plugins>
  82. </build>
复制代码
获取hbase的连接,list出所有的表
  1. package com.doit.day01;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.hbase.HBaseConfiguration;
  4. import org.apache.hadoop.hbase.TableName;
  5. import org.apache.hadoop.hbase.client.Admin;
  6. import org.apache.hadoop.hbase.client.Connection;
  7. import org.apache.hadoop.hbase.client.ConnectionFactory;
  8. import java.io.IOException;
  9. /**
  10. * Hbase的java客户端连接hbase的时候,只需要连接zookeeper的集群
  11. * 就可以找到你Hbase集群的位置
  12. * 核心的对象:
  13. * Configuration:HbaseConfiguration.create();
  14. * Connection:ConnectionFactory.createConnection(conf);
  15. * table:conn.getTable(TableName.valueOf("tb_b")); 对表进行操作 DML
  16. * Admin:conn.getAdmin();操作Hbase系统DDL,对名称空间等进行操作
  17. */
  18. public class ConnectionDemo {
  19.     public static void main(String[] args) throws Exception {
  20.         //获取到hbase的配置文件对象
  21.         Configuration conf = HBaseConfiguration.create();
  22.         //针对配置文件设置zk的集群地址
  23.         conf.set("hbase.zookeeper.quorum","linux01:2181,linux02:2181,linux03:2181");
  24.         //创建hbase的连接对象
  25.         Connection conn = ConnectionFactory.createConnection(conf);
  26.         //获取到操作hbase的对象
  27.         Admin admin = conn.getAdmin();
  28.         //调用api获取到所有的表
  29.         TableName[] tableNames = admin.listTableNames();
  30.         //获取到哪个命名空间下的所有的表
  31.         TableName[] doits = admin.listTableNamesByNamespace("doit");
  32.         for (TableName tableName : doits) {
  33.             byte[] name = tableName.getName();
  34.             System.out.println(new String(name));
  35.         }
  36.         conn.close();
  37.     }
  38. }
复制代码
获取到所有的命名空间
  1. package com.doit.day01;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.hbase.HBaseConfiguration;
  4. import org.apache.hadoop.hbase.NamespaceDescriptor;
  5. import org.apache.hadoop.hbase.client.Admin;
  6. import org.apache.hadoop.hbase.client.Connection;
  7. import org.apache.hadoop.hbase.client.ConnectionFactory;
  8. /**
  9. * Hbase的java客户端连接hbase的时候,只需要连接zookeeper的集群
  10. * 就可以找到你Hbase集群的位置
  11. * 核心的对象:
  12. * Configuration:HbaseConfiguration.create();
  13. * Connection:ConnectionFactory.createConnection(conf);
  14. * Admin:conn.getAdmin();操作Hbase系统DDL,对名称空间等进行操作
  15. */
  16. public class NameSpaceDemo {
  17.     public static void main(String[] args) throws Exception {
  18.         //获取到hbase的配置文件对象
  19.         Configuration conf = HBaseConfiguration.create();
  20.         //针对配置文件设置zk的集群地址
  21.         conf.set("hbase.zookeeper.quorum","linux01:2181,linux02:2181,linux03:2181");
  22.         //创建hbase的连接对象
  23.         Connection conn = ConnectionFactory.createConnection(conf);
  24.         //获取到操作hbase的对象
  25.         Admin admin = conn.getAdmin();
  26.         //获取到命名空间的描述器
  27.         NamespaceDescriptor[] namespaceDescriptors = admin.listNamespaceDescriptors();
  28.         for (NamespaceDescriptor namespaceDescriptor : namespaceDescriptors) {
  29.             //针对描述器获取到命名空间的名称
  30.             String name = namespaceDescriptor.getName();
  31.             System.out.println(name);
  32.         }
  33.         conn.close();
  34.     }
  35. }
复制代码
创建一个命名空间
  1. package com.doit.day01;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.hbase.HBaseConfiguration;
  4. import org.apache.hadoop.hbase.NamespaceDescriptor;
  5. import org.apache.hadoop.hbase.client.Admin;
  6. import org.apache.hadoop.hbase.client.Connection;
  7. import org.apache.hadoop.hbase.client.ConnectionFactory;
  8. import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos;
  9. import java.util.Properties;
  10. /**
  11. * Hbase的java客户端连接hbase的时候,只需要连接zookeeper的集群
  12. * 就可以找到你Hbase集群的位置
  13. * 核心的对象:
  14. * Configuration:HbaseConfiguration.create();
  15. * Connection:ConnectionFactory.createConnection(conf);
  16. * Admin:conn.getAdmin();操作Hbase系统DDL,对名称空间等进行操作
  17. */
  18. public class CreateNameSpaceDemo {
  19.     public static void main(String[] args) throws Exception {
  20.         //获取到hbase的配置文件对象
  21.         Configuration conf = HBaseConfiguration.create();
  22.         //针对配置文件设置zk的集群地址
  23.         conf.set("hbase.zookeeper.quorum","linux01:2181,linux02:2181,linux03:2181");
  24.         //创建hbase的连接对象
  25.         Connection conn = ConnectionFactory.createConnection(conf);
  26.         //获取到操作hbase的对象
  27.         Admin admin = conn.getAdmin();
  28.         //获取到命名空间描述器的构建器
  29.         NamespaceDescriptor.Builder spaceFromJava = NamespaceDescriptor.create("spaceFromJava");
  30.         //当然还可以给命名空间设置属性
  31.         spaceFromJava.addConfiguration("author","robot_jiang");
  32.         spaceFromJava.addConfiguration("desc","this is my first java namespace...");
  33.         //拿着构建器构建命名空间的描述器
  34.         NamespaceDescriptor build = spaceFromJava.build();
  35.         //创建命名空间
  36.         admin.createNamespace(build);
  37.         conn.close();
  38.     }
  39. }
复制代码
创建带有多列族的表
  1. package com.doit.day01;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.hbase.HBaseConfiguration;
  4. import org.apache.hadoop.hbase.NamespaceDescriptor;
  5. import org.apache.hadoop.hbase.TableName;
  6. import org.apache.hadoop.hbase.client.*;
  7. import org.apache.hadoop.hbase.protobuf.generated.TableProtos;
  8. import java.nio.charset.StandardCharsets;
  9. import java.util.ArrayList;
  10. import java.util.Map;
  11. import java.util.Set;
  12. /**
  13. * Hbase的java客户端连接hbase的时候,只需要连接zookeeper的集群
  14. * 就可以找到你Hbase集群的位置
  15. * 核心的对象:
  16. * Configuration:HbaseConfiguration.create();
  17. * Connection:ConnectionFactory.createConnection(conf);
  18. * Admin:conn.getAdmin();操作Hbase系统DDL,对名称空间等进行操作
  19. */
  20. public class CreateTableDemo {
  21.     public static void main(String[] args) throws Exception {
  22.         //获取到hbase的配置文件对象
  23.         Configuration conf = HBaseConfiguration.create();
  24.         //针对配置文件设置zk的集群地址
  25.         conf.set("hbase.zookeeper.quorum","linux01:2181,linux02:2181,linux03:2181");
  26.         //创建hbase的连接对象
  27.         Connection conn = ConnectionFactory.createConnection(conf);
  28.         Admin admin = conn.getAdmin();
  29.         //获取到操作hbase操作表的对象
  30.         TableDescriptorBuilder java = TableDescriptorBuilder.newBuilder(TableName.valueOf("java"));
  31.         //表添加列族需要集合的方式
  32.         ArrayList<ColumnFamilyDescriptor> list = new ArrayList<>();
  33.         //构建一个列族的构造器
  34.         ColumnFamilyDescriptorBuilder col1 = ColumnFamilyDescriptorBuilder.newBuilder("f1".getBytes(StandardCharsets.UTF_8));
  35.         ColumnFamilyDescriptorBuilder col2 = ColumnFamilyDescriptorBuilder.newBuilder("f2".getBytes(StandardCharsets.UTF_8));
  36.         ColumnFamilyDescriptorBuilder col3 = ColumnFamilyDescriptorBuilder.newBuilder("f3".getBytes(StandardCharsets.UTF_8));
  37.         //构建列族
  38.         ColumnFamilyDescriptor build1 = col1.build();
  39.         ColumnFamilyDescriptor build2 = col2.build();
  40.         ColumnFamilyDescriptor build3 = col3.build();
  41.         //将列族添加到集合中去
  42.         list.add(build1);
  43.         list.add(build2);
  44.         list.add(build3);
  45.         //给表设置列族
  46.         java.setColumnFamilies(list);
  47.         //构建表的描述器
  48.         TableDescriptor build = java.build();
  49.         //创建表
  50.         admin.createTable(build);
  51.         conn.close();
  52.     }
  53. }
复制代码
向表中添加数据
  1. package com.doit.day01;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.hbase.HBaseConfiguration;
  4. import org.apache.hadoop.hbase.TableName;
  5. import org.apache.hadoop.hbase.client.*;
  6. import java.nio.charset.StandardCharsets;
  7. import java.util.ArrayList;
  8. import java.util.Arrays;
  9. /**
  10. * 注意:put数据需要指定往哪个命名空间的哪个表的哪个rowKey的哪个列族的哪个列中put数据,put的值是什么
  11. */
  12. public class PutDataDemo {
  13.     public static void main(String[] args) throws Exception {
  14.         //获取到hbase的配置文件对象
  15.         Configuration conf = HBaseConfiguration.create();
  16.         //针对配置文件设置zk的集群地址
  17.         conf.set("hbase.zookeeper.quorum","linux01:2181,linux02:2181,linux03:2181");
  18.         //创建hbase的连接对象
  19.         Connection conn = ConnectionFactory.createConnection(conf);
  20.         Admin admin = conn.getAdmin();
  21.         //指定往哪一张表中put数据
  22.         Table java = conn.getTable(TableName.valueOf("java"));
  23.         //创建put对象,设置rowKey
  24.         Put put = new Put("rowkey_001".getBytes(StandardCharsets.UTF_8));
  25.         put.addColumn("f1".getBytes(StandardCharsets.UTF_8),"name".getBytes(StandardCharsets.UTF_8),"xiaotao".getBytes(StandardCharsets.UTF_8));
  26.         put.addColumn("f1".getBytes(StandardCharsets.UTF_8),"age".getBytes(StandardCharsets.UTF_8),"42".getBytes(StandardCharsets.UTF_8));
  27.         Put put1 = new Put("rowkey_002".getBytes(StandardCharsets.UTF_8));
  28.         put1.addColumn("f1".getBytes(StandardCharsets.UTF_8),"name".getBytes(StandardCharsets.UTF_8),"xiaotao".getBytes(StandardCharsets.UTF_8));
  29.         put1.addColumn("f1".getBytes(StandardCharsets.UTF_8),"age".getBytes(StandardCharsets.UTF_8),"42".getBytes(StandardCharsets.UTF_8));
  30.         Put put2 = new Put("rowkey_003".getBytes(StandardCharsets.UTF_8));
  31.         put2.addColumn("f1".getBytes(StandardCharsets.UTF_8),"name".getBytes(StandardCharsets.UTF_8),"xiaotao".getBytes(StandardCharsets.UTF_8));
  32.         put2.addColumn("f1".getBytes(StandardCharsets.UTF_8),"age".getBytes(StandardCharsets.UTF_8),"42".getBytes(StandardCharsets.UTF_8));
  33.         java.put(Arrays.asList(put,put1,put2));
  34.         conn.close();
  35.     }
  36. }
复制代码
get表中的数据
  1. package com.doit.day01;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.hbase.Cell;
  4. import org.apache.hadoop.hbase.CellUtil;
  5. import org.apache.hadoop.hbase.HBaseConfiguration;
  6. import org.apache.hadoop.hbase.TableName;
  7. import org.apache.hadoop.hbase.client.*;
  8. import java.nio.charset.StandardCharsets;
  9. /**
  10. * 注意:put数据需要指定往哪个命名空间的哪个表的哪个rowKey的哪个列族的哪个列中put数据,put的值是什么
  11. */
  12. public class GetDataDemo {
  13.     public static void main(String[] args) throws Exception {
  14.         //获取到hbase的配置文件对象
  15.         Configuration conf = HBaseConfiguration.create();
  16.         //针对配置文件设置zk的集群地址
  17.         conf.set("hbase.zookeeper.quorum","linux01:2181,linux02:2181,linux03:2181");
  18.         //创建hbase的连接对象
  19.         Connection conn = ConnectionFactory.createConnection(conf);
  20.         //指定往哪一张表中put数据
  21.         Table java = conn.getTable(TableName.valueOf("java"));
  22.         Get get = new Get("rowkey_001".getBytes(StandardCharsets.UTF_8));
  23. //        get.addFamily("f1".getBytes(StandardCharsets.UTF_8));
  24.         get.addColumn("f1".getBytes(StandardCharsets.UTF_8),"name".getBytes(StandardCharsets.UTF_8));
  25.         Result result = java.get(get);
  26.         boolean advance = result.advance();
  27.         if(advance){
  28.             Cell current = result.current();
  29.             String family = new String(CellUtil.cloneFamily(current));
  30.             String qualifier = new String(CellUtil.cloneQualifier(current));
  31.             String row = new String(CellUtil.cloneRow(current));
  32.             String value = new String(CellUtil.cloneValue(current));
  33.             System.out.println(row+","+family+","+qualifier+","+value);
  34.         }
  35.         conn.close();
  36.     }
  37. }
复制代码
scan表中的数据
  1. package com.doit.day01;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.hbase.*;
  4. import org.apache.hadoop.hbase.client.*;
  5. import java.nio.charset.StandardCharsets;
  6. import java.util.Arrays;
  7. import java.util.Iterator;
  8. /**
  9. * 注意:put数据需要指定往哪个命名空间的哪个表的哪个rowKey的哪个列族的哪个列中put数据,put的值是什么
  10. */
  11. public class ScanDataDemo {
  12.     public static void main(String[] args) throws Exception {
  13.         //获取到hbase的配置文件对象
  14.         Configuration conf = HBaseConfiguration.create();
  15.         //针对配置文件设置zk的集群地址
  16.         conf.set("hbase.zookeeper.quorum","linux01:2181,linux02:2181,linux03:2181");
  17.         //创建hbase的连接对象
  18.         Connection conn = ConnectionFactory.createConnection(conf);
  19.         //指定往哪一张表中put数据
  20.         Table java = conn.getTable(TableName.valueOf("java"));
  21.         Scan scan = new Scan();
  22.         scan.withStartRow("rowkey_001".getBytes(StandardCharsets.UTF_8));
  23.         scan.withStopRow("rowkey_004".getBytes(StandardCharsets.UTF_8));
  24.         ResultScanner scanner = java.getScanner(scan);
  25.         Iterator<Result> iterator = scanner.iterator();
  26.         while (iterator.hasNext()){
  27.             Result next = iterator.next();
  28.             while (next.advance()){
  29.                 Cell current = next.current();
  30.                 String family = new String(CellUtil.cloneFamily(current));
  31.                 String row = new String(CellUtil.cloneRow(current));
  32.                 String qualifier = new String(CellUtil.cloneQualifier(current));
  33.                 String value = new String(CellUtil.cloneValue(current));
  34.                 System.out.println(row+","+family+","+qualifier+","+value);
  35.             }
  36.         }
  37.         conn.close();
  38.     }
  39. }
复制代码
删除一行数据
  1. package com.doit.day02;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.hbase.HBaseConfiguration;
  4. import org.apache.hadoop.hbase.TableName;
  5. import org.apache.hadoop.hbase.client.*;
  6. import java.io.IOException;
  7. import java.nio.charset.StandardCharsets;
  8. public class _12_删除一行数据 {
  9.     public static void main(String[] args) throws IOException {
  10.         Configuration conf = HBaseConfiguration.create();
  11.         conf.set("hbase.zookeeper.quorum","linux01");
  12.         Connection conn = ConnectionFactory.createConnection(conf);
  13.         Table java = conn.getTable(TableName.valueOf("java"));
  14.         Delete delete = new Delete("rowkey_001".getBytes(StandardCharsets.UTF_8));
  15.         java.delete(delete);
  16.     }
  17. }
复制代码
数据存储

行式存储

传统的行式数据库将一个个完整的数据行存储在数据页中
列式存储

列式数据库是将同一个数据列的各个值存放在一起

传统行式数据库的特性如下:

  • 数据是按行存储的。
  • 没有索引的查询使用大量I/O。比如一般的数据库表都会建立索引,通过索引加快查询效率。
  • 建立索引和物化视图需要花费大量的时间和资源。
  • 面对查询需求,数据库必须被大量膨胀才能满足需求。
列式数据库的特性如下:

  • 数据按列存储,即每一列单独存放。
  • 数据即索引。
  • 只访问查询涉及的列,可以大量降低系统I/O。
  • 每一列由一个线程来处理,即查询的并发处理性能高。
  • 数据类型一致,数据特征相似,可以高效压缩。比如有增量压缩、前缀压缩算法都是基于列存储的类型定制的,所以可以大幅度提高压缩比,有利于存储和网络输出数据带宽的消耗。
列族式存储

列族式存储是一种非关系型数据库存储方式,按列而非行组织数据。它的数据模型是面向列的,即把数据按照列族的方式组织,将属于同一列族的数据存储在一起。每个列族都有一个唯一的标识符,一般通过列族名称来表示。它具有高效的写入和查询性能,能够支持极大规模的数据

  • 如果一个表有多个列族, 每个列族下只有一列, 那么就等同于列式存储。
  • 如果一个表只有一个列族, 该列族下有多个列, 那么就等同于行式存储.

hbase的存储路径:

在conf目录下的hbase-site.xml文件中配置了数据存储的路径在hdfs上
  1. <property>
  2. <name>hbase.rootdir</name>
  3. <value>hdfs://linux01:8020/hbase</value>
  4. </property>
复制代码
hdfs上的存储路径:



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

怀念夏天

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表