一、压缩
三种阶段
1.在数据进入HDFS之前进行压缩
2.在MapRecduce的shuffle过程中:Map完成 Reduce开始阶段 数据在节点之间传输的时候进行压缩
3.数据处理完成存到HDFS之上的时候进行压缩
总的来说压缩的目的:
1.节省HDFS的存储空间,缓解存储压力
2.减少网络传输的数据,减轻网络传输负载
hadoop需要支持压缩
/opt/bigdata/hadoop-2.7.3/bin/hadoop checknative
hadoop不支持解决办法:
解压native-2.7.3-snappy.tar.gz ,替换lib目录下的native
Hadoop目录下
删除native
解压拷贝native-2.7.3-snappy.tar.gz
tar -zxvf /data/tools/native-2.7.3-snappy.tar.gz -C ./
再检查是否支持
HBase是否支持支持压缩
/opt/bigdata/hbase-1.2.1/bin/hbase org.apache.hadoop.util.NativeLibraryChecker
步骤
软件名称:hadoop-snappy-0.0.1-SNAPSHOT.tar.gz
1.解压
tar -zxvf hadoop-snappy-0.0.1-SNAPSHOT.tar.gz -C /opt/bigdata/hadoop-2.7.3/
解压目录
目录结构
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
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
查看包是否拷贝
4.创建native目录
mkdir $HBASE_HOME/lib/native
mkdir -p /opt/bigdata/hbase-1.2.1/lib/native
5.设置软链接
ln -s $HADOOP_HOME/lib/native $HBASE_HOME/lib/native/Linux-amd64-64
再次在${HBASE_HOME}验证是否支持压缩
重启habse的进程,以使配置生效
/opt/bigdata/hbase-1.2.1/bin/stop-hbase.sh
/opt/bigdata/hbase-1.2.1/bin/start-hbase.sh
进入hbase创建支持snappy压缩的表
bin/hbase shell
描述表信息
desc 't1'
更改表的信息 ,t1表是已经有数据的disable 't1'
alter 't1', NAME => 'f', COMPRESSION => 'snappy'
(也可以直接更改
alter 't1', NAME => 'f1, COMPRESSION => 'snappy'
)
enable 't1'
查看信息
做一个练习
创建表 通过{}设置变量值
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
如果版本不兼容,考虑编译hive的版本
apache-hive-1.2.1-src.tar.gz
我这里有一个编译好的
apache-hive-1.2.1-hbase.tar.gz
解压缩
进入目录
hive和hbase表之间进行关联,依赖hive-hbase-handler-1.2.1.jar
替换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 ./
(1)基本了解:
hbase表数据映射到hive表中,数据存在hbase
hive表类型:管理表和外部表
管理表:在hive建表,同时hbase是不存在该表,hbase建相同的表,数据不是在hive,而是在hbase
外部表:在hive建表,同时hbase是存在该表,数据不是在hive,而是在hbase。
(2)框架之间的集成首先考虑的是:jar包和配置。
拷贝jar包到hive/lib下
上传
修改hive-site.xml文件
指定ZK的实例化地址,用于连接hbase集群,因为ZK是访问入口
hbase.zookeeper.quorum
masterhbase,masterslave1,masterslave2
启动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:这个可选,直接可以不要
如果报错及解决办法
(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的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中的表stu_info映射到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");
查询下
select * from stu_info;
在hive中去加载映射表数据:load是不行的,必须使用要跑mr的。比如:inser into 子查询的方式
比如建一张表:
create table dept(
deptno int comment '部门编号',
dname string comment '部门名称',
loc string comment '地址'
)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\t'
载入数据
load data local inpath '/data/dept.txt' into table dept;
插入数据
INSERT OVERWRITE TABLE hbase_table_1 SELECT deptno,dname from dept;
select * from hbase_table_1;
scan "wzy"
在hbase中添加数据
put 'wzy','6','info:name','flume'
Scan下
Hive查看下
所以
在hive表添加数据,hbase可直接更新数据
在hive表添加数据,hbase可直接更新数据
可以看下50070的hive页面,然后在看50070的hbase
在hive中没有数据
在hbase中也没有
hbase需要flush下,手动刷新
flush 'wzy'
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数据没有做更新
在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");
内部表和外部表的区别:
内部表:删除表,对应的源数据文件就会被删除
外部表:删除表,对应的源数据文件不会被删除
drop删除hbase_table_3时,数据还在hbase
drop删除hbase_table_1时,数据就会被删除,wzy就没有了。
在hbase和hive进行集成的时候要注意
如果hbase正在实时的往里面灌数据,这时候使用hive去分析的话,准确性会下降。
閱讀更多 分享電腦學習 的文章