Hive之配置和使用LZO压缩

2024-04-15 14:48
文章标签 配置 使用 压缩 hive lzo

本文主要是介绍Hive之配置和使用LZO压缩,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

  • OS:CentOS 7

  • Hive:2.3.0

  • Hadoop:2.7.7

  • MySQL Server:5.7.10

  • Hive官方手册:LanguageManual LZO

  • 在配置Hive使用lzo压缩功能之前,需要保证Hadoop集群中lzo依赖库的正确安装,以及hadoop-lzo依赖的正确配置,可以参考:Hadoop配置lzo压缩

  • 温馨提示:Hive自定义组件打包时,不要同时打包依赖,避免各种版本冲突,只将额外的依赖添加到classpath中即可


配置过程

一、配置Hadoop集群

  • core-site.xml文件的io.compression.codecs参数中添加lzo、lzop压缩对应的编解码器类,并配置io.compression.codec.lzo.class参数,具体如下所示:
    <!-- 声明可用的压缩算法的编/解码器 --><property><name>io.compression.codecs</name><value>org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.DeflateCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.SnappyCodec,org.apache.hadoop.io.compress.Lz4Codec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec</value><description>A comma-separated list of the compression codec classes that canbe used for compression/decompression. In addition to any classes specifiedwith this property (which take precedence), codec classes on the classpathare discovered using a Java ServiceLoader.</description></property><!-- 配置lzo编解码器相关参数 --><property><name>io.compression.codec.lzo.class</name><value>com.hadoop.compression.lzo.LzoCodec</value></property>
  • mapred-site.xml文件中配置如下参数,设置MR Job执行时使用的压缩方式:
    <!-- map输出是否压缩 --><!-- 默认值:false --><property><name>mapreduce.map.output.compress</name><value>true</value><description>Should the outputs of the maps be compressed before beingsent across the network. Uses SequenceFile compression.</description></property><!-- 设置map输出压缩所使用的对应压缩算法的编解码器,此处设置为LzoCodec,生成的文件后缀为.lzo_deflate --><!-- 默认值:org.apache.hadoop.io.compress.DefaultCodec --><property><name>mapreduce.map.output.compress.codec</name><value>com.hadoop.compression.lzo.LzoCodec</value><description>If the map outputs are compressed, how should they be compressed?</description></property><!-- 设置MR job最终输出文件是否压缩 --><!-- 默认值:false --><property><name>mapreduce.output.fileoutputformat.compress</name><value>true</value><description>Should the job outputs be compressed?</description></property><!-- 设置MR job最终输出文件所使用的压缩算法对应的编解码器,此处设置为LzoCodec,生成的文件后缀为.lzo_deflate --><!-- 默认值:org.apache.hadoop.io.compress.DefaultCodec --><property><name>mapreduce.output.fileoutputformat.compress.codec</name><value>com.hadoop.compression.lzo.LzoCodec</value><description>If the job outputs are compressed, how should they be compressed?</description></property><!-- 设置序列文件的压缩格式 --><!-- 默认值:RECORD --><property><name>mapreduce.output.fileoutputformat.compress.type</name><value>BLOCK</value><description>If the job outputs are to compressed as SequenceFiles, how shouldthey be compressed? Should be one of NONE, RECORD or BLOCK.</description></property>

二、配置Hive

$HIVE_HOME/conf/hive-site.xml文件中设置如下参数,使得Hive进行查询时使用压缩功能,具体使用的压缩算法默认与Hadoop中的配置相同,当然也有相应的参数可以进行覆盖:

    <!-- 设置hive语句执行输出文件是否开启压缩,具体的压缩算法和压缩格式取决于hadoop中设置的相关参数 --><!-- 默认值:false --><property><name>hive.exec.compress.output</name><value>true</value><description>This controls whether the final outputs of a query (to a local/HDFS file or a Hive table) is compressed. The compression codec and other options are determined from Hadoop config variables mapred.output.compress*</description></property><!-- 控制多个MR Job的中间结果文件是否启用压缩,具体的压缩算法和压缩格式取决于hadoop中设置的相关参数 --><!-- 默认值:false --><property><name>hive.exec.compress.intermediate</name><value>true</value><description>This controls whether intermediate files produced by Hive between multiple map-reduce jobs are compressed. The compression codec and other options are determined from Hadoop config variables mapred.output.compress*</description></property>

三、建立支持lzo压缩数据读取和写入的Hive表

  • 示例:
CREATE TABLE tmp like emp
STORED AS
INPUTFORMAT "com.hadoop.mapred.DeprecatedLzoTextInputFormat"
OUTPUTFORMAT "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat";
  • 注意1:当前版本(2.3.0)的Hive只支持使用旧版本MR框架(com.hadoop.mapred)的API,使用的InputFormat必须实现org.apache.hadoop.mapred.InputFormat接口
  • 注意2:当前版本(2.3.0)的Hive中要想使用lzo压缩,需要将表数据读取时使用的InputFormat设置为com.hadoop.mapred.DeprecatedLzoTextInputFormat,此工具类在hadoop-lzo的jar包中(如:hadoop-lzo-0.4.20.jar)。只有使用LzoTextInputFormat才能避免将lzo索引文件识别成数据文件,又因为Hive支持支旧版本API,因此必须使用示例中的DeprecatedLzoTextInputFormat才能使用lzo的分片功能。
  • 注意3:使用DeprecatedLzoTextInputFormat只能识别后缀为.lzo的lzo压缩文件,无法识别后缀为.lzo_deflate的lzo压缩文件。前者是使用编解码器LzopCodec生成的,后者是使用LzoCodec生成的,.lzo压缩文件能够创建索引,而.lzo_deflate压缩文件无法创建索引,只有建立了lzo索引才能使用lzo分片功能。

PS:可以通过以下命令,来修改表的InputFormat/Outputformat/SerDe

-- 可以通过以下命令,修改表数据的读取/写入/序列化和反序列化方式
ALTER TABLE tmp
SET FILEFORMAT
INPUTFORMAT "com.hadoop.mapred.DeprecatedLzoTextInputFormat"
OUTPUTFORMAT "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat" -- Hive默认Outputformat
SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'; -- Hive默认SERDE

四、导入lzo压缩文件,并对.lzo压缩文件建立lzo索引

  • 导入表数据文件(.lzo压缩文件)
LOAD DATA INPATH '/tmp/data/output/emp/000000_0.lzo' OVERWRITE INTO TABLE tmp;
  • 为.lzo压缩文件建立lzo索引,便于读取时能够进行切割分片,否则只能将整个文件作为单个分片。示例命令如下,使用的是hadoop-lzo依赖中的工具类来为lzo压缩文件创建索引,索引文件与压缩文件在同一路径下,后缀名为.lzo.index
hadoop jar \
/opt/module/hadoop-2.7.7/share/hadoop/common/hadoop-lzo-0.4.21-SNAPSHOT.jar \
com.hadoop.compression.lzo.DistributedLzoIndexer \
/user/hive/warehouse/test.db/tmp/000000_0.lzo
  • 查看索引是否建立成功
[tomandersen@hadoop101 libs]$ hadoop fs -ls /user/hive/warehouse/test.db/tmp/;
Found 2 items
-rwxr-xr-x   1 tomandersen supergroup        515 2020-06-19 17:43 /user/hive/warehouse/test.db/tmp/000000_0.lzo
-rw-r--r--   1 tomandersen supergroup          8 2020-06-21 21:53 /user/hive/warehouse/test.db/tmp/000000_0.lzo.index

五、查询表数据,验证能够正常读取

  • 设置InputFormatDeprecatedLzoTextInputFormat,不再将lzo索引文件视为数据文件,读取结果正常
0: jdbc:hive2://hadoop101:10000/default (test)> select * from test.tmp;
+------------+------------+----------+------------+----------+---------------+----------+-----------+-------------+
| tmp.empno  | tmp.ename  | tmp.sex  |  tmp.job   | tmp.mgr  | tmp.hiredate  | tmp.sal  | tmp.comm  | tmp.deptno  |
+------------+------------+----------+------------+----------+---------------+----------+-----------+-------------+
| 7369       | SMITH      | male     | CLERK      | 7902     | 1980-12-17    | 800.0    | NULL      | 20          |
| 7499       | ALLEN      | male     | SALESMAN   | 7698     | 1981-2-20     | 1600.0   | 300.0     | 30          |
| 7521       | WARD       | female   | SALESMAN   | 7698     | 1981-2-22     | 1250.0   | 500.0     | 30          |
| 7566       | JONES      | male     | MANAGER    | 7839     | 1981-4-2      | 2975.0   | NULL      | 20          |
| 7654       | MARTIN     | female   | SALESMAN   | 7698     | 1981-9-28     | 1250.0   | 1400.0    | 30          |
| 7698       | BLAKE      | male     | MANAGER    | 7839     | 1981-5-1      | 2850.0   | NULL      | 30          |
| 7782       | CLARK      | male     | MANAGER    | 7839     | 1981-6-9      | 2450.0   | NULL      | 10          |
| 7788       | SCOTT      | male     | ANALYST    | 7566     | 1987-4-19     | 3000.0   | NULL      | 20          |
| 7839       | KING       | female   | PRESIDENT  | NULL     | 1981-11-17    | 5000.0   | NULL      | 10          |
| 7844       | TURNER     | female   | SALESMAN   | 7698     | 1981-9-8      | 1500.0   | 0.0       | 30          |
| 7876       | ADAMS      | male     | CLERK      | 7788     | 1987-5-23     | 1100.0   | NULL      | 20          |
| 7900       | JAMES      | male     | CLERK      | 7698     | 1981-12-3     | 950.0    | NULL      | 30          |
| 7902       | FORD       | male     | ANALYST    | 7566     | 1981-12-3     | 3000.0   | NULL      | 20          |
| 7934       | MILLER     | female   | CLERK      | 7782     | 1982-1-23     | 1300.0   | NULL      | 10          |
+------------+------------+----------+------------+----------+---------------+----------+-----------+-------------+
14 rows selected (0.244 seconds)
  • 未设置InputFormatDeprecatedLzoTextInputFormat,会将lzo索引文件视为数据文件进行读取,查询结果会多出一行NULL值
0: jdbc:hive2://hadoop101:10000/default (test)> select * from test.tmp;
+------------+------------+----------+------------+----------+---------------+----------+-----------+-------------+
| tmp.empno  | tmp.ename  | tmp.sex  |  tmp.job   | tmp.mgr  | tmp.hiredate  | tmp.sal  | tmp.comm  | tmp.deptno  |
+------------+------------+----------+------------+----------+---------------+----------+-----------+-------------+
| 7369       | SMITH      | male     | CLERK      | 7902     | 1980-12-17    | 800.0    | NULL      | 20          |
| 7499       | ALLEN      | male     | SALESMAN   | 7698     | 1981-2-20     | 1600.0   | 300.0     | 30          |
| 7521       | WARD       | female   | SALESMAN   | 7698     | 1981-2-22     | 1250.0   | 500.0     | 30          |
| 7566       | JONES      | male     | MANAGER    | 7839     | 1981-4-2      | 2975.0   | NULL      | 20          |
| 7654       | MARTIN     | female   | SALESMAN   | 7698     | 1981-9-28     | 1250.0   | 1400.0    | 30          |
| 7698       | BLAKE      | male     | MANAGER    | 7839     | 1981-5-1      | 2850.0   | NULL      | 30          |
| 7782       | CLARK      | male     | MANAGER    | 7839     | 1981-6-9      | 2450.0   | NULL      | 10          |
| 7788       | SCOTT      | male     | ANALYST    | 7566     | 1987-4-19     | 3000.0   | NULL      | 20          |
| 7839       | KING       | female   | PRESIDENT  | NULL     | 1981-11-17    | 5000.0   | NULL      | 10          |
| 7844       | TURNER     | female   | SALESMAN   | 7698     | 1981-9-8      | 1500.0   | 0.0       | 30          |
| 7876       | ADAMS      | male     | CLERK      | 7788     | 1987-5-23     | 1100.0   | NULL      | 20          |
| 7900       | JAMES      | male     | CLERK      | 7698     | 1981-12-3     | 950.0    | NULL      | 30          |
| 7902       | FORD       | male     | ANALYST    | 7566     | 1981-12-3     | 3000.0   | NULL      | 20          |
| 7934       | MILLER     | female   | CLERK      | 7782     | 1982-1-23     | 1300.0   | NULL      | 10          |
| NULL       | NULL       | NULL     | NULL       | NULL     | NULL          | NULL     | NULL      | NULL        |
+------------+------------+----------+------------+----------+---------------+----------+-----------+-------------+
15 rows selected (0.229 seconds)

报错及解决方案

  • 报错一:Compression codec com.hadoop.compression.lzo.LzoCodec not found

解析:很显然这是一个差找不到指定类的Bug,而LzoCodec是hadoop-lzo依赖中的工具类,因此将对应的jar包添加到classpath中即可,解决方案多种多样

解决方案示例:在hive-env.sh配置文件中设置HIVE_AUX_JARS_PATH环境变量,将hadoop-lzo依赖jar包放入此变量所指路径(或者将此变量设置成hadoop-lzo.jar所在路径)。

  • 报错二:Error: java.io.IOException: java.io.EOFException: Premature EOF from inputStream

解析:通过查找网上的资料发现,导致这样的报错可能有多种原因,最常见的就是由于在hadoop中lzo的相关配置,与Hive中的表相关设置相冲突(具体原因未知)

解决方案示例:将mapred-site.xml文件中的mapreduce.output.fileoutputformat.compress.codec参数设置成除了com.hadoop.compression.lzo.LzopCodec意以外的其他值,如com.hadoop.compression.lzo.LzoCodec,即更换最终MR输出文件所使用的压缩算法编解码器为非LzopCodec的其他值


End~

这篇关于Hive之配置和使用LZO压缩的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/906113

相关文章

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传