分布式文件系统—基于伪分布式文件系统的HBase的安装与java api测试

一.Hadoop伪分布式安装
Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。

1.(1)修改配置文件 core-site.xml
cd /usr/local/hadoop
gedit etc/hadoop/core-site.xml
在这里插入图片描述

(2)同样修改配置文件 hdfs-site.xml:
gedit etc/hadoop/hdfs-site.xml
在这里插入图片描述

2.配置完成后,执行 NameNode 的格式化
/usr/local/hadoop$sudo bin/hdfs namenode -format

3.接着开启 NameNode 和 DataNode 守护进程。
./sbin/start-dfs.sh #start-dfs.sh是个完整的可执行文件,中间没有空格
在这里插入图片描述

4.通过jps查看启动的Hadoop进程
Jps
在这里插入图片描述

  1. 通过web界面访问
    如果是linux或者虚拟机配置的hadoop,成功启动后,可以访问 Web 界面http://localhost:9870(for hadoop3.x) http://localhost:50070(for hadoop2.x) 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。
    Note: 如果两个地址都打不开,可能是namenode初始化默认端口失效,需手动修改配置文件设置默认端口 hdfs-site.xml 添加dfs.http.address,将绑定IP改为0.0.0.0,而不是本地回环IP,这样就能够实现外网访问本机的50070端口了。
    在这里插入图片描述

然后stop-dfs.sh,stop-yarn.sh,重新格式化,jps查看,再访问。
在这里插入图片描述

6.HBase安装
下载网址:https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/
在这里插入图片描述

点击 stable目录,然后下载后缀为 .tar.gz 的文件
在这里插入图片描述

解压安装包hbase-2.2.5-bin.tar.gz并更改名字为hbase
在这里插入图片描述
在这里插入图片描述

配置环境变量
使用vi命令进入~/.bashrc 更改配置
gedit ~/.bashrc
在这里插入图片描述

配置完成后,执行source命令使终端立即生效
在这里插入图片描述

添加HBase权限
在这里插入图片描述

确定hbase是否安装成功
这有一个问题需要注意:
如果提示:
在这里插入图片描述

是环境变量的问题,于是打开./bashrc文件
在这里插入图片描述

改成这样后
Source ./bashrc
重新启动计算机!!!!!!(一定重新启动不然不生效)
启动之后就会显示安装成功了。
在这里插入图片描述

HBase配置
配置Java环境变量,并添加配置HBASE_MANAGES_ZK为true,用vi命令打开并编辑hbase-env.sh
在这里插入图片描述

配置/usr/local/hbase/conf/hbase-site.xml
打开并编辑hbase-site.xml
gedit /usr/local/hbase/conf/hbase-site.xml
在这里插入图片描述

接下来测试运行。首先切换目录至HBase安装目录/usr/local/hbase;再启动HBase。
在这里插入图片描述
在这里插入图片描述

HBase启动成功
下面暂时结束HBase进程,进行伪分布式安装
在这里插入图片描述

配置/usr/local/hbase/conf/hbase-env.sh。
配置JAVA_HOME,HBASE_CLASSPATH,HBASE_MANAGES_ZK.
HBASE_CLASSPATH设置为本机Hadoop安装目录下的conf目录(即/usr/local/hadoop/conf)
在这里插入图片描述
在这里插入图片描述

配置/usr/local/hbase/conf/hbase-site.xml
修改hbase.rootdir,指定HBase数据在HDFS上的存储路径;将属性hbase.cluter.distributed设置为true。假设当前Hadoop集群运行在伪分布式模式下,在本机上运行,且NameNode运行在9000端口。
在这里插入图片描述
在这里插入图片描述

接下来测试运行HBase。
第一步:首先登陆ssh,之前设置了无密码登陆,因此这里不需要密码;再切换目录至/usr/local/hadoop ;再启动hadoop

在这里插入图片描述
在这里插入图片描述

输入命令jps,能看到NameNode,DataNode和SecondaryNameNode都已经成功启动,表示hadoop启动成功,截图如下:
在这里插入图片描述

第二步:切换目录至/usr/local/hbase;再启动HBase
在这里插入图片描述

启动成功,输入命令jps,看到以下界面说明hbase启动成功
在这里插入图片描述

进入shell界面
在这里插入图片描述

编程实践
HBase中用create命令创建表
在这里插入图片描述

可通过describe命令查看“student”表的基本信息
在这里插入图片描述

HBase中用put命令添加数据
在这里插入图片描述

查看数据用get命令
在这里插入图片描述

在HBase中用delete以及deleteall命令进行删除数据操作
delete命令
在这里插入图片描述

deleteall命令
在这里插入图片描述

删除表
删除表有两步,第一步先让该表不可用,第二步删除表

在这里插入图片描述

JAVA API编程实例
第一步:启动hadoop,启动hbase
第二步,新建Java Project——>新建Class

在这里插入图片描述
在这里插入图片描述

第三步:在工程中导入外部jar包
在这里插入图片描述

下面是编程代码:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.;
import org.apache.hadoop.hbase.client.
;
import java.io.IOException;

public class ExampleForHbase {
public static Configuration configuration;
public static Connection connection;
public static Admin admin;

//主函数中的语句请逐句执行,只需删除其前的//即可,如:执行insertRow时请将其他语句注释
public static void main(String[] args)throws IOException{
    //创建一个表,表名为Score,列族为sname,course
    //createTable("Score",new String[]{"sname","course"});

    //在Score表中插入一条数据,其行键为95001,sname为Mary(因为sname列族下没有子列所以第四个参数为空)
    //等价命令:put 'Score','95001','sname','Mary'
    insertRow("Score", "95001", "sname", "", "Mary");
    //在Score表中插入一条数据,其行键为95001,course:Math为88(course为列族,Math为course下的子列)
    //等价命令:put 'Score','95001','score:Math','88'
    //insertRow("Score", "95001", "course", "Math", "88");
    //在Score表中插入一条数据,其行键为95001,course:English为85(course为列族,English为course下的子列)
    //等价命令:put 'Score','95001','score:English','85'
    //insertRow("Score", "95001", "course", "English", "85");

    //1、删除Score表中指定列数据,其行键为95001,列族为course,列为Math
    //执行这句代码前请deleteRow方法的定义中,将删除指定列数据的代码取消注释注释,将删除制定列族的代码注释
    //等价命令:delete 'Score','95001','score:Math'
    //deleteRow("Score", "95001", "course", "Math");

    //2、删除Score表中指定列族数据,其行键为95001,列族为course(95001的Math和English的值都会被删除)
    //执行这句代码前请deleteRow方法的定义中,将删除指定列数据的代码注释,将删除制定列族的代码取消注释
    //等价命令:delete 'Score','95001','score'
    //deleteRow("Score", "95001", "course", "");

    //3、删除Score表中指定行数据,其行键为95001
    //执行这句代码前请deleteRow方法的定义中,将删除指定列数据的代码注释,以及将删除制定列族的代码注释
    //等价命令:deleteall 'Score','95001'
    //deleteRow("Score", "95001", "", "");

    //查询Score表中,行键为95001,列族为course,列为Math的值
    //getData("Score", "95001", "course", "Math");
    //查询Score表中,行键为95001,列族为sname的值(因为sname列族下没有子列所以第四个参数为空)
    //getData("Score", "95001", "sname", "");

    //删除Score表
    //deleteTable("Score");
}

//建立连接
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();
    }
}

/**
 * 建表。HBase的表中会有一个系统默认的属性作为主键,主键无需自行创建,默认为put命令操作中表名后第一个数据,因此此处无需创建id列
 * @param myTableName 表名
 * @param colFamily 列族名
 * @throws IOException
 */
public static void createTable(String myTableName,String[] colFamily) throws IOException {

    init();
    TableName tableName = TableName.valueOf(myTableName);

    if(admin.tableExists(tableName)){
        System.out.println("talbe is exists!");
    }else {
        HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);
        for(String str:colFamily){
            HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(str);
            hTableDescriptor.addFamily(hColumnDescriptor);
        }
        admin.createTable(hTableDescriptor);
        System.out.println("create table success");
    }
    close();
}
/**
 * 删除指定表
 * @param tableName 表名
 * @throws IOException
 */
public static void deleteTable(String tableName) throws IOException {
    init();
    TableName tn = TableName.valueOf(tableName);
    if (admin.tableExists(tn)) {
        admin.disableTable(tn);
        admin.deleteTable(tn);
    }
    close();
}

/**
 * 查看已有表
 * @throws IOException
 */
public static void listTables() throws IOException {
    init();
    HTableDescriptor hTableDescriptors[] = admin.listTables();
    for(HTableDescriptor hTableDescriptor :hTableDescriptors){
        System.out.println(hTableDescriptor.getNameAsString());
    }
    close();
}
/**
 * 向某一行的某一列插入数据
 * @param tableName 表名
 * @param rowKey 行键
 * @param colFamily 列族名
 * @param col 列名(如果其列族下没有子列,此参数可为空)
 * @param val 值
 * @throws IOException
 */
public static void insertRow(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();
}

/**
 * 删除数据
 * @param tableName 表名
 * @param rowKey 行键
 * @param colFamily 列族名
 * @param col 列名
 * @throws IOException
 */
public static void deleteRow(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(colFamily.getBytes());
    //删除指定列的数据
    //delete.addColumn(colFamily.getBytes(), col.getBytes());

    table.delete(delete);
    table.close();
    close();
}
/**
 * 根据行键rowkey查找数据
 * @param tableName 表名
 * @param rowKey 行键
 * @param colFamily 列族名
 * @param col 列名
 * @throws IOException
 */
public static void getData(String tableName,String rowKey,String colFamily,String col)throws  IOException{
    init();
    Table table = connection.getTable(TableName.valueOf(tableName));
    Get get = new Get(rowKey.getBytes());
    get.addColumn(colFamily.getBytes(),col.getBytes());
    Result result = table.get(get);
    showCell(result);
    table.close();
    close();
}
/**
 * 格式化输出
 * @param result
 */
public static void showCell(Result result){
    Cell[] cells = result.rawCells();
    for(Cell cell:cells){
        System.out.println("RowName:"+new String(CellUtil.cloneRow(cell))+" ");
        System.out.println("Timetamp:"+cell.getTimestamp()+" ");
        System.out.println("column Family:"+new String(CellUtil.cloneFamily(cell))+" ");
        System.out.println("row Name:"+new String(CellUtil.cloneQualifier(cell))+" ");
        System.out.println("value:"+new String(CellUtil.cloneValue(cell))+" ");
    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值