0


熟悉常用的HBase操作

1.实验目的

(1)理解HBase在Hadoop体系结构中的角色;

(2)熟练使用HBase操作常用的Shell命令;

(3)熟悉HBase操作常用的Java API。

2.实验平台

(1)操作系统:Linux(建议Ubuntu16.04或Ubuntu18.04);

(2)Hadoop版本:3.1.3;

(3)HBase版本:2.2.2;

(4)JDK版本:1.8;

(5)Java IDE:Eclipse。

3.实验步骤

(一)基本的安装环境配置操作:

(1)解压hbase到usr/local,更改文件名称:

注:这里是因为已经解压到了usr/local里面,文件的名称也进行了修改;

(2)下面把hbase目录权限赋予给hadoop用户:

(3)配置环境变量,将hbase下的bin目录添加到path中,这样,启动hbase就无需到/usr/local/hbase目录下,大大的方便了hbase的使用。教程下面的部分还是切换到了/usr/local/hbase目录操作,有助于初学者理解运行过程,熟练之后可以不必切换。编辑~/.bashrc文件

(4)添加HBase权限

(5)启动Hadoop:

(6)检查hbase的版本:

(7)配置/usr/local/hbase/conf/hbase-env.sh 。配置JAVA环境变量,并添加配置HBASE_MANAGES_ZK为true,用vi命令打开并编辑hbase-env.sh,命令如下:

(8)配置/usr/local/hbase/conf/hbase-site.xml,打开并编辑hbase-site.xml:

(9)启动hbase:

(10)伪分布安装,配置/usr/local/hbase/conf/hbase-env.sh:

(11)配置/usr/local/hbase/conf/hbase-site.xml,用命令vi打开并编辑hbase-site.xml

(12)测试运行HBase

(13)启动hadoop:

(14)启动hbase:

(15)在进入伪分布的命令模式:

(16)关闭hbase

(二)编程实践操作:

在hbase里面创建表:

检查表中的基本信息:

HBase中用put命令添加数据:

删除数据:

删除表格中的所有数据:

查看数据,HBase中有两个用于查看数据的命令:1. get命令,用于查看表的某一行数据;2. scan命令用于查看某个表的全部数据:

返回的是‘student’表‘95001’行的数据:

命令返回的是‘student’表的全部数据:

删除表:

插入数据然后更新数据,使其产生历史版本数据查询时,指定查询的历史版本数。默认会查询出最新的数据。(有效取值为1到5)

(三)在Java中编程对hbase表进行以上操作:

创建表格:

hbase shell查看创建表格是否创建成功:

在HBase Shell交互式环境中,使用如下命令查看student表中的数据:

  • 作业编程实践操作:

在shell命令中支持的命令操作汇总:

  1. 列出所有的数据库中的表格:list
  2. 浏览一个表格中的所有数据:scan ‘表格’
  3. 获得某一行的值:get:get ‘表名’,’,‘列名’,‘行号’
  4. 向表格中添加数据更新数据:put ‘表格’,‘行号’,‘列名’,‘列值’
  5. 获取更新的值,指定版本:get ‘student’ , ’001’ , {NAME=>’sage’,VERSION=>5}
  6. 修改表的结构,增加或者删除列:alter ‘表格’,NAME=>’列名’,一次添加一列
  7. 删除一个数据:delete:delete ‘表名’,‘行号’,‘列名’
  8. 删除一行数据:deleteall:deleteall ‘表名’,‘行号’
  9. 删除表格所有数据:truncate:truncate ‘表名’

列出HBase所有的表的相关信息,例如表名

Java代码:

在终端打印出指定的表的所有记录数据

Java代码:

向已经创建好的表添加和删除指定的列族或列

Java代码:

清空指定的表的所有记录数据

Java代码:

统计表的行数

Java代码:

(四)hbase数据库的操作:

创建学生表(Student)

创建课程表(Course)

创建选课表('SC')

Java代码:

创建表

实现向表中添加数据:

浏览表格数据:

修改表行row列column指定的单元格的数据:

删除表格数据:

(五)实验源码:

Question1:

    1. 编程实现以下指定功能,并用Hadoop提供的HBase Shell命令完成相同任务:

*(1) 列出HBase所有的表的相关信息,例如表名、创建时间等;

*(2) 在终端打印出指定的表的所有记录数据;

*(3) 向已经创建好的表添加和删除指定的列族或列;

*(4) 清空指定的表的所有记录数据;

*(5) 统计表的行数。

*/

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.*;

import org.apache.hadoop.hbase.client.*;

import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

import java.util.List;

public class QuestionOne {

public static Configuration configuration;

public static Connection connection;

public static Admin admin;



//建立连接

public static void init(){

    configuration  = HBaseConfiguration.create();

    configuration.set("hbase.rootdir","hdfs://localhost:9000/hbase");

    try{

        connection = ConnectionFactory.createConnection(configuration);

        admin = connection.getAdmin();

    }catch (IOException e){

        e.printStackTrace();

    }

}

//关闭连接

public static void close(){

    try{

        if(admin != null){

            admin.close();

        }

        if(null != connection){

            connection.close();

        }

    }catch (IOException e){

        e.printStackTrace();

    }

}

//(1)列出HBase所有的表的相关信息,例如表名、创建时间等

public static void listTables() throws IOException {

    init();//建立连接

    List<TableDescriptor> tableDescriptors = admin.listTableDescriptors();

    for(TableDescriptor tableDescriptor : tableDescriptors){

        TableName tableName = tableDescriptor.getTableName();

        System.out.println("Table:" + tableName);

    }

    close();//关闭连接

}

//(2)在终端打印出指定的表的所有记录数据

public static void getData(String tableName)throws  IOException{

    init();

    Table table = connection.getTable(TableName.valueOf(tableName));

    Scan scan = new Scan();

    ResultScanner scanner = table.getScanner(scan);//获取行的遍历器

    for (Result result:scanner){

        printRecoder(result);

    }

    close();

}

//打印一条记录的详情

public  static void printRecoder(Result result)throws IOException{

    for(Cell cell:result.rawCells()){

        System.out.print("行健: "+new String(Bytes.toString(cell.getRowArray(),cell.getRowOffset(), cell.getRowLength())));

        System.out.print("列簇: "+new String( Bytes.toString(cell.getFamilyArray(),cell.getFamilyOffset(), cell.getFamilyLength()) ));

        System.out.print(" 列: "+new String(Bytes.toString(cell.getQualifierArray(),cell.getQualifierOffset(), cell.getQualifierLength())));

        System.out.print(" 值: "+new String(Bytes.toString(cell.getValueArray(),cell.getValueOffset(), cell.getValueLength())));

        System.out.println("时间戳: "+cell.getTimestamp());            

    }

}

//(3)想已经创建好的表添加和删除指定的列族或列

//向表添加数据

public static void insterRow(String tableName,String rowKey,String colFamily,String col,String val) throws IOException {

    init();

    Table table = connection.getTable(TableName.valueOf(tableName));

    Put put = new Put(rowKey.getBytes());

    put.addColumn(colFamily.getBytes(), col.getBytes(), val.getBytes());

    table.put(put);

    table.close();

    close();

}

//删除数据

public static void deleRow(String tableName,String rowKey,String colFamily,String col) throws IOException {

    init();

    Table table = connection.getTable(TableName.valueOf(tableName));

    Delete delete = new Delete(rowKey.getBytes());

    //删除指定列族

    delete.addFamily(Bytes.toBytes(colFamily));

    //删除指定列

    delete.addColumn(Bytes.toBytes(colFamily),Bytes.toBytes(col));

    table.delete(delete);

    table.close();

    close();

}

//(4)清空指定的表的所有记录数据

public static void clearRows(String tableName)throws IOException{

    init();

    TableName tablename = TableName.valueOf(tableName);

    admin.disableTable(tablename);

    admin.deleteTable(tablename);

    TableDescriptorBuilder tableDescriptor = TableDescriptorBuilder.newBuilder(tablename);

    admin.createTable(tableDescriptor.build());        

    close();

}

//(5)统计表的行数

public static void countRows(String tableName)throws IOException{

    init();

    Table table = connection.getTable(TableName.valueOf(tableName));

    Scan scan = new Scan();

    ResultScanner scanner = table.getScanner(scan);

    int num = 0;

    for (Result result = scanner.next();result!=null;result=scanner.next()){

        num++;

    }

    System.out.println("行数:"+ num);

    scanner.close();

    close();

}

}

Question2:

    1. 编程实现以下指定功能,并用Hadoop提供的HBase Shell命令完成相同任务:

*(1) 列出HBase所有的表的相关信息,例如表名、创建时间等;

*(2) 在终端打印出指定的表的所有记录数据;

*(3) 向已经创建好的表添加和删除指定的列族或列;

*(4) 清空指定的表的所有记录数据;

*(5) 统计表的行数。

*/

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.*;

import org.apache.hadoop.hbase.client.*;

import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

public class QuestionTwo {

public static Configuration configuration;

public static Connection connection;

public static Admin admin;

public static void main(String[] args)throws IOException{

    scanColumn("Student","S_Name");

}

//建立连接

public static void init(){

    configuration  = HBaseConfiguration.create();

    configuration.set("hbase.rootdir","hdfs://localhost:9000/hbase");

    try{

        connection = ConnectionFactory.createConnection(configuration);

        admin = connection.getAdmin();

    }catch (IOException e){

        e.printStackTrace();

    }

}

//关闭连接

public static void close(){

    try{

        if(admin != null){

            admin.close();

        }

        if(null != connection){

            connection.close();

        }

    }catch (IOException e){

        e.printStackTrace();

    }

}

/*(3)scanColumn(String tableName, String column)

浏览表tableName某一列的数据,如果某一行记录中该列数据不存在,则返回null。

要求当参数column为某一列族名称时,如果底下有若干个列限定符,则要列出每个列限定符代表的列的数据;

当参数column为某一列具体名称(例如“Score:Math”)时,只需要列出该列的数据。

   */

   public static void scanColumn(String tableName,String column)throws  IOException{

       init();

       Table table = connection.getTable(TableName.valueOf(tableName));

       Scan scan = new Scan();

       scan.addFamily(Bytes.toBytes(column));

       ResultScanner scanner = table.getScanner(scan);

       for (Result result = scanner.next(); result != null; result = scanner.next()){

           showCell(result);

       }

       table.close();

       close();

   }

   //格式化输出

   public static void showCell(Result result){

       Cell[] cells = result.rawCells();

       for(Cell cell:cells){

           System.out.println("RowName:"+new String(Bytes.toString(cell.getRowArray(),cell.getRowOffset(), cell.getRowLength()))+" ");

           System.out.println("Timetamp:"+cell.getTimestamp()+" ");

           System.out.println("column Family:"+new String(Bytes.toString(cell.getFamilyArray(),cell.getFamilyOffset(), cell.getFamilyLength()))+" ");

           System.out.println("row Name:"+new String(Bytes.toString(cell.getQualifierArray(),cell.getQualifierOffset(), cell.getQualifierLength()))+" ");

           System.out.println("value:"+new String(Bytes.toString(cell.getValueArray(),cell.getValueOffset(), cell.getValueLength()))+" ");           

       }

   }

}

4.可能存在的问题以及解决办法:

①配置hbase环境的时候查看提示无法加载主类:在hbase.evn.sh添加

②修改权限时提示chown 无效用户Hadoop:将中间的Hadoop改成前面的用户名;

③提示找不到文件:先检查语句是否正确,再返回文件中查看是否存在要操作的文件

④进入hbase命令模式:提示sever is not running yet:在Hadoop目录下输入:

bin/dfs -safemode leave

⑤若出现没有。。。Master,则重新启动hbase,若无法解决问题就直接删除Hadoop里hbase所有文件:./bin/hdfs dfs -rm -r /hbase

标签: hbase hadoop big data

本文转载自: https://blog.csdn.net/m0_59353930/article/details/124873071
版权归原作者 晴天@star 所有, 如有侵权,请联系我们删除。

“熟悉常用的HBase操作”的评论:

还没有评论