Hadoop源码编译支持Snappy压缩
-
资源准备
- CentOS联网:
配置CentOS能连接外网。Linux虚拟机ping www.baidu.com 是畅通的
注意:采用root角色编译,减少文件夹权限出现问题 - jar包准备(hadoop源码、JDK8 、maven、protobuf)
hadoop-2.7.2-src.tar.gz
jdk-8u144-linux-x64.tar.gz
snappy-1.1.3.tar.gz
apache-maven-3.0.5-bin.tar.gz
protobuf-2.5.0.tar.gz
- CentOS联网:
-
jar包安装(注意:所有操作必须在root用户下完成)
- JDK解压、配置环境变量JAVA_HOME和PATH,验证java-version(如下都需要验证是否配置成功);
- Maven解压、配置 MAVEN_HOME和PATH,验证命令:mvn -version;
-
编译源码
- 准备编译环境:
[root@hadoop101 software]# yum install svn [root@hadoop101 software]# yum install autoconf automake libtool cmake [root@hadoop101 software]# yum install ncurses-devel [root@hadoop101 software]# yum install openssl-devel [root@hadoop101 software]# yum install gcc*
- 编译安装snappy
[root@hadoop101 software]# tar -zxvf snappy-1.1.3.tar.gz -C /opt/module/ [root@hadoop101 module]# cd snappy-1.1.3/ [root@hadoop101 snappy-1.1.3]# ./configure [root@hadoop101 snappy-1.1.3]# make [root@hadoop101 snappy-1.1.3]# make install # 查看snappy库文件 [root@hadoop101 snappy-1.1.3]# ls -lh /usr/local/lib |grep snappy
-
编译安装protobuf
[root@hadoop101 software]# tar -zxvf protobuf-2.5.0.tar.gz -C /opt/module/ [root@hadoop101 module]# cd protobuf-2.5.0/ [root@hadoop101 protobuf-2.5.0]# ./configure [root@hadoop101 protobuf-2.5.0]# make [root@hadoop101 protobuf-2.5.0]# make install # 查看protobuf版本以测试是否安装成功 [root@hadoop101 protobuf-2.5.0]# protoc --version
-
编译hadoop native
[root@hadoop101 software]# tar -zxvf hadoop-2.7.2-src.tar.gz [root@hadoop101 software]# cd hadoop-2.7.2-src/ [root@hadoop101 software]# mvn clean package -DskipTests -Pdist,native -Dtar -Dsnappy.lib=/usr/local/lib -Dbundle.snappy
执行成功后,/opt/software/hadoop-2.7.2-src/hadoop-dist/target/hadoop-2.7.2.tar.gz即为新生成的支持snappy压缩的二进制安装包
Hadoop压缩配置
-
开启Map输出阶段压缩:
开启map输出阶段压缩可以减少job中map和Reduce task间数据传输量。具体配置如下
案例实操:- 开启hive中间传输数据压缩功能
hive (default)>set hive.exec.compress.intermediate=true;
- 开启mapreduce中map输出压缩功能
hive (default)>set mapreduce.map.output.compress=true;
- 设置mapreduce中map输出数据的压缩方式
hive (default)>set mapreduce.map.output.compress.codec= org.apache.hadoop.io.compress.SnappyCodec;
- 执行查询语句
hive (default)> select count(ename) name from emp;
- 开启hive中间传输数据压缩功能
-
开启Reduce输出阶段压缩
当Hive将输出写入到表中时,输出内容同样可以进行压缩。属性hive.exec.compress.output控制着这个功能。用户可能需要保持默认设置文件中的默认值false,这样默认的输出就是非压缩的纯文本文件了。用户可以通过在查询语句或执行脚本中设置这个值为true,来开启输出结果压缩功能;
案例实操:- 开启hive最终输出数据压缩功能
hive (default)>set hive.exec.compress.output=true;
- 开启mapreduce最终输出数据压缩
hive (default)>set mapreduce.output.fileoutputformat.compress=true;
- 设置mapreduce最终数据输出压缩方式
hive (default)> set mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.SnappyCodec;
- 设置mapreduce最终数据输出压缩为块压缩
hive (default)> set mapreduce.output.fileoutputformat.compress.type=BLOCK;
- 测试一下输出结果是否是压缩文件
hive (default)> insert overwrite local directory '/opt/module/datas/distribute-result' select * from emp distribute by deptno sort by empno desc;
- 开启hive最终输出数据压缩功能
-
文件存储格式
Hive支持的存储数的格式主要有:TEXTFILE 、SEQUENCEFILE、ORC、PARQUET- 行存储的特点查询满足条件的一整行数据的时候,列存储则需要去每个聚集的字段找到对应的每个列的值,行存储只需要找到其中一个值,其余的值都在相邻地方,所以此时行存储查询的速度更快;
- 列存储的特点因为每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量;每个字段的数据类型一定是相同的,列式存储可以针对性的设计更好的设计压缩算法;
- TEXTFILE和SEQUENCEFILE的存储格式都是基于行存储的;
- ORC和PARQUET是基于列式存储的;
- TextFile格式:
默认格式,数据不做压缩,磁盘开销大,数据解析开销大。可结合Gzip、Bzip2使用,但使用Gzip这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作。 - Orc格式:
Orc (Optimized Row Columnar)是Hive 0.11版里引入的新的存储格式: - Parquet格式:
Parquet文件是以二进制方式存储的,所以是不可以直接读取的,文件中包括该文件的数据和元数据,因此Parquet格式文件是自解析的。通常情况下,在存储Parquet数据的时候会按照Block大小设置行组的大小,由于一般情况下每一个Mapper任务处理数据的最小单位是一个Block,这样可以把每一个行组由一个Mapper任务处理,增大任务执行并行度
-
存储和压缩结合
- 修改Hadoop集群具有Snappy压缩方式
- 查看hadoop checknative命令使用:
hadoop checknative [-a|-h] check native hadoop andcompression libraries availability
- 查看hadoop支持的压缩方式:
hadoop checknative
- 查看hadoop checknative命令使用:
- 将编译好的支持Snappy压缩的hadoop-2.7.2.tar.gz包导入到hadoop102的/opt/software中
- 解压hadoop-2.7.2.tar.gz到当前路径
- 进入到/opt/software/hadoop-2.7.2/lib/native路径可以看到支持Snappy压缩的动态链接库
- 拷贝/opt/software/hadoop-2.7.2/lib/native里面的所有内容到开发集群 的 /opt/module/hadoop-2.7.2/lib/native路径上:
- 分发native/
- 再次查看hadoop支持的压缩类型
- 小结:
在项目开发当中,hive表的数据存储格式一般选择:orc或parquet。压缩方式一般选择snappy,lzo
- 修改Hadoop集群具有Snappy压缩方式