原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://shitouer.cn/2013/01/hadoop-hbase-snappy-setup-final-tutorial/

因为产品需要,这两天研究了一下Hadoop Snappy。先不说什么各个压缩算法之间的性能对比,单是这个安装过程,就很痛苦。网上有很多博友写Hadoop Snappy安装过程,大部分是照着Google的文档翻译了一遍,并没有列举出遇到的问题。有的博文,明明其验证提示是错误的,还说如果输出XXX,说明安装成功了。费了老大的劲,终于安装成功了,现将详细步骤及遇到的问题,一一列出,只希望接下来需要研究及安装的朋友,看到这篇博文,能够一气呵成!本篇文章主要包括:

1. Snappy 压缩算法介绍及集中压缩算法比较

2. Snappy 安装过程及验证

3. Hadoop Snappy 源码编译过程及问题解决方案

4. Hadoop上Hadoop Snappy 安装配置过程及验证

5. Hbase 配置Snappy及验证

6.如何在集群中所有节点部署

废话不多说,现在开始:

1. Snappy 压缩算法介绍及几种压缩算法比较

这一部分可以参考我的上一篇博文:Hadoop压缩-SNAPPY算法,或者直接参看Google文档:http://code.google.com/p/snappy/ 及 http://code.google.com/p/hadoop-snappy/。我的Hadoop压缩-SNAPPY算法这篇博文中,不仅简介了Google Snappy,还介绍了常见三种压缩库的比较,Snappy的优点和适用场合,这篇文章就不再做重点详细介绍。

2. Snappy 安装过程及验证

① 前置条件

gcc c++, autoconf, automake, libtool, Java 6, JAVA_HOME set, Maven 3

前五个如果不能确定的话,可以直接使用yum install XXX来确认一下,如果已安装会提示,没有安装的话,会自动安装上。

② 下载Snappy 1.0.5

下载地址:http://code.google.com/p/snappy/downloads/list。

③ 编译并安装动态链接库到本地

?
1
2
3
./configure
make
make install

默认是安装到了/usr/local/lib。这时在此目录下查看会生成:

?
1
2
3
4
5
6
7
8
9
10
[root@slave1 lib]# pwd
/usr/local/lib
[root@slave1 lib]# ll
total 536
-rw-r--r--. 1 root root 369308 Jan 14 11:02 libsnappy.a
-rwxr-xr-x. 1 root root    957 Jan 14 11:02 libsnappy.la
lrwxrwxrwx. 1 root root     18 Jan 14 11:02 libsnappy.so -> libsnappy.so.1.1.3
lrwxrwxrwx. 1 root root     18 Jan 14 11:02 libsnappy.so.1 -> libsnappy.so.1.1.3
-rwxr-xr-x. 1 root root 171796 Jan 14 11:02 libsnappy.so.1.1.3
[root@slave1 lib]#

如果没有错误且文件及链接一致,snappy的安装已经成功。

3. Hadoop Snappy 源码编译过程及问题解决方案

① 下载Hadoop-Snappy源码

下载地址:http://code.google.com/p/hadoop-snappy/

② 编译hadoop snappy源码

mvn package [-Dsnappy.prefix=SNAPPY_INSTALLATION_DIR]

注:如果第二步snappy安装路径是默认的话,即/usr/local/lib,则此处 [-Dsnappy.prefix=SNAPPY_INSTALLATION_DIR] 可以不写,或者 -Dsnappy.prefix=/usr/local/lib

这个过程如果你的CentOS各个软件的版本正好和Hadoop Snappy要求的一致的话,真的恭喜你,可以一部成功,但是有些还是会有问题。我遇到的三个比计较棘手的问题:

错误一:/root/modules/hadoop-snappy/maven/build-compilenative.xml:62: Execute failed:Java.io.IOException: Cannot run program “autoreconf” (in directory “/root/modules/hadoop-snappy/target/native-src”): java.io.IOException: error=2, No such file or directory

解决方案:说明缺少文件,但是这个文件是在target下的,是编译过程中自动生成的,原本就不该存在,这是问什么呢?其实根本问题不是缺文件,而是Hadoop Snappy是需要一定的前置条件的:Requirements: gcc c++, autoconf, automake, libtool, Java 6, JAVA_HOME set, Maven 3。

我这里边缺少了autoconf,automake,libtool的缘故。在ubuntu中,你可以直接依次apt-get install autoconf,automake,libtool即可,如果是在CentOS中,只需将apt-get 换成 yum。

错误二:

?
1
2
3
4
[exec] make: *** [src/org/apache/hadoop/io/compress/snappy/SnappyCompressor.lo] Error 1
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.6:run (compile) on project hadoop-snappy: An Ant BuildException has occured: The following error occurredwhileexecutingthisline:
[ERROR] /home/ngc/Char/snap/hadoop-snappy/hadoop-snappy-read-only/maven/build-compilenative.xml:75: exec returned: 2

解决方案:这个是最恶心的。Hadoop Snappy的前置条件需要安装gcc,但是它的官方文档仅仅列出了需要gcc,而没有列出需要什么版本的gcc。在Google中英文搜索了半天,刨来刨去,终于发现,有句话说Hadoop Snappy是需要gcc4.4的。而我的是gcc4.6.3。

?
1
2
3
4
5
[root@master modules]# gcc --version
gcc (GCC) 4.4.6 20120305 (Red Hat 4.4.6-4)
Copyright (C) 2010 Free Software Foundation, Inc.
Thisisfree software; see the source forcopying conditions.  There isNO
warranty; not even forMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

那么我们就要回退,如何回退:

?
1
2
3
4
5
6
7
1. apt-getinstall gcc-3.4
2. rm /usr/bin/gcc
3. ln -s /usr/bin/gcc-4.4 /usr/bin/gcc
之后,再gcc --version,你就会发现,gcc已经变成4.4.7了。

错误三:

?
1
2
3
4
5
[exec] /bin/bash ./libtool --tag=CC   --mode=link gcc -g -Wall -fPIC -O2 -m64 -g -O2 -version-info 0:1:0 -L/usr/local//lib -o libhadoopsnappy.la -rpath /usr/local/lib src/org/apache/hadoop/io/compress/snappy/SnappyCompressor.lo src/org/apache/hadoop/io/compress/snappy/SnappyDecompressor.lo  -ljvm -ldl
     [exec] /usr/bin/ld: cannot find -ljvm
     [exec] collect2: ld returned 1 exit status
     [exec] make: *** [libhadoopsnappy.la] 错误 1
     [exec] libtool: link: gcc -shared  -fPIC -DPIC  src/org/apache/hadoop/io/compress/snappy/.libs/SnappyCompressor.o src/org/apache/hadoop/io/compress/snappy/.libs/SnappyDecompressor.o   -L/usr/local//lib -ljvm -ldl  -O2 -m64 -O2   -Wl,-soname -Wl,libhadoopsnappy.so.0 -o .libs/libhadoopsnappy.so.0.0.1

解决方案:如果你去搜,你会发现网上有很多 解决/usr/bin/ld: cannot find -lxxx 这样的博客,但是这里,我告诉你,他们的都不适用。因为这儿既不是缺什么,也不是版本不对,是因为没有把安装jvm的libjvm.so symbolic link到usr/local/lib。如果你的系统时amd64,可到/root/bin/jdk1.6.0_37/jre/lib/amd64/server/察看libjvm.so link到的地方,这里修改如下:

ln -s /root/bin/jdk1.6.0_37/jre/lib/amd64/server/libjvm.so /usr/local/lib/ 问题即可解决。

③ hadoop snappy源码编译成功以后,在target包下,会有如下文件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@master snappy-hadoop]# cd target/
[root@master target]# ll
total 928
drwxr-xr-x. 2 root root   4096 Jan 13 19:42 antrun
drwxr-xr-x. 2 root root   4096 Jan 13 19:44 archive-tmp
drwxr-xr-x. 3 root root   4096 Jan 13 19:42 classes
-rw-r--r--. 1 root root    168 Jan 13 19:44 copynativelibs.sh
drwxr-xr-x. 4 root root   4096 Jan 13 19:42 generated-sources
-rw-r--r--. 1 root root  11526 Jan 13 19:44 hadoop-snappy-0.0.1-SNAPSHOT.jar
-rw-r--r--. 1 root root 337920 Jan 13 19:44 hadoop-snappy-0.0.1-SNAPSHOT-Linux-amd64-64.tar
drwxr-xr-x. 3 root root   4096 Jan 13 19:44 hadoop-snappy-0.0.1-SNAPSHOT-tar
-rw-r--r--. 1 root root 180661 Jan 13 19:44 hadoop-snappy-0.0.1-SNAPSHOT.tar.gz
drwxr-xr-x. 2 root root   4096 Jan 13 19:44 maven-archiver
drwxr-xr-x. 3 root root   4096 Jan 13 19:42 native-build
drwxr-xr-x. 7 root root   4096 Jan 13 19:42 native-src
drwxr-xr-x. 2 root root   4096 Jan 13 19:44 surefire-reports
drwxr-xr-x. 3 root root   4096 Jan 13 19:42 test-classes
-rw-r--r--. 1 root root 365937 Jan 13 19:44 test.txt.snappy
[root@master target]#

4. Hadoop上Hadoop Snappy 安装配置过程及验证

这个过程也比较繁杂,配置点比较多要仔细:

① 解压第三步target下hadoop-snappy-0.0.1-SNAPSHOT.tar.gz,解压后,复制lib文件

?
1
cp -r /root/modules/snappy-hadoop/target/hadoop-snappy-0.0.1-SNAPSHOT/lib/native/Linux-amd64-64/* $HADOOP_HOME/lib/native/Linux-amd64-64/

② 将第三步target下的hadoop-snappy-0.0.1-SNAPSHOT.jar复制到$HADOOP_HOME/lib 下。

③ 配置hadoop-env.sh,添加:

?
1
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native/Linux-amd64-64/:/usr/local/lib/

④ 配置mapred-site.xml,这个文件中,所有跟压缩有关的配置选项有:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<property>
  <name>mapred.output.compress</name>
  <value>false</value>
  <description>Should the job outputs be compressed?
  </description>
</property>
<property>
  <name>mapred.output.compression.type</name>
  <value>RECORD</value>
  <description>If the job outputs are to compressed asSequenceFiles, how should
               they be compressed? Should be one of NONE, RECORD or BLOCK.
  </description>
</property>
<property>
  <name>mapred.output.compression.codec</name>
  <value>org.apache.hadoop.io.compress.DefaultCodec</value>
  <description>If the job outputs are compressed, how should they be compressed?
  </description>
</property>
<property>
  <name>mapred.compress.map.output</name>
  <value>false</value>
  <description>Should the outputs of the maps be compressed before being
               sent across the network. Uses SequenceFile compression.
  </description>
</property>
<property>
  <name>mapred.map.output.compression.codec</name>
  <value>org.apache.hadoop.io.compress.DefaultCodec</value>
  <description>If the map outputs are compressed, how should they be
               compressed?
  </description>
</property>

根据自己的需要,配置进去即可。我们为了验证方便,仅配置map部分:

?
1
2
3
4
5
6
7
8
<property>
        <name>mapred.compress.map.output</name>
        <value>true</value>
        </property>
        <property>
        <name>mapred.map.output.compression.codec</name>
        <value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>

⑤ 重新启动hadoop。为了验证是否成功,往hdfs上传一个文本文件,敲入一些词组,运行wordcount程序。如果map部分100%完成,即说明我们hadoop snappy安装成功。

因为hadoop没有像HBase一样提供util.CompressionTest类(或者是我没有找到),所以只能按照这种方法来测试。接下来,将详细列出HBase使用Snappy的配置过程。

5. HBase 配置Snappy及验证

在Hadoop上配置Snappy成功以后,相对来说,在HBase上配置要简单一些了。

① 配置HBase lib/native/Linux-amd64-64/ 中的lib文件。HBase中的lib文件,即需要第三步中/root/modules/snappy-hadoop/target/hadoop-snappy-0.0.1-SNAPSHOT/lib/native/Linux-amd64-64/ 下的所有lib文件,也需要Hadoop中,$HADOOP_HOME/lib/native/Linux-amd64-64/下的hadoop的lib文件(我看到的大部分介绍snappy的文章,均为提到这一点)。简单起见,我们只需要将$HADOOP_HOME/lib/native/Linux-amd64-64/下lib文件,全部复制到相应HBase目录下:

?
1
cp -r $HADOOP_HOME/lib/native/Linux-amd64-64/* $HBASE_HOME/lib/native/Linux-amd64-64/

② 配置HBase环境变量hbase-env.sh

?
1
2
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native/Linux-amd64-64/:/usr/local/lib/
export HBASE_LIBRARY_PATH=$HBASE_LIBRARY_PATH:$HBASE_HOME/lib/native/Linux-amd64-64/:/usr/local/lib/

③ 重启HBase。

④ 验证安装是否成功

首先,使用 CompressionTest 来查看snappy是否 enabled 并且能成功 loaded:

hbase org.apache.hadoop.hbase.util.CompressionTest hdfs://192.168.205.5:9000/output/part-r-00000 snappy

其中,/output/part-r-00000 为我们在验证hadoop snappy的时候,wordcount的输出。

执行命令后结果为:

?
1
2
3
4
5
6
7
8
9
10
11
12
[root@master ~]# hbase org.apache.hadoop.hbase.util.CompressionTest hdfs://192.168.205.5:9000/output/part-r-00000 snappy
13/01/13 21:59:24 INFO util.ChecksumType: org.apache.hadoop.util.PureJavaCrc32 not available.
13/01/13 21:59:24 INFO util.ChecksumType: Checksum can use java.util.zip.CRC32
13/01/13 21:59:24 INFO util.ChecksumType: org.apache.hadoop.util.PureJavaCrc32C not available.
13/01/13 21:59:24 DEBUG util.FSUtils: Creating file:hdfs://192.168.205.5:9000/output/part-r-00000with permission:rwxrwxrwx
13/01/13 21:59:24 WARN snappy.LoadSnappy: Snappy native library isavailable
13/01/13 21:59:24 INFO util.NativeCodeLoader: Loaded the native-hadoop library
13/01/13 21:59:24 INFO snappy.LoadSnappy: Snappy native library loaded
13/01/13 21:59:24 INFO compress.CodecPool: Got brand-newcompressor
13/01/13 21:59:24 DEBUG hfile.HFileWriterV2: Initialized with CacheConfig:disabled
13/01/13 21:59:24 INFO compress.CodecPool: Got brand-newdecompressor
SUCCESS

说明Snappy 安装已经enable并且能够成功loaded。

⑤ 接下来创建并操作Snappy压缩格式的表

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@master ~]# hbase shell
HBase Shell; enter 'help<RETURN>'forlist of supported commands.
Type"exit<RETURN>"to leave the HBase Shell
Version 0.94.2, r1395367, Sun Oct  7 19:11:01 UTC 2012
//创建表
hbase(main):001:0> create 'tsnappy', { NAME => 'f', COMPRESSION => 'snappy'}
0 row(s) in10.6590 seconds
//describe表
hbase(main):002:0> describe 'tsnappy'
DESCRIPTION                                                                                                        ENABLED                                                      
 {NAME => 'tsnappy', FAMILIES => [{NAME => 'f', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_ true                                                         
 SCOPE => '0', VERSIONS => '3', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TTL => '2147483647', KEEP_DELETED_CE                                                              
 LLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', ENCODE_ON_DISK => 'true', BLOCKCACHE => 'true'}]}                                                                  
1 row(s) in0.2140 seconds
//put数据
hbase(main):003:0> put 'tsnappy','row1','f:col1','value'
0 row(s) in0.5190 seconds
//scan数据
hbase(main):004:0> scan 'tsnappy'
ROW                                           COLUMN+CELL                                                                                                                       
 row1                                         column=f:col1, timestamp=1358143780950, value=value                                                                               
1 row(s) in0.0860 seconds
hbase(main):005:0>

以上所有过程均成功执行,说明Snappy 在Hadoop及HBase上配置成功~

6.如何在集群中所有节点部署

这一步就非常简单了,尤其是如果你配置过Hadoop集群。仅需要将我们上边所有配置过的文件,分发到所有其他节点的相应目录即可,包括生成的/usr/lib/local下的snappy链接库。

补充:后来在真正的部署到HBase集群后,将表的COMPRESSION设置为SNAPPY后,向该表写数据是,出现异常:

Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/base/Preconditions

原因:Snappy是Google的开源压缩库,对Google的Guava Library有依赖,我们需要去下载相应JAR包及依赖文件,将下载的文件放到集群所有节点的相应lib下就可以了。

Hadoop Snappy安装终极教程相关推荐

  1. ubuntu显卡驱动(nvidia)安装终极教程

    1 确定ubuntu系统版本和显卡配置 确定内核版本命令 uname -a 查看是否有独立显卡 lspci -v -s 01:00.0 注意:如果以上命令什么都没有显示,要检测独立显卡硬件是否插好!! ...

  2. Perl/Tk模块的安装终极教程(针对于NMAKE不好用的解决办法)

    因为组长最近要我们做一下LOG内容的可视化显示,前期提取LOG的时候一直用的是Perl语言进行开发,所以上网寻求更简单的数据可视化的方式,发现Perl脚本是那么的强大,从数据库到可视化再到进程控制,哈 ...

  3. Hadoop学习笔记——入门教程(虚拟机安装LinuxHadoop环境搭建配置)

    文章目录 一.Hadoop安装配置文档及注意事项 二.Hadoop概述 2.1.Hadoop是什么 2.2.Hadoop的发展历史 2.3.Hadoop三大发行版本 2.3.1 Apache Hado ...

  4. 家用服务器虚拟机装hadoop,超详细hadoop虚拟机安装教程(附图文步骤)

    前两天看到有人留言问在什么情况下需要部署hadoop,我给的回答也很简单,就是在需要处理海量数据的时候才需要考虑部署hadoop.关于这个问题在很早之前的一篇分享文档也有说到这个问题,数据量少的完全发 ...

  5. Win11安装 (Win11 22H2) 不联网 跳过联网 激活 终极教程(解决:无法跳过联网,糟糕你已断开internet连接等问题)

    @[TOC](Win11安装 (Win11 22H2) 不联网 跳过联网 激活 终极教程(解决:无法跳过联网,糟糕你已断开internet连接等问题)) Win11安装 不联网 跳过联网 终极教程 1 ...

  6. 新的比较详细的hive安装教程,包含:hadoop的安装配置,hive安装详细教程,大数据下hive详细配置和简单使用和hive元数据迁移相关安装配置操作

    简介:这是大数据里安装hive比较详细的教程,包括安装hive时hadoop的相关配置,hive安装,hive 之后的mysql安装,hive的元素配置到mysql相关配置,hive常见属性的相关配置 ...

  7. Hadoop下载安装及HDFS配置教程

    Hadoop下载安装及HDFS配置教程 前言 Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和 ...

  8. 超详细hadoop下载安装教程(附图文)

    在前几篇的文章中分别就虚拟系统安装.LINUX系统安装以及hadoop运行服务器的设置等内容写了详细的操作教程,本篇分享的是hadoop的下载安装步骤. 在此之前有必要做一个简单的说明:分享的所有内容 ...

  9. Ubuntu下Hadoop的安装教程

    Ubuntu下Hadoop的安装教程,Hadoop的单机配置和伪分布式安装 教程 本教程采用的是Ubuntu18.04.4+hadoop2.7.7+jdk1.8 创建Hadoop用户 打开命令行终端( ...

  10. Hadoop自动安装脚本

    Hadoop自动安装脚本 文章目录 Hadoop自动安装脚本 前言 脚本说明 脚本截图 后记 前言 最近在学习大数据的相关知识,对于 Hadoop的安装这一块,身边不少同学安装都存在许多问题,不行安装 ...

最新文章

  1. 瑞星播报:3月8日需警惕“灰鸽子变种AWM”病毒
  2. 伪语言PHP,PHP语言之伪静态几种做法
  3. JS是世界上最好的语言—— 使用Electron开发桌面应用(一)
  4. [GKCTF 2021]Random
  5. 03--MySQL自学教程:MySQL安装后的目录结构介绍和简单语法指令
  6. 在soa工程中使用dubbo的步骤
  7. 安装mongoDB遇见的一个路径问题
  8. ubuntu之find方法
  9. [转]完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
  10. 理论基础 —— 查找 —— 顺序查找
  11. 三星手机微信聊天记录删除了怎么恢复
  12. 删除Windows远程桌面连接记录 和 删除Windows凭据
  13. android 音乐播放器评测,Android平台四大音乐播放器对比评测
  14. 爬虫千万条,守法第一条,爬虫不规范,亲人两行泪
  15. Vue.js:事件修饰符stop,once,prevent的使用
  16. Python 玩转数据 12 - 数据读写 Data I/O: Pandas 读写 JSON File Format
  17. Parcel 中文文档 | Parcel 中文网
  18. Efficient Graph-Based Image Segmentation论文思路
  19. 几款常用LED显示屏驱动芯片介绍及选择VK1624
  20. k8s + rook + Ceph 记录

热门文章

  1. currentTarget与target的区别
  2. Spring 全局异常拦截根据业务返回不同格式数据 自定义异常
  3. openssl 升级
  4. AutoPostBack
  5. 四、数组定义/冒泡排序的理论/什么是方法
  6. linux 安装weblogic12.1.3.0步骤
  7. 大型架构之科普工具篇
  8. 130242014075 杨利城 《电商系统某功能模块》的需求分析与设计
  9. 如何用新安装的jdk替换掉Linux系统默认jdk
  10. 数据结构-第10周作业(二叉树的创建和遍历算法)