Hbase基本理念和与RDBM之间的导入导出合集

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 任意一列

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值