如果你正在安装,请用hadoop用户
HBase是一个分布式的、面向列的开源数据库,源于Google的一篇论文《BigTable:一个结构化数据的分布式存储系统》。HBase以表的形式存储数据,表有行和列组成,列划分为若干个列族/列簇(column family)。欲了解HBase的官方资讯,请访问(http://hbase.apache.org/)。
HBase的运行有三种模式:单机模式、伪分布式模式、分布式模式。
单机模式:在一台计算机上安装和使用HBase,不涉及数据的分布式存储;伪分布式模式:在一台计算机上模拟一个小的集群;分布式模式:使用多台计算机实现物理意义上的分布式存储。
确保已安装Hadoop
将hbase的安装包下载到虚拟机内
1.1 解压安装包hbase-2.2.2-bin.tar.gz至路径 /usr/local
cd ~
sudo tar -zxf ~/下载/hbase-2.2.2-bin.tar.gz -C /usr/local
安装包路径记得更改
1.2 将解压的文件名hbase-2.2.2改为hbase,以方便使用
cd /usr/local
sudo mv ./hbase-2.2.2 ./hbase
把hbase目录权限赋予给hadoop用户
cd /usr/local
sudo chown -R hadoop ./hbase
1.3 配置环境变量
将hbase下的bin目录添加到path中
vim ~/.bashrc
# 如果没有引入过PATH请在~/.bashrc文件尾行添加如下内容:
export PATH=$PATH:/usr/local/hbase/bin
编辑完成后,再执行source命令使上述配置在当前终端立即生效
source ~/.bashrc
1.4 添加HBase权限
cd /usr/local
sudo chown -R hadoop ./hbase
1.5 查看HBase版本,确定hbase安装成功
/usr/local/hbase/bin/hbase version
Error: JAVA_HOME is not set
Please download the latest Sun JDK from the Sun Java web site http://www.oracle.com/technetwork/java/javase/downloads
HBase requires Java 1.8 or later.
开始盘查漏洞!!!
之前在hadoop用户中安装,现在登录的是usr用户,在配置一遍。试试。
以下内容源于安装Hadoop教程:
在Linux命令行界面中,执行如下Shell命令(注意:当前登录用户名是hadoop):
cd /usr/lib
sudo mkdir jvm
cd ~
cd Downloads
sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm
cd /usr/lib/jvm
ls
cd ~
vim ~/.bashrc
上面命令使用vim编辑器(查看vim编辑器使用方法)打开了hadoop这个用户的环境变量配置文件,请在这个文件的开头位置,添加如下几行内容:
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
保存.bashrc文件并退出vim编辑器。然后,继续执行如下命令让.bashrc文件的配置立即生效:
source ~/.bashrc
java -version
装java之后,再次查询hbase版本
可知:要预先安装
- jdk
- Hadoop( 单机模式不需要,伪分布式模式和分布式模式需要)
- SSH
vim /usr/local/hbase/conf/hbase-env.sh
添加完成后保存退出即可。
vim /usr/local/hbase/conf/hbase-site.xml
在启动HBase前需要设置属性hbase.rootdir,用于指定HBase数据的存储位置,若不设置的话,hbase.rootdir默认为/tmp/hbase-${user.name},这意味着每次重启系统都会丢失数据。此处设置为HBase安装目录下的hbase-tmp文件夹即(/usr/local/hbase/hbase-tmp),添加配置如下:
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///usr/local/hbase/hbase-tmp</value>
</property>
</configuration>
cd /usr/local/hbase
sudo bin/start-hbase.sh
bin/hbase shell
bin/stop-hbase.sh
1.配置/usr/local/hbase/conf/hbase-env.sh
vim /usr/local/hbase/conf/hbase-env.sh
配置JAVA_HOME,HBASE_CLASSPATH,HBASE_MANAGES_ZK.
HBASE_CLASSPATH设置为本机HBase安装目录下的conf目录
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162
export HBASE_CLASSPATH=/usr/local/hbase/conf
export HBASE_MANAGES_ZK=true
由于之前已经配置java和zookeeper,所以找到classpath添加路径即可。
2.配置/usr/local/hbase/conf/hbase-site.xml,用命令vi打开并编辑hbase-site.xml
vim /usr/local/hbase/conf/hbase-site.xml
修改hbase.rootdir,指定HBase数据在HDFS上的存储路径;将属性hbase.cluter.distributed设置为true。假设当前Hadoop集群运行在伪分布式模式下,在本机上运行,且NameNode运行在9000端口。
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
</configuration>
注意:修改环境配置文件可能打开是只读文件,需要加上sudo
ssh localhost
cd /usr/local/hadoop
./sbin/start-dfs.sh
ssh登录开始报错。。。
不知启动是否成功
jps
试试。
很明显失败了,节点完全没启动。
报错:localhost: usrp@localhost: Permission denied (publickey,password).
回到登录ssh那一步,可能是免密登录的问题
无法启动hadoop,得用hadoop用户运行,重启进入hadoop用户
在hadoop上快速配置一下hbase
运行一下单机模式
运行一下伪分布式,运行成功!!!
所以,第一次运行失败问题并不出于localhost,而是hadoop启动的root不是对应用户。
第二步:切换目录至/usr/local/hbase;再启动HBase.
进入shell界面,然后退出,停止HBase运行
bin/hbase shell
exit
bin/stop-hbase.sh
HBase中用create命令创建表
(启动hbase,进入shell先)
create 'student','Sname','Ssex','Sage','Sdept','course'
describe 'student'
1.2.1 添加数据
put 键,值
1.2.2 查找数据
get 表名,行名
scan 表名
1.2.3 删除数据
delete 表名,行,列 //删除具体行列中的数据
deleteall 表名,行 //删除整个行的数据
*删除数学列的内容
1.2.4 删除表
disable 'student'
drop 'student'
1、在创建表的时候,指定保存的版本数(假设指定为5)
2、插入数据然后更新数据,使其产生历史版本数据,注意:这里插入数据和更新数据都是用put命令
3、查询时,指定查询的历史版本数。默认会查询出最新的数据。(有效取值为1到5)
先装个eclipse,类似安装hbase的步骤,但是不用重命名下载过的安装包,不用修改环境变量,然后再桌面加个快捷方式
到/usr/local/eclipse目录下 ./eclipse
启动软件
新建一个java项目
导入lib
/usr/local/hbase/lib下所有的jar包
/usr/local/hbase/lib/client-facing-thirdparty下所有的jar包
新建类,输入代码
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 ExampleForHBase {
public static Configuration configuration;
public static Connection connection;
public static Admin admin;
public static void main(String[] args)throws IOException{
init();
createTable("student",new String[]{"score"});
insertData("student","zhangsan","score","English","69");
insertData("student","zhangsan","score","Math","86");
insertData("student","zhangsan","score","Computer","77");
getData("student", "zhangsan", "score","English");
close();
}
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();
}
}
public static void createTable(String myTableName,String[] colFamily) throws IOException {
TableName tableName = TableName.valueOf(myTableName);
if(admin.tableExists(tableName)){
System.out.println("talbe is exists!");
}else {
TableDescriptorBuilder tableDescriptor = TableDescriptorBuilder.newBuilder(tableName);
for(String str:colFamily){
ColumnFamilyDescriptor family =
ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(str)).build();
tableDescriptor.setColumnFamily(family);
}
admin.createTable(tableDescriptor.build());
}
}
public static void insertData(String tableName,String rowKey,String colFamily,String col,String val) throws IOException {
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();
}
public static void getData(String tableName,String rowKey,String colFamily, String col)throws IOException{
Table table = connection.getTable(TableName.valueOf(tableName));
Get get = new Get(rowKey.getBytes());
get.addColumn(colFamily.getBytes(),col.getBytes());
Result result = table.get(get);
System.out.println(new String(result.getValue(colFamily.getBytes(),col==null?null:col.getBytes())));
table.close();
}
}
启动HDFS和HBase,run as java application
程序运行成功以后,会在运行结果中出现“69”
到HBase Shell交互式环境中,使用如下命令查看student表是否创建成功:
查看student表中的数据