(一)环境:
hadoop | 2.8.1 |
hive | 1.2.2 |
core-site.xml 配置项
<property> <name>io.compression.codecs</name> <value>org.apache.hadoop.io.compress.GzipCodec, org.apache.hadoop.io.compress.DefaultCodec, org.apache.hadoop.io.compress.BZip2Codec, com.hadoop.compression.lzo.LzopCodec, com.hadoop.compression.lzo.LzoCodec </value> </property> <!-- lzop --> <property> <name>io.compression.codec.lzo.class</name> <value>com.hadoop.compression.lzo.LzopCodec</value> </property>
mapred-site.xml 配置项
<!--设置map中间结果使用 lzop 压缩--> <property> <name>mapreduce.map.output.compress</name> <value>true</value> </property> <property> <name>mapreduce.map.output.compress.codec</name> <value>com.hadoop.compression.lzo.LzopCodec</value> </property> <!--设置map/reduce 整个过程使用 lzop 压缩 --> <property> <name>mapreduce.output.fileoutputformat.compress</name> <value>true</value> </property> <!-- lzop --> <property> <name>mapreduce.output.fileoutputformat.compress.codec</name> <value>com.hadoop.compression.lzo.LzopCodec</value> </property>
(二)
1.hive建表sql
CREATE TABLE `lzo5`( `uuid` string) STORED AS INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
2.创建uuid.txt文件,放1行数据
uuid1
3.lzop创建lzo文件
lzop uuid.txt
4.hive load数据
load data inpath "/home/hadoop/uuid.txt.lzo" into table lzo5;
5.hive查询,查看结果是1(正确)
select count(1) from lzo5;
6.给hive表lzo5路径下的lzo文件,创建lzo索引
$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/share/hadoop/common/hadoop-lzo-0.mmon/hadoop-lzo-0.4.21-SNAPSHOT.jar com.hadoop.compression.lzo.DistributeddLzoIndexer hdfs://hd1:9000/user/hive/warehouse/lzo5
7.查看索引生成情况
hdfs dfs -ls hdfs://hd1:9000/user/hive/warehouse/lzo5
8.再次查询sql,查看结果是1(正确)
select count(1) from lzo5;
(三)如何知道lzo index是否生效?
创建一个lzo文件,比hdfs的block size略大一点,分别在无索引和有索引两种场景下测试,看map数
- 无索引的map数是1,因为lzo无索引不可split,
- 有索引的map数是lzo文件大小 / block size 个, 因为lzo + index后支持split