*启动错误,日志查看
1.hdfs日志,hadoop安装目录下的logs目录
2.zookeeper日志
当没有特殊指定zookeeper的日志输出目录的话,zookeeper的日志是在执行zkServer.sh start指令所在的文件夹里
zookeeper日志的名称是:zookeeper.out
3.hbase日志
hbase的日志在hbase安装目录下面有logs目录
*zookeeper
分布式系统协调工具,高可用协调工具
zookeeper上的数据存在于每一个server节点上,每一个节点上的zookeeper节点上保存的数据都是全量数据
zookeeper上保存数据的方式和文件系统保存数据一样
*hbase的数据模型
sql: 在sql的数据库中包含两种元素:即模式(比较强的表结构)和元组(数据记录)
nosql: 在nosql里面一般更强调元组而弱化模式,有些nosql中没有模式,有些nosql有比较弱的模式,比方说有表而没有明确的字段,或者有表有更为广义上的字段组
hbase是nosql的一种,它的设计和使用都是反模式的。它里面不是完全没有模式,它的模式分为三层
1.namespace 类似于mysql的database
2.table 类似于mysql的table
3.column cluster(COLUMN FAMILIES)(列簇) 可以把它认为是mysql里面一个表的多个字段按照某个条件分成多组
namespace的基本操作
create_namespace 'bd20'
list_namespace -- 展示hbase有多少个namespace
list_namespace_tables 'bd20' -- 展示bd20数据库下有多少个表
drop_namespace 'bd20'
table的基本操作
-- 创建表
create 'bd20:table_name','c1'
describe 'bd20:table_name'
-- 先失效,再删除表
disable 'bd20:'
drop 'bd20:tabltable_namee_name'
-- alter table 删除一个列簇
alter 'bd20:table1', NAME => 'c1', METHOD => 'delete'
-- alter table 新增一个列簇
alter 'bd20:table1',NAME=>'c2'
-- alter table 修改表的配置参数信息
create 'cms_link','primary_info','system_info'
mysql上所说的一条数据指的是一行数据
hbase中所说的一条数据指的是一行数据中的一个单元格
put 'cms_link','1','primary_info:category_id','19'
get 'cms_link','1'
scan 'cms_link'
*hbase的底层数据存储
hbase的底层数据是按照条来保存的,每一条数据在底层数据文件里面占据一个存储空间,每条数据的格式如下:
rowkey 列簇:列名称 timestamp(版本) 列值
1 primary_info:category_id 9433747838345 19
1 primary_info:title 9433747838345 JeeSite
。。。。
hbase的数据文件是把每条数据以kv的形式来存储的
rowkey+列簇:列名称+时间戳 ------》key
列值 ------》value
因为key上的大部分数据都是冗余的,凡是我们自己设计的key上的数据,尽可能的限定他们的长度
rowkey在设计时要设计的尽可能的短
列簇在设计上要尽可能的短:在尽可能表达列簇的内容意义的时候尽可能的短,一般只用一个字母i
列名称设计上要尽可能的短:要尽可能的表达列值的数据内容的意义,比方说姓名、年龄等:title\color\image
hbase中所有的数据存储都是有序的,首先按照rowkey,然后按照ColumnFamily,再然后column qualifier,最后是timestamp(降序)
*hbase的架构原理
hbase中的每一张表都是分布式存储的
hbase把一张表table划分成多个region,每个region可以散布在不同的regionserver上来对外提供服务。
hbase是根据行业划分region,也就是说hbase是根据rowkey来划分region的。
每个region都有自己的rowkey上下限,第一个region没下限,最后一个region没有上限,当一条记录需要保存在hbase中,hmaster会判断这条记录的rowkey应该分布在哪一个region上,然后转交给这个region所负责的regionserver来执行读写操作
hbase的region的大小会随着里面的数量的增加而增加,当一个region的体量超过256M时,这个region就会分裂(split),分裂的过程由hmaster主导,由hregionserver执行,在分裂的过程中,不对外提供读写服务。
hbase中如果在定义表时不对表进行预分区,那么整个hbase表就只有一个region。为了尽可能的避免分裂最好要对数据进行预分区
create 'stable1','i',SPLITS=>['100','200','300','400']
hbase根据rowkey查找一个表tableA数据的过程
根据root表来确定meta表的位置,root表存在于zookeeper中/hbase/meta-region-server
根据元数据定位tableA的位置,元数据保存在hbase的meta(hbase:meta)表中
定位tableA的位置,然后根据rowkey来确定要查找记录的准确region,根据region定位其所在regionserver,regionserver根据rowkey就检索数据文件中记录的位置从而获取数据。
Table (HBase table)
Region (Regions for the table)
Store (Store per ColumnFamily for each Region for the table)
MemStore (MemStore for each Store for each Region for the table)
StoreFile (StoreFiles for each Store for each Region for the table)
Block (Blocks within a StoreFile within a Store for each Region for the table)
/hbase
/<Table> (Tables in the cluster)
/<Region> (Regions for the table)
/<ColumnFamily> (ColumnFamilies for the Region for the table)
/<StoreFile> (StoreFiles for the ColumnFamily for the Regions for the table)
/hbase
/.logs
/<RegionServer> (RegionServers)
/<WAL> (WAL files for the RegionServer)
*hbase中数据的来源
1.来源自已有的数据文件(批量)
mapreduce
hive
spark
Bulk Loading
2.来源自业务系统不断增加的数据记录(增量)
java api
shell
其他语言+thrift服务
*hbase api操作
1.构建配置参数对象,使用HBaseConfiguration来创建
2.创建Connection对象,使用ConnectionFactory来创建
3.如果执行ddl操作的话需要Admin对象,通过Connection来获取
4.如果执行dml操作的话需要Table对象,通过Connection来获取
往hbase里插入数据,需要Put对象,一个Put对象代表一行数据(多个单元格)