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

齐齐哈尔北京网站建设做网站哪些

齐齐哈尔北京网站建设,做网站哪些,怎样开网站,南通门户网站我们之后的实际开发中不可能在服务器那边直接使用shell命令一直敲的&#xff0c;一般都是通过API进行操作的。 环境准备 新建Maven项目&#xff0c;导入Maven依赖 <dependencies><dependency><groupId>org.apache.hbase</groupId><artifactId>…

我们之后的实际开发中不可能在服务器那边直接使用shell命令一直敲的,一般都是通过API进行操作的。

环境准备

新建Maven项目,导入Maven依赖

<dependencies><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>2.4.17</version></dependency></dependencies>

1、创建连接

        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 version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property><name>hbase.zookeeper.quorum</name><value>hadoop102,hadoop103,hadoop104</value><description>The 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、查询数据

未完待续

3.3、扫描数据

3.4、带过率扫描

3.5、删除数据

http://www.yayakq.cn/news/500627/

相关文章:

  • 搜索网站建设网站 建设
  • 常州全景网站制作太原网站建设工作室
  • 做网站的名字大全网站维护 代码
  • 建设网站模板免费空间中国网站
  • 网站建设时间及简介网站建设如何搭建框架
  • 重庆市建设工程造价站苏州淘宝运营培训
  • 天津建站模板搭建苏州建设工程公司网站
  • 取消网站备案号网站app 开发
  • 南宁市网站开发公司app产品开发公司
  • 国外游戏网站欣赏wordpress客户中心
  • 电子商务网站开发教程论文广州网站设计价格
  • 热门网站建设招商项目厦门成交型网站建设公司
  • 分类信息网址aso优化吧
  • 长沙网站建设商城用网站模板建网站
  • 郎创网站建设南充建设网站
  • dede网站后台打不开宏发建设有限公司网站
  • 关于做芯片类招聘的网站抖音信息流广告代理商
  • c2c网站代表做白酒用哪个分类信息网站
  • 南京企业网站开发公司微网站建设网络
  • 做六个网站静态页多少钱如何选择锦州网站建设
  • flash做网站轮播图文明网站建设管理培训心得
  • 智能建站系统免费版华为开发者选项在哪里打开
  • 买域名做网站的坏处自己搭建ddns动态域名解析
  • wordpress修改数据库连接重庆网站优化服务
  • vs2017网站开发教程泰州网站制作公司
  • 戴尔的网站建设有哪些主要特色做私单的网站
  • 做外贸客户要求看网站wordpress连接设置
  • 网站制作怎么添加图片中国三北防护林体系建设网站
  • 网站设计模板html电子商务网站建设课程设计
  • 房地产广告设计网站网页游戏大厅在线玩