Hbase
-
NoSQL not only sql 非关系型数据库
与sql对比优势:
-
数据激增,传统数据库分表分库难以维护
-
数据存在关系型数据库,不可切割,而nosql存储数据之间没有依赖的关系
-
nosql高并发读写,每秒万次读写请求。
-
横向扩展性,即增加硬件,提高性能。
-
灵活的数据模型
考虑之处:
- nosql没有强事务的要求,对于要求一致性的情况下,使用sql更为安全(事务的四大特征:ACID 原子性 一致性 隔离性 持久性)
-
-
cap理论(分布式系统最多支持三个中两个)
- Consistency 一致性
- Availability 可用性
- Partition tolerance 分区容错性
支持CA 传统的数据库 支持CP 比如 Hbase 支持AP的比如
-
BASE原则(基于cap演化)
- basically avilble 基本可用 即 允许部分分区失效
- soft-state 软状态 即 允许一段状态不佳
- eventual consistency 最终一致性 允许一段时间不同步但最终一致
-
hbase 是强一致性数据库 因为是借助hdfs底层来实现的
-
hbase 是通过apped-only追加数据,定期排序和合并操作,所以写入读取很快
-
nosql分类
- 键值存储:redis,MemcacheDB 缓存型数据库
- 列存储: Cassandra HBase 应对分布式存储的海量数据
- 文档型存储:MangoDB web应用
- 图数据库: 社交网络
-
存储结构
-
region 相当于block 包含多个存储区,每个存储去对应一个列族
-
regionserver 相当于datanode,实际上表的片段,保存多个region
-
Hmaster 监控regionserver 管理分配region,regionserver的负载均衡,region失效的处理
-
列族加列修饰符等于列键,行键加列键可以确定一个值。默认搜索的是最新时间戳的值。
-
hbase导入jar包
方式一:
打包胖jar:生成jar包---------》ide左上角project stucture------------》artifacts----------->添加 ±---------》----------from-------------------》build
找到本地文件out中的jar 然后上传到liux
java -cp hbase-java.jar cn.kgc.HBaseJavaAPI 当环境不同时采用这种胖jar,后面是java的主类。
方式二:
直接打包jar----------》上传到本地------------》输入命令
java -cp hbase-java-1.0-SNAPSHOT.jar:/root/software/hbase/lib/* cn.kgc.HBaseJavaAPI 在jar包位置执行
-
增删改查数据
-
create ‘mm’,‘mydemo’,‘base’ 创建名空间
-
create ‘mydemo’,‘base’ 两个不同的创建表
-
put ‘mydemo’,‘001’,‘base:name’,‘value-jackson’
put ‘mydemo’,‘001’,‘base:birthday’,‘1999-9-9’
put ‘mydemo’,‘001’,‘base:birthday’,‘1989-8-8’
-
delete ‘mydemo’,‘001’,‘base:name’ 删除相当于单元格
-
get ‘mydemo’,‘row_key’,{COLUMN => ‘base’} get方法,可以是列族和可以是列键
-
get ‘mydemo’,‘row_key’,{COLUMN => ‘base’:name}
-
alter ‘mydemo’,{NAME => ‘adv’}
-
put ‘mydemo’,‘001’,‘adv:likes’,‘football’ 添加在值
-
scan ‘mydemo’ 查看所有表数据
-
get ‘mydemo’,‘001’,{COLUMN => [‘base:name’,‘adv:likes’]} 查看多列内容
-
desc ‘mydemo’ 查看描述信息
-
alter ‘mydemo’,{NAME => ‘base’,VERSIONS =>3} 更改列族版本
-
get ‘mydemo’,‘001’,{COLUMN =>‘base:name’,VERSIONS =>4} 查看版本 当versions版本数大于列的值,则全部显示,否则就显示最新的相应数量的值。
-
get ‘mydemo’,‘001’,{FILTER => “ValueFilter(=,‘binary:Jone’)”} 条件查看指定位置的数据
-
scan ‘mydemo’,FILTER => “ValueFilter(=,‘substring:19’)” 条件查看全表 filter过滤
-
hive和hbase导入数据
-
hive在建表时导入hbase中的表
create external table hb_mydemo(
pk string,
likes string,
birthday string,
name string)
stored by ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’ with serdeproperties(‘hbase.columns.mapping’=’:key,adv:likes,base:birthday,base:name’) tblproperties (‘hbase.table.name’=‘mydemo’);小结:hbase中可以看作比hive中多一列数据,因为hbase中的行键单独算hive中的一列。
试验:在hive和hbase分别插入数据
结果:hive导入数据,hbase几乎实时看到,但是hbase导入,hive无法看到。
-
mysql----->hdfs mysql------->hive mysql-------> hbase (mysql可以看作RDBM:关系型数据库)
准备:下载配置sqoop
下载地址:http://archive.cloudra.com/cdh5/cdh/5/sqoop-1.4.6-cdh5.5.0/
配置环境变量
修改配置文件sqoop/conf/sqoop-env.sh 先cp
export HADOOP_COMMON_HOME=
export HADOOP_MAPRED_HOME=
export HIVE_HOME=
export HBASE_HOME=
拷贝mysql驱动: 分别是json.jar 和mysql的驱动包
验证:sqoop-version
-
#####通过sqoop 从mysql导入数据到hdfs
#####msql导入数据—>启动hadoop----->创建脚本------>运行脚本
!/bin/bash
sqoop import
–connect jdbc:mysql://localhost:3306/data
–table customers
–username root
–password root
–target-dir /data/retail_db/zj \–m 3
注:data为mysql的数据库,customers为mysql的表。 zj为hdfs不存在的文件夹 每一行的空格+\是为了输出美观。m 3是指设置map的数量为3
-
条件导入 即过滤导入
sqoop import
–connect jdbc:mysql://localhost:3306/data
–query “select * from customers where 1=1 and $CONDITIONS” \ 或者直接where ‘customer_id<100’ 还可以通过columns指定列来过滤导入表 columns “host,name,age”
–username root
–password root
–split-by customer_city
–target-dir /data/retail_db/mm
–m 3注:where后面为可选条件不可忽略 $CONDITIONS是必选的 split-by 指定分割字段为customer_city
-
条件追加
sqoop import
–connect jdbc:mysql://localhost:3306/data
–table customers
–username root
–password root
–where ‘customer_id<100’
–incremental append
–check-column customer_id
–last-value 10
–target-dir /data/retail_db/tohot
–m 3注:append追加数据已经存在的hdfs的数据集,check-column指定递增的列,last-value是指上一次导入的最大值
-
通过sqoop从mysq导入数据到hive
sqoop import
–connect jdbc:mysql://localhost:3306/data
–table customers
–username root
–password root
–hive-import
–create-hive-table
–hive-table customers \注:create-hive-table 指定创建一个新的hive表格,如果表已经存在则报错。这边不指定输入的数据库如:-hive-database retail_db 则会创建到default数据库中。
另外:在使用导入到hive版本2.3.5的过程中还出现错误解决方法如下:
发生文件路径存在则删除文件
出现Make sure HIVE_CONF_DIR is set correctly错误
在etc/profile 添加
export HADOOP_CLASSPATH=HADOOP_CLASSPATH:$HIVE_HOME/lib/*
export HIVE_CONF_DIR=//PATHNAME
出现access denied (“javax:management.MBeanTrustPermission”“register”)错误
将hive-site.xml 复制到sqoop/conf下
在jdk/jre/lib/security/java.policy下
grant {permission javax.management.MBeanTrustPermission “register”;};
出现…fasterxml/jackson/databind/ObjectReader 错误
先将sqoop/lib下的jackson*.jar移动到其他–自建一个–目录(万一要返回),然后将hive/lib包下的jackson.*拷贝到sqoop\lib下。
以上问题一一解决,直接脱坑
-
-
通过sqoop从mysq导入数据到hbase
!/bin/bash
sqoop import
–connect jdbc:mysql://localhost:3306/data
–username root
–password root
–table products
–hbase-table hbaseshow
–column-family product
–hbase-create-table
–hbase-row-key product_id注:table xxx指的是要导入的mysql中表名,在hbase中创建表,create ‘table_name’,‘column_familyname’ rowkey 任意一列