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命令中支持的命令操作汇总:
- 列出所有的数据库中的表格:list
- 浏览一个表格中的所有数据:scan ‘表格’
- 获得某一行的值:get:get ‘表名’,’,‘列名’,‘行号’
- 向表格中添加数据更新数据:put ‘表格’,‘行号’,‘列名’,‘列值’
- 获取更新的值,指定版本:get ‘student’ , ’001’ , {NAME=>’sage’,VERSION=>5}
- 修改表的结构,增加或者删除列:alter ‘表格’,NAME=>’列名’,一次添加一列
- 删除一个数据:delete:delete ‘表名’,‘行号’,‘列名’
- 删除一行数据:deleteall:deleteall ‘表名’,‘行号’
- 删除表格所有数据:truncate:truncate ‘表名’
列出HBase所有的表的相关信息,例如表名
Java代码:
在终端打印出指定的表的所有记录数据
Java代码:
向已经创建好的表添加和删除指定的列族或列
Java代码:
清空指定的表的所有记录数据
Java代码:
统计表的行数
Java代码:
(四)hbase数据库的操作:
创建学生表(Student)
创建课程表(Course)
创建选课表('SC')
Java代码:
创建表
实现向表中添加数据:
浏览表格数据:
修改表行row列column指定的单元格的数据:
删除表格数据:
(五)实验源码:
Question1:
- 编程实现以下指定功能,并用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:
- 编程实现以下指定功能,并用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
版权归原作者 晴天@star 所有, 如有侵权,请联系我们删除。