01.07 hbase压缩以及hive集成映射

一、压缩

三种阶段

1.在数据进入HDFS之前进行压缩

2.在MapRecduce的shuffle过程中:Map完成 Reduce开始阶段 数据在节点之间传输的时候进行压缩

3.数据处理完成存到HDFS之上的时候进行压缩

总的来说压缩的目的:

1.节省HDFS的存储空间,缓解存储压力

2.减少网络传输的数据,减轻网络传输负载

hadoop需要支持压缩

/opt/bigdata/hadoop-2.7.3/bin/hadoop checknative

hbase压缩以及hive集成映射

hadoop不支持解决办法:

解压native-2.7.3-snappy.tar.gz ,替换lib目录下的native

hbase压缩以及hive集成映射

Hadoop目录下

hbase压缩以及hive集成映射

删除native

hbase压缩以及hive集成映射

解压拷贝native-2.7.3-snappy.tar.gz

tar -zxvf /data/tools/native-2.7.3-snappy.tar.gz -C ./

hbase压缩以及hive集成映射

再检查是否支持

hbase压缩以及hive集成映射

HBase是否支持支持压缩

/opt/bigdata/hbase-1.2.1/bin/hbase org.apache.hadoop.util.NativeLibraryChecker

hbase压缩以及hive集成映射

步骤

软件名称:hadoop-snappy-0.0.1-SNAPSHOT.tar.gz

hbase压缩以及hive集成映射

1.解压

tar -zxvf hadoop-snappy-0.0.1-SNAPSHOT.tar.gz -C /opt/bigdata/hadoop-2.7.3/

hbase压缩以及hive集成映射

解压目录

hbase压缩以及hive集成映射

目录结构

hbase压缩以及hive集成映射

2.配置窗口环境变量

export HBASE_HOME=/opt/bigdata/hbase-1.2.1/

export HADOOP_SNAPPY_HOME=/opt/bigdata/hadoop-2.7.3/hadoop-snappy-0.0.1-SNAPSHOT

export HADOOP_HOME=/opt/bigdata/hadoop-2.7.3

hbase压缩以及hive集成映射

3.拷贝hadoop-snappy-0.0.1-SNAPSHOT.jar到$HBASE_HOME/lib

cp -r /opt/bigdata/hadoop-2.7.3/hadoop-snappy-0.0.1-SNAPSHOT/lib/hadoop-snappy-0.0.1-SNAPSHOT.jar /opt/bigdata/hbase-1.2.1/lib

hbase压缩以及hive集成映射

查看包是否拷贝

hbase压缩以及hive集成映射

4.创建native目录

mkdir $HBASE_HOME/lib/native

mkdir -p /opt/bigdata/hbase-1.2.1/lib/native

hbase压缩以及hive集成映射

5.设置软链接

ln -s $HADOOP_HOME/lib/native $HBASE_HOME/lib/native/Linux-amd64-64

hbase压缩以及hive集成映射

再次在${HBASE_HOME}验证是否支持压缩

hbase压缩以及hive集成映射

重启habse的进程,以使配置生效

/opt/bigdata/hbase-1.2.1/bin/stop-hbase.sh

/opt/bigdata/hbase-1.2.1/bin/start-hbase.sh

hbase压缩以及hive集成映射

进入hbase创建支持snappy压缩的表

bin/hbase shell

hbase压缩以及hive集成映射

描述表信息

desc 't1'

hbase压缩以及hive集成映射

更改表的信息 ,t1表是已经有数据的disable 't1'

alter 't1', NAME => 'f', COMPRESSION => 'snappy'

(也可以直接更改

alter 't1', NAME => 'f1, COMPRESSION => 'snappy'

enable 't1'

hbase压缩以及hive集成映射

查看信息

hbase压缩以及hive集成映射

做一个练习

创建表 通过{}设置变量值

create 'tsnappy1', { NAME => 'f'}

create 'tsnappy2', { NAME => 'f', COMPRESSION => 'snappy'}

插入相同的数据到两张表中:看下文件大小,文件小效果不是很明显,大数据效果会更明显

二、hive和hbase的集成

注意版本:Hive 1.x will remain compatible with HBase 0.98.x and lower versions. Hive 2.x will be compatible with HBase 1.x and higher

hbase压缩以及hive集成映射

如果版本不兼容,考虑编译hive的版本

apache-hive-1.2.1-src.tar.gz

我这里有一个编译好的

apache-hive-1.2.1-hbase.tar.gz

hbase压缩以及hive集成映射

解压缩

hbase压缩以及hive集成映射

进入目录

hive和hbase表之间进行关联,依赖hive-hbase-handler-1.2.1.jar

hbase压缩以及hive集成映射

替换hive_home 下lib里面的jar

rm -f hive-hbase-handler-1.2.1.jar

cp /data/tools/apache-hive-1.2.1-bin/lib/hive-hbase-handler-1.2.1.jar ./

hbase压缩以及hive集成映射

(1)基本了解:

hbase表数据映射到hive表中,数据存在hbase

hive表类型:管理表和外部表

管理表:在hive建表,同时hbase是不存在该表,hbase建相同的表,数据不是在hive,而是在hbase

外部表:在hive建表,同时hbase是存在该表,数据不是在hive,而是在hbase。

(2)框架之间的集成首先考虑的是:jar包和配置。

拷贝jar包到hive/lib下

hbase压缩以及hive集成映射

上传

hbase压缩以及hive集成映射

修改hive-site.xml文件

指定ZK的实例化地址,用于连接hbase集群,因为ZK是访问入口


hbase.zookeeper.quorum

masterhbase,masterslave1,masterslave2


hbase压缩以及hive集成映射

启动hive

hbase压缩以及hive集成映射

将hive的表映射到hbase

建表(内部表)

CREATE TABLE hbase_table_1(

key int,

name string

)

STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'

WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:name")

TBLPROPERTIES ("hbase.table.name" = "wzy", "hbase.mapred.output.outputtable" = "wzy");

(1)hbase.columns.mapping:这个属性必须要写的

(2)hbase.table.name:这个是映射到hbase表的名称,这个属性可选,如果不要,那么对应的hbase表名称就是hive

建表的名称hbase_table_1

(3)hbase.mapred.output.outputtable:这个可选,直接可以不要

hbase压缩以及hive集成映射

如果报错及解决办法

(1)报错:

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. org.apache.hadoop.hbase.HTableDescrip

tor.addFamily(Lorg/apache/hadoop/hbase/HColumnDescriptor;)V

hive和hbase版本之间不兼容

编译hive的版本支持hbase1.x

解压hive的tar包

修改仓库的路径

hbase压缩以及hive集成映射

添加hbase的jar

(2)报错:

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:For direct Meta

Store DB connections, we don't support retries at the client level.)

修改mysql元数据的编码字符集:alter database metastore2 character set latin1;

mysql驱动jar导入hive的lib目录。

在hbase查看下,表存在了

hbase压缩以及hive集成映射

可以查看表信息

hbase压缩以及hive集成映射

将hbase中的表stu_info映射到hive

再查看一张表

hbase压缩以及hive集成映射

CREATE EXTERNAL TABLE stu_info(

uuid int,

name string,

age string,

sex string,

job string,

xueli string

)

STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'

WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:name,info:age,info:sex,work:job,degree:xueli")

TBLPROPERTIES("hbase.table.name" = "stu_info");

hbase压缩以及hive集成映射

查询下

select * from stu_info;

hbase压缩以及hive集成映射

在hive中去加载映射表数据:load是不行的,必须使用要跑mr的。比如:inser into 子查询的方式

比如建一张表:

create table dept(

deptno int comment '部门编号',

dname string comment '部门名称',

loc string comment '地址'

)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\t'

hbase压缩以及hive集成映射

载入数据

load data local inpath '/data/dept.txt' into table dept;

hbase压缩以及hive集成映射

插入数据

INSERT OVERWRITE TABLE hbase_table_1 SELECT deptno,dname from dept;

hbase压缩以及hive集成映射

select * from hbase_table_1;

hbase压缩以及hive集成映射

scan "wzy"

hbase压缩以及hive集成映射

在hbase中添加数据

put 'wzy','6','info:name','flume'

hbase压缩以及hive集成映射

Scan下

hbase压缩以及hive集成映射

Hive查看下

hbase压缩以及hive集成映射

所以

在hive表添加数据,hbase可直接更新数据

在hive表添加数据,hbase可直接更新数据

可以看下50070的hive页面,然后在看50070的hbase

在hive中没有数据

hbase压缩以及hive集成映射

在hbase中也没有

hbase压缩以及hive集成映射

hbase需要flush下,手动刷新

flush 'wzy'

hbase压缩以及hive集成映射

Hbase上有了

hbase压缩以及hive集成映射

但hive上也没有

hbase压缩以及hive集成映射

将hbase已经存在的表映射到hive:

想要映射hbase中已经存在的表:那么在hive中必须要是使用外部表属性EXTERNAL

CREATE EXTERNAL TABLE hbase_table_2(

uuid int,

username string

)

STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'

WITH SERDEPROPERTIES ("hbase.columns.mapping" = "info:name")

TBLPROPERTIES("hbase.table.name" = "wzy");

hbase压缩以及hive集成映射

查看下

hbase压缩以及hive集成映射

针对于映射hbase外部表(可以练习下):

在hive重新修改数据到外部表,hbase数据没有做更新

在hbase重新修改数据,hive是有变化的

补充一点:key可加可不加

CREATE EXTERNAL TABLE hbase_table_3(

uuid int,

username string

)

STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'

WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:name")

TBLPROPERTIES("hbase.table.name" = "wzy");

hbase压缩以及hive集成映射

内部表和外部表的区别:

内部表:删除表,对应的源数据文件就会被删除

外部表:删除表,对应的源数据文件不会被删除

drop删除hbase_table_3时,数据还在hbase

drop删除hbase_table_1时,数据就会被删除,wzy就没有了。

在hbase和hive进行集成的时候要注意

如果hbase正在实时的往里面灌数据,这时候使用hive去分析的话,准确性会下降。


分享到:


相關文章: