mysql:关系型数据库 RDBMS
hive: 数据仓库 进行数据分析,没有实时性
hbase:基于文档的数据库 nosql not only sql
hive和hbase的区别:
hbase:数据库,不支持分析
hive:数据仓库,用作数据分析
hbase:基于hdfs的非关系型数据库,基于google的bigtable技术实现的。
实时性,低延迟,分布式、可伸缩、大数据存储。
数量级:十亿行 x 百万列 x 上千个版本
读未提交:
第一个会话修改的数据没有进行提交
另一个会话进行读取 =====> 读取的是修改后的数据
第一个会话进行回滚 =====> 回滚之后,没有修改
总结:hbase是基于hadoop的一个提供随机定位和实时读写的大表数据库
配置hbase本地模式:
=================================
1、tar开
tar -xzvf hbase-1.2.6.tar.gz -C /soft
2、创建符号链接
ln -s hbase-1.2.6 hbase
3、配置环境变量
sudo nano /etc/profile,添加
# hbase环境变量
export HBASE_HOME=/soft/hbase
export PATH=$PATH:$HBASE_HOME/bin
3.5、使环境变量生效:
source /etc/profile
4、hbase-env.sh
export JAVA_HOME=/soft/jdk
5、hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///home/centos/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/centos/hbase/zk</value>
</property>
</configuration>
6、启动hbase:
start-hbase.sh
7、打开hbase的webUI:
http://s101:16010
8、停止hbase进程:
stop-hbase.sh
配置hbase的完全分布式:
========================================================
1、修改hbase-site.xml
<configuration>
<!-- 开启hbase的集群模式 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 将hbase的工作目录放在hdfs中 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://mycluster/user/hbase</value>
</property>
<!-- zk的工作目录,指定搭建zk指定的工作目录 -->
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/centos/zk</value>
</property>
<!-- 指定zk客户端的地址 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>s102:2181,s103:2181,s104:2181</value>
</property>
</configuration>
2、编辑hbase-env.sh //配置hbase不使用内置zk
export HBASE_MANAGES_ZK=false
3、编辑conf/regionservers文件,修改为
s102
s103
s104
4、将hadoop配置文件夹下的core-site.xml和hdfs-site.xml
拷贝到hbase/conf文件夹
5、分发hbase符号链接以及hbase安装目录
xsync.sh /soft/hbase
xsync.sh /soft/hbase-1.2.6
hbase含有两个进程:
HMaster //master节点
HRegionServer //slave节点
启动hadoop生态圈各个组件的启动步骤:
======================================================
1、启动zk
第一种方式:zkServer.sh start
第二种方式:xzk.sh start
2、启动hadoop:
1)先启动zk
xzk.sh start
2)启动hadoop
start-all.sh = start-dfs.sh + start-yarn.sh
3、启动hive:
1)先启动zk
xzk.sh start
2)启动hadoop
start-all.sh = start-dfs.sh + start-yarn.sh
3)启动hive或hiveserver2
hive || hiveserver2
4、启动hbase:
1)先启动zk
xzk.sh start
2)启动hdfs
start-dfs.sh
3)启动hbase
start-hbase.sh
hbase的HA模式:
========================================
备份主节点(backup-masters)在hbase/conf文件夹下的backup-masters文件中
nano /soft/hbase/conf/backup-masters,添加
s105
hbase错误处理:
========================================
问题1:master节点挂掉,而regionserver节点还在启动
解决1-1:hbase-daemons.sh stop regionserver
解决1-2:编写脚本awk,使用kill -9 命令直接杀掉进程
kill -9 `jps | grep HRegionServer | awk '{print $1}'`
> /dev/null 2>&1 //输出重定向为空(输出,如错误信息,不打印)
0、切换到root权限
1、脚本编写/usr/local/bin/skill.sh
#!/bin/bash
kill -9 `jps | grep $1 | awk '{print $1}'` > /dev/null 2>&1
注意:脚本需要添加执行权限
2、将skill.sh脚本分发至其他主机
xsync.sh /usr/local/bin/skill.sh
3、在s101中编写/usr/local/bin/xkill.sh
#!/bin/bash
if [ $# -gt 1 ] ; then echo use only one param ; exit ; fi
if [ $# -lt 1 ] ; then echo use only one param ; exit ; fi
for (( i=101 ; i<=105 ; i++ )); do
tput setaf 2
echo ================ s$i $1 ================
tput setaf 9
ssh s$i skill.sh $1
done
注意:脚本需要添加执行权限
4、使用方法:
xkill.sh + PName
eg:
xkill.sh HRegionServer
awk:
awk '{print $1}' //以'\t'对每行进行切割,输出第一个数据
awk -F ',' '{print $1}' //将分隔符变为,
杀死进程:kill PID
eg: kill 10529
kill -9 PID //绝杀
查看进程方式:
1、netstat -anop | grep xxx //网络进程
2、jps //java进程
3、ps -Af | grep master //linux进程
start-hbase.sh = hbase-daemon.sh start master
+ hbase-daemons.sh start regionserver
+ hbase-daemons.sh start master-backup
hbase数据结构:
====================
hbase RDBMS
1、namespace database
2、table table
3、row row
4、col col
5、column family x
id name age
row1 1 tom 10
hbase中每行自带主键,称之为row id
hbase 客户端操作:
====================================
hbase shell //进入hbase客户端
hbase RDBMS
1、列出数据库 list_namespace show databases;
2、查看帮助 help 'command' help show;
3、创建数据库 create_namespace 'ns1' create database d1;
4、删除数据库 drop_namespace 'ns1' drop database d1;
5、创建表 create 'ns1:t1', 'f1', 'f2' create table n1(id int, name varchar(20))
6、列出表 list_namespace_tables 'ns1' show tables;
7、删除表 drop 'ns1:t1' drop table n1;
8、禁用表 disable 'ns1:t1' x
9、表描述 describe 'ns1:t1' desc n1;
10、添加数据 put 'ns1:t1','row1','f1:id','1' insert into n1 values(1,'tom');
11、查看数据 scan 'ns1:t1' select * from n1;
12、清空表 truncate 'ns1:t1' truncate n1;
HBase的API编程:
========================
注意:编程之前将hbase-site.xml\core-site.xml\hdfs-site.xml放置在项目中的resource目录下
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.2.6</version>
</dependency>
hbase中的数据格式:byte[]
/**
* 创建数据库
*/
@Test
public void createDB() throws Exception {
//初始化配置信息
//Configuration conf = new Configuration();
Configuration conf = HBaseConfiguration.create();
//入口点,创建连接
Connection conn = ConnectionFactory.createConnection(conf);
//得到集群管理员权限,可以对数据库和表进行增删改查
Admin admin = conn.getAdmin();
//通过构建器模式,创建NamespaceDescriptor实例,并设置库名ns2
NamespaceDescriptor nds = NamespaceDescriptor.create("ns2").build(); //NamespaceDecriptor nds = NamespaceDescriptor.create("ns2").build();
//通过管理员创建数据库
admin.createNamespace(nds);//admin.createNamespace(nds);
admin.close();
System.out.println("ok");
}
/**
* 创建表
*/
@Test
public void createTable() throws Exception {
//初始化配置信息
//Configuration conf = new Configuration();
Configuration conf = HBaseConfiguration.create();
//入口点,创建连接
Connection conn = ConnectionFactory.createConnection(conf);//Connection conn = ConnectionFactory.createConnection(conf);
//得到集群管理员权限,可以对数据库和表进行增删改查
Admin admin = conn.getAdmin(); //Admin admin = conn.getAdmin();
//初始化tablename对象
TableName tn = TableName.valueOf("ns2:t2"); //TableName tn = TableName.valueOf("ns2:t2");
//得到表描述符
HTableDescriptor table = new HTableDescriptor(tn); HtableDescriptor table = new HTableDesriptor(tn);
//得到列族的描述符
HColumnDescriptor cf = new HColumnDescriptor("f1"); HColumnDesciptor cf = new HColumnDescriptor("f1");
HColumnDescriptor cf2 = new HColumnDescriptor("f2");
//在表中添加列族
table.addFamily(cf);
table.addFamily(cf2);
//开始创建
admin.createTable(table); //admin.createTable(table);
admin.close();
System.out.println("ok");
}
/**
* 添加数据到指定表
*/
@Test
public void putData() throws Exception {
//初始化配置信息
//Configuration conf = new Configuration();
Configuration conf = HBaseConfiguration.create();
//入口点,创建连接
Connection conn = ConnectionFactory.createConnection(conf); //Connection conn = ConnectionFactory.createConnection(conf);
//通过getTable方法获取表的实例
Table table = conn.getTable(TableName.valueOf("ns2:t2")); //Table table = conn.getTable(TableName.valueOf("ns2:t2"));
//创建put实例
//hbase中任何值,都是以字节数组形式存在的
Put put = new Put(Bytes.toBytes("row1")); //Put = put = new Put(Bytes.toBytes("row1"));
//添加列数据
put.addColumn(Bytes.toBytes("f1"),Bytes.toBytes("name"),Bytes.toBytes("tom"));
//put.addColum(Bytes.toBytes("f1"),Bytes.toBytes("name"),Bytes.toBytes("tom"));
//创建数据
table.put(put); //table.put(put)
System.out.println("ok");
conn.close();//conn.coles();
}