最近一直在关注压缩这个问题,尤其是在hive上使用压缩。今天突然想到了,如果使用sqoop到数据到hive上的时候用压缩会怎么样呢?同时这个还涉及到我们的hadoop要能支持使用某一些压缩格式的。
#snappy安装
这次决定使用snappy这个压缩格式,但是我使用的hadoop-2.6.0-cdh5.7.0不是编译版的,在lib/native这个目录里是没有支持snappy的依赖包的,所以我们需要使用编译版本的hadoop,可是我又比较懒,就直接找了个编译了hadoop的小伙伴把他的native包拿过来了,结果发现里面还是么有支持snappy的依赖包,当时native里面是这样的:


hive实现lzo压缩 hive 压缩 snappy_Hadoop

我就在mapred-site.xml这个配置文件里面将mapreduce的输出改成使用snappy的压缩格式,然后去跑一个一遍wordcount的mapreduce结果给我报错了,说不支持snappy。没有办法,只能从网上下载snappy的压缩包snappy-1.1.1.tar.gz,然后解压到native里面,就可以支持snappy了。

#使用hive
好了,现在我就开始将mysql上的表导到hive上面。这次我要导的表是product_info这个表,它在ruozedata这个库里面。在使用sqoop的时候如果是直接导入导hive里面的话,我们可以直接同时创建一个hive表,但是在生产上我们一般不会使用这种方法的。所以我们先在hive上面创建一个同结构的表吧。
create table tab_name(…字段名和数据类型) row format delimited fields terminated by ‘\t’;

接着,我们开始使用sqoop来导数据,我们要使用到的参数有:

–connect 用来指定DB的url

–username DB的用户名

-P 使用隐式输入DB的密码

–table 指定这个数据库里面要导出的表名

–hive-database 指定要导入到hive中的哪个数据库

–hive-table 指定要导入的表名,我们没有使用到–create-hive-table这个参数来实时创建表了,我们是提前创建好表了

–hive-import 导入hive中而不是只导入HDFS上的开关

–compress 使用压缩的开关

–compression-codec 指定使用的compression-codec的类型,我这里使用的是org.apache.hadoop.io.compress.SnappyCodec,snappy压缩格式。

–fields-terminated-by '\t’指定分隔符

导完后我们可以去看下HDFS上的数据:

hive实现lzo压缩 hive 压缩 snappy_hive_02

用了4个task,产生了4个snappy的压缩文件包。