当前位置: 首页 > news >正文

支付网站搭建建网站系统

支付网站搭建,建网站系统,荣成建设局网站,大良营销网站建设渠道我们之后的实际开发中不可能在服务器那边直接使用shell命令一直敲的#xff0c;一般都是通过API进行操作的。 环境准备 新建Maven项目#xff0c;导入Maven依赖 dependenciesdependencygroupIdorg.apache.hbase/groupIdartifactId一般都是通过API进行操作的。 环境准备 新建Maven项目导入Maven依赖 dependenciesdependencygroupIdorg.apache.hbase/groupIdartifactIdhbase-client/artifactIdversion2.4.17/version/dependency/dependencies1、创建连接 HBase 的客户端连接由 ConnectionFactory 类来创建工厂模式直接创建我们使用完之后需要手动关闭连接。同时连接 是一个重量级的推荐一个进程使用一个连接对 HBase 的命令通过连接中的两个属性 Admin 和 Table 来实现。其中 Admin 主要是针对元数据-表格的创建修改进行操作 Table 则是针对表格中数据的增加修改进行操作。 1.1、单线程创建连接 import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.client.AsyncConnection; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory;import java.io.IOException; import java.util.concurrent.CompletableFuture;public class HBaseConnection {public static void main(String[] args) throws IOException {// 1. 创建连接配置参数Configuration conf new Configuration();//对应我们 hbase-site.xml 中的配置信息的name和value的值conf.set(hbase.zookeeper.quorum,hadoop102,hadoop103,hadoop104);// 2. 创建连接// 默认使用同步连接Connection connection ConnectionFactory.createConnection(conf);// 3. 使用连接System.out.println(connection);// 4. 关闭连接connection.close();} } 1.2、多线程创建连接 我们真正开发中首先不会把配置参数写到代码中的我们是通过Maven项目下的resources目录来读取配置文件来设置配置参数的我们可以看源码 Connection connection ConnectionFactory.createConnection(); 我们调用了工厂模式的 ConnectionFactory 的 createConnection 方法来创建连接这里我们。 没有配置参数因为HBase默认其实会自动帮我们添加配置参数 我们可以看到当调用ConnectionFactory 的 createConnection 方法的时候其实又调用了HBaseConfiguration 的 create 方法 该方法内部帮我们添加了配置参数 可以看到它其实是去读取我们Maven项目下的resources目录下的文件所以我们需要将我们的配置参数写到resources目录下最好使用 hbase-ste.xml 来命名至于这个文件我们直接复制我们hbase集群中conf目录下的hbase-site.xml 。  其中我们只需要留下关于我们zookeeper服务器连接地址的配置信息即可别的全部删除因为我们是客户端我们不能设置服务端的配置那些即使写了也不会生效。 ?xml version1.0? ?xml-stylesheet typetext/xsl hrefconfiguration.xsl? configuration propertynamehbase.zookeeper.quorum/namevaluehadoop102,hadoop103,hadoop104/valuedescriptionThe directory shared by RegionServers./description/property /configuration 使用类单例模式确保只使用一个连接可以同时用于多个线程。 import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.client.AsyncConnection; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory;import java.io.IOException; import java.util.concurrent.CompletableFuture;public class HBaseConnection {// 声明一个静态属性public static Connection connection null;static {// 1. 创建连接// 默认使用同步连接try {//使用读取本地配置文件的方式来添加参数connection ConnectionFactory.createConnection();} catch (IOException e) {e.printStackTrace();}}public static void closeConnection() throws IOException {// 判断连接是否为 nullif (connection ! null){connection.close();}}public static void main(String[] args) throws IOException {//使用多线程连接 直接使用创建好的连接 不再main线程单独创建System.out.println(HBaseConnection.connection);//在main线程的最后记得关闭连接HBaseConnection.closeConnection();}}2、DDL 创建 HBaseDDL类添加HBaseConnection的静态属性作为我们的连接对象确保单例模式。 2.1、创建命名空间 我们上面说了HBase中的 DDL 语句被封装到了 Admin中所以我们需要先获取 Admin。 Admin admin connection.getAdmin(); 注意在coding的过程中遇到异常不要老想着直接在方法名之后直接 throws 这样虽然是简洁了一些但是如果第一行抛出了一个IOException之后几行再出现异常我们就察觉不到了所以尽量在我们核心代码处try-catch方便了解异常信息。 然后我们直接通过方法来创建 namespace 这里的namespace是一个对象这样做的原因是因为我们 HBase 的shell命令中创建namespace的时候就是不止一种方法所以这里单纯字符串来创建namespace肯定不行对象具有更完整属性。 第二种创建命名空间的方式中我们可以看到有一个 键值对参数这就需要设置我们对象的属性了。  import org.apache.hadoop.hbase.NamespaceDescriptor; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.Connection;import java.io.IOException;public class HBaseDDL {public static Connection connection HBaseConnection.connection;/*** 创建命名空间* param namespace 命名空间的名称*/public static void createNamespace(String namespace) throws IOException {// 1. 获取admin//admin是轻量级的 并且不是线程安全的 不推荐池化或者缓存这个连接//也就是说 用的时候再去获取 不用就把它关闭掉Admin admin connection.getAdmin();// 2. 调用方法创建 namespace// 代码比shell更加底层 所以shell能实现的功能代码 一定也可以// 所以代码实现时 需要更完整的命名空间描述// 2.1 获取一个命名空间的建造者 设计师NamespaceDescriptor.Builder builder NamespaceDescriptor.create(namespace);// 2.2 给命名空间添加属性// 给namespace添加键值对属性其实并没有什么意义 只是给人注释一样builder.addConfiguration(user,lyh);// 2.3 使用builder构造出namespace对象// 创建命名空间造成的问题 属于方法本身的问题 不应该抛出try {admin.createNamespace(builder.build());} catch (IOException e) {System.out.println(该命名空间已经存在!);e.printStackTrace();}// 3. 关闭资源admin.close();}public static void main(String[] args) throws IOException {//测试创建马命名空间createNamespace(lyh);//记得关闭HBase连接HBaseConnection.closeConnection();} }运行结果  2.2、判断表格是否存在 /*** 判断表格是否存在* param namespace 命名空间* param tableName 表名* return true-存在 false-不存在*/public static boolean isTableExists(String namespace,String tableName) throws IOException {// 1. 获取adminAdmin admin connection.getAdmin();// 2. 使用方法判断表格是否存在boolean b false;try {b admin.tableExists(TableName.valueOf(namespace, tableName));} catch (IOException e) {e.printStackTrace();}// 3. 关闭adminadmin.close();// 4.返回结果return b;} 2.3、创建表 /*** 创建表格* param namespace 命名空间* param tableName 表格名称* param columnFamilies 列族名称 可以有多个*/public static void createTable(String namespace,String tableName,String... columnFamilies) throws IOException {// 判断是否有至少一个列族if (columnFamilies.length 0){System.out.println(创建表格至少应该有一个列族);return;}// 判断表格是否已经存在if (isTableExists(namespace,tableName)){System.out.println(表格已经存在);return;}// 1. 获取adminAdmin admin connection.getAdmin();// 2. 调用方法创建表格// 2.1 获取表格的建造者TableDescriptorBuilder builder TableDescriptorBuilder.newBuilder(TableName.valueOf(namespace,tableName));// 2.2 添加参数for (String columnFamily : columnFamilies) {// 2.3 获取列族建造者ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(columnFamily));// 2.4 通过建造者创建对应列族描述// 添加版本参数-维护的版本数columnFamilyDescriptorBuilder.setMaxVersions(5);// 2.5 创建添加完参数的列族描述builder.setColumnFamily(columnFamilyDescriptorBuilder.build());}// 2.3 创建表格描述try {admin.createTable(builder.build());} catch (IOException e) {//System.out.println(表格已经存在);e.printStackTrace();}// 2.4 关闭adminadmin.close();} 2.4、修改表 这里需要注意的比较多 我们这里修改表格的列族版本首先就需要获取表格描述和列族描述但是我们不能重新通过newBuilder创建这两种描述而是应该使用旧的描述。 对于旧的表格描述来说我们可以通过admin的getDescriptor()来获取旧的描述。 对于旧的列族描述来说我们可以通过表格描述对象的getColumnFamily()方法来获取。 /*** 修改表格中一个列族的版本* param namespace 命名空间* param tableName 表名* param columnFamily 列族* param version 维护的版本*/public static void modifyTable(String namespace,String tableName,String columnFamily,int version) throws IOException {// 判断表格是否存在if (!isTableExists(namespace,tableName)){System.out.println(表格不存在);return;}// 1. 获取adminAdmin admin connection.getAdmin();// 2. 调用方法修改表格// 2.0 获取之前的表格描述TableDescriptor tableDescriptor null;try {tableDescriptor admin.getDescriptor(TableName.valueOf(namespace, tableName));} catch (IOException e) {System.out.println(表格不存在);e.printStackTrace();}// 2.1 创建一个表格描述建造者// 如果使用填写 tableName 的方法 相当于创建了一个新的表格描述 没有之前的信息// 如果想要修改表格的信息 必须调用方法填写一个旧的表格描述TableDescriptorBuilder builder TableDescriptorBuilder.newBuilder(tableDescriptor);// 2.2 对应建造者进行表格数据的修改// 获取旧的列族描述ColumnFamilyDescriptor columnFamily1 tableDescriptor.getColumnFamily(Bytes.toBytes(columnFamily));// 创建列族描述建造者ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder ColumnFamilyDescriptorBuilder.newBuilder(columnFamily1);// 修改对应的版本columnFamilyDescriptorBuilder.setMaxVersions(version);// 在这里修改的时候 如果填写的是新创建的列族描述 那么我们表格之前的其它属性会被初始化 所以要使用旧的列族描述builder.modifyColumnFamily(columnFamilyDescriptorBuilder.build());try {admin.modifyTable(builder.build());} catch (IOException e) {e.printStackTrace();}// 3. 关闭adminadmin.close();} 2.5、删除表 需要注意HBase中删除表前必须标记表为不可用 /*** 删除表格* param namespace 命名空间* param tableName 表名* return true-删除成功*/public static boolean deleteTable(String namespace,String tableName) throws IOException {// 1. 判断表格是否存在if (!isTableExists(namespace,tableName)){System.out.println(表格不存在 无法删除);return false;}// 2. 获取adminAdmin admin connection.getAdmin();// 3. 调用相关的方法删除表格try {// hbase 删除表格前必须标记标记表格为不可用才能删除admin.disableTable(TableName.valueOf(namespace,tableName));admin.deleteTable(TableName.valueOf(namespace,tableName));} catch (IOException e) {e.printStackTrace();}// 4. 关闭adminadmin.close();return true;} 3、DML 3.1、插入数据 我们可以看到插入数据的put方法中要求参数必须为Byte类型这也应证了我们之前第一篇博客说的-HBase的Cell的数据都是以Byte字节类型存储的。 public class HBaseDML {//静态属性public static Connection connection HBaseConnection.connection;/*** 插入数据* param namespace 命名空间* param tableName 表名* param rowKey 行键* param columnFamily 列族* param columnName 列名* param value 值*/public static void putCell(String namespace,String tableName,String rowKey,String columnFamily,String columnName,String value) throws IOException {// 1. 获取 TableTable table connection.getTable(TableName.valueOf(namespace,tableName));// 2. 调用相关方法实现数据插入// 2.1 创建 put 对象Put put new Put(Bytes.toBytes(rowKey));// 2.2 给 put 对象添加属性put.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(columnName),Bytes.toBytes(value));// 2.3 将对象写入对应的方法try {table.put(put);} catch (IOException e) {e.printStackTrace();}// 3. 关闭tabletable.close();}public static void main(String[] args) throws IOException {// 测试插入数据putCell(bigdata,student,1005,info,name,hbase);System.out.println(其他代码);// 关闭连接HBaseConnection.closeConnection();} } 3.2、查询数据 /**读取数据 读取对应的一行中的某一列* param namespace 命名空间* param tableName 表名* param rowKey 行键* param columnFamily 列族* param columnName 列名* return 返回最小单位集合 Cells*/public static Cell[] getCells(String namespace,String tableName,String rowKey,String columnFamily,String columnName) throws IOException {// 1. 获取TableTable table connection.getTable(TableName.valueOf(namespace,tableName));// 2. 创建get对象Get get new Get(Bytes.toBytes(rowKey));// 3. 读取数据// 如果直接调用get方法读取数据 读到的是一整行数据// 如果想读取某一列的数据 需要添加对应的参数get.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(columnName));// 设置读取数据的版本所有版本get.readAllVersions();// 读取数据 得到result对象Result result null;try {result table.get(get);} catch (IOException e) {e.printStackTrace();}finally {table.close();}//返回结果if (result!null)return result.rawCells();elsereturn null;}/*** 打印Cell的值* param cells Cell数组*/public static void printCells(Cell[] cells){for (Cell cell : cells) {// cell 存储数据比较底层String rowKey new String((CellUtil.cloneRow(cell)));String columnFamily new String(CellUtil.cloneFamily(cell));String columnName new String(CellUtil.cloneQualifier(cell));String value new String(CellUtil.cloneValue(cell));System.out.print(rowKey - columnFamily - columnName - value \t);}} 3.3、扫描数据 我们打印的范围是 [startRow,stopRow) 的是不包含 stopRow 的如果我们要打印出最后一位的话stopRow1 越界也是没有问题的比如下面我们一共有5行数据我们设置终止行键为 6 就是没问题的不会报错。  /*** 打印Cell的值* param cells Cell数组*/public static void printCells(Cell[] cells){for (Cell cell : cells) {// cell 存储数据比较底层String rowKey new String((CellUtil.cloneRow(cell)));String columnFamily new String(CellUtil.cloneFamily(cell));String columnName new String(CellUtil.cloneQualifier(cell));String value new String(CellUtil.cloneValue(cell));System.out.print(rowKey - columnFamily - columnName - value \t);}}/*** 扫描数据 [起始行健,终止行键)* param namespace 命名空间* param tableName 表名* param startRow 起始行健* param stopRow 终止行键*/public static void scan(String namespace,String tableName,String startRow,String stopRow) throws IOException {// 1. 获取tableTable table connection.getTable(TableName.valueOf(namespace, tableName));// 2. 创建Scan对象Scan scan new Scan();// 添加参数 来限制扫描的范围 否则扫描整张表scan.withStartRow(Bytes.toBytes(startRow));scan.withStopRow(Bytes.toBytes(stopRow));try {// 读取多行数据 获得scannerResultScanner scanner table.getScanner(scan);// result 来记录一行数据 本质是一个 Cell 数组// resultScanner 来记录多行数据 本质是一个 result 数组for (Result result : scanner) {printCells(result.rawCells());System.out.println(); //打印完一个行键对应的行后换行}} catch (IOException e) {e.printStackTrace();}// 3. 关闭tabletable.close();} 3.4、带过率扫描 带过滤扫描不仅可以扫描最新的数据还可以扫描到该列族维护的最大版本范围内的历史数据。 /*** 单列带过滤扫描数据 [起始行健,终止行键)* param namespace 命名空间* param tableName 表名* param startRow 起始行键* param stopRow 终止行键* param columnFamily 列族* param columnName 列名* param value value值* throws IOException IO异常*/public static void filterScan(String namespace,String tableName,String startRow,String stopRow,String columnFamily,String columnName,String value) throws IOException {// 1. 获取tableTable table connection.getTable(TableName.valueOf(namespace, tableName));// 2. 创建Scan对象Scan scan new Scan();// 添加参数 来限制扫描的范围 否则扫描整张表scan.withStartRow(Bytes.toBytes(startRow));scan.withStopRow(Bytes.toBytes(stopRow));// 可以添加多个过滤FilterList filterList new FilterList();// 创建过滤器// (1) 结果只保留当前列的数据ColumnValueFilter columnValueFilter new ColumnValueFilter(Bytes.toBytes(columnFamily),Bytes.toBytes(columnName),// 比较关系CompareOperator.EQUAL,Bytes.toBytes(value));filterList.addFilter(columnValueFilter);// 添加过滤scan.setFilter(filterList);try {// 读取多行数据 获得scannerResultScanner scanner table.getScanner(scan);// result 来记录一行数据 本质是一个 Cell 数组// resultScanner 来记录多行数据 本质是一个 result 数组for (Result result : scanner) {printCells(result.rawCells());System.out.println(); //打印完一个行键对应的行后换行}} catch (IOException e) {e.printStackTrace();}// 3. 关闭tabletable.close();} 整行过滤就是结果集不只是单单我们搜索的那一列数据而是整行数据是整行数据包括所有列族所有列而不是一个Cell需要使用 SingleColumnVlaueFilter 就好需要注意的是如果一行数据的某一列为空而那一列的值恰好是我们过滤的关键字那么这一行数据也会被添加到结果集。 // (2) 结果保留整行数据 包含其他列// 结果会保留没有当前列的数据 比如我们要info:name张三的整行数据 但是有这么一行数据的info列族下name是空的 这种数据也会被获取到结果集中去SingleColumnValueFilter singleColumnValueFilter new SingleColumnValueFilter(Bytes.toBytes(columnFamily),Bytes.toBytes(columnName),CompareOperator.EQUAL,Bytes.toBytes(value));filterList.addFilter(singleColumnValueFilter); 3.5、删除数据 HBase使用版本控制来管理数据的多个版本当最新版本的数据被删除后HBase会使用次新版本的数据填充原来的位置。所以如果一个Cell的某一列有多个版本当我们仅仅删除最新版之后会有旧版本来填充被删除的位置。 /*** 删除一行中的一列数据* param namespace 命名空间* param tableName 表格名称* param rowKey 行键* param columnFamily 列族* param columnName 列名*/public static void deleteColumn(String namespace,String tableName,String rowKey,String columnFamily,String columnName) throws IOException {// 1. 获取tableTable table connection.getTable(TableName.valueOf(namespace,tableName));// 2. 创建delete对象Delete delete new Delete(Bytes.toBytes(rowKey));// 添加列信息// addColumn 删除最新版本// addColumns 删除所有版本delete.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(columnName));// delete.addColumns(Bytes.toBytes(columnFamily),Bytes.toBytes(columnName));// 删除数据try {table.delete(delete);} catch (IOException e) {e.printStackTrace();}// 关闭tabletable.close();} 删除前我们的历史版本有3个最新的是 ls 删除后name变为了 zs 至此HBase的基本使用已经完毕还是比较简单的解下来就是深入了解一下HBase的底层毕竟没有学习难度的能力就没有竞争力
http://www.zqtcl.cn/news/855854/

相关文章:

  • 昆明网站的优化自媒体是干什么的
  • 大成建设株式会社网站删掉wordpress主题
  • 个人网站备案类型网络维护培训班
  • 做网站的可以注册个工作室吗一个网站两个域名吗
  • 网站建设要准备什么资料网站建设 锐颖科技
  • 如何建设网站山东济南兴田德润官网电子商城官网
  • 网站如何做支付宝接口免费ppt自动生成器
  • 泰安市建设职工培训中心网站官网seo经理招聘
  • 湛江做网站seo网站建设 0551
  • 建站公司 深圳苏州建站公司
  • 网站怎么做引流呢济南网站微信
  • 一个域名可以做几个网站吗wordpress左右翻转页面
  • 天津人工智能建站系统软件wordpress主题没有小工具
  • 网站的备案流程图视频制作素材
  • 劳务公司网站建设方案建设促销网站前的市场分析
  • 网络营销优化培训网站seo置顶 乐云践新专家
  • 小说网站搭建教程wordpress后台图片
  • 付网站开发费计入什么科目网站开发的历史
  • 站长素材ppt模板免费下载网站开发视频教程迅雷下载
  • 建设一个网站怎么赚钱南京江北新区房价走势最新消息
  • 一个网站怎么做软件下载互联网投放渠道有哪些
  • 手机网站建设进度环境设计排版素材网站
  • 网站开发众筹地推网推平台
  • 长沙互联网网站建设wordpress标签id在哪里修改
  • 企业网站的建设 摘要大连网站设计策划
  • 做房地产一级市场的看什么网站网络营销外包推广方式
  • 网站建设基本流程包括哪几个步骤网站建设策划书网站发布与推广
  • 徐州整站优化手机网页端
  • 深圳中瑞建设集团官方网站宁波seo快速优化教程
  • 福田网站制作哪家好昆山企业网站建设公司