Snappy安装

Snappy安装1 功能说明使用 snappy 压缩来提升 mapreduce 和 hbase 的性能 其实就是用 CPU 换 IO 吞吐量和磁盘空间 配置并使用 snappy 有如下几点要求 首先需要 hadoop 集群的 native 库已经收到编译好 并且添加了对 snappy 的支持 编译 hadoop 源码之前安装了 snappy 并且编译时指定 Drequire snappy 参数 我使用的版本是 hadoop 2 5 0 cdh5

1. 功能说明


使用snappy压缩来提升mapreduce和hbase的性能。其实就是用CPU换IO吞吐量和磁盘空间。配置并使用snappy有如下几点要求:

  • 首先需要hadoop集群的native库已经收到编译好,并且添加了对snappy的支持。编译hadoop源码之前安装了snappy并且编译时指定-Drequire.snappy参数。(我使用的版本是hadoop-2.5.0-cdh5.3.3伪分布式)
  • 安装了maven(我使用的版本是3.0.5)
  • jdk已经成功安装并设置了JAVA_HOME(我使用的版本是1.7.0_75)

 

2. MapReduce配置snappy


配置过程参考官网(但是有所区别)

https://github.com/electrum/hadoop-snappy

 

2.1 测试MR


为了与后期配置完成snappy后进行对比我们先测试一个简单mapreduce程序,然后记录map的输出bytes大小

$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0-cdh5.3.3.jar wordcount /wordcount/in /wordcount/out
  • 这里写图片描述

 

2.2 安装依赖


首先在服务器上安装snappy,而安装snappy需要一系列的依赖,为了避免麻烦我们首先安装好这些依赖

$ sudo yum -y install gcc c++ autoconf automake libtool

 

2.3 下载snappy安装包


从官网下载snappy的安装包

http://pkgs.fedoraproject.org/repo/pkgs/snappy/snappy-1.1.1.tar.gz/8887e3b7253b22a31f5486bca3cbc1c2/snappy-1.1.1.tar.gz

 

2.4 上传部署


将snappy-1.1.1.tar.gz上传到服务器解压重命名为snappy-1.1.1,【SNAPPY_HOME】为【/usr/local/cdh-5.3.3/snappy-1.1.1】

 

2.5 安装snappy


进入【SNAPPY_HOME】目录下安装snappy

  
  1. $ sudo ./configure
  2. $ sudo make
  3. $ sudo make install

 

注:一定要确保全程无Error!

如果安装成功的话进入【/usr/local/lib】目录下(默认位置),可以看到已经生成了snappy的库文件

  
  1. $ cd /usr/local/lib
  2. $ ll

这里写图片描述

 

2.6 下载hadoop-snappy


从github上将hadoop-snappy压缩包下载下来

https://github.com/electrum/hadoop-snappy

 

2.7 上传部署


将hadoop-snappy-master.zip部署到服务器解压重命名为hadoop-snappy-master

$ unzip hadoop-snappy-master.zip

 

2.8 编译hadoop-snappy


进入hadoop-snappy-master,使用maven进行编译

  
  1. $ cd hadoop-snappy-master
  2. $ mvn clean package

 

这里写图片描述

注:如果你的snappy是使用其他方式安装的请一定找到snappy的安装路径,并在编译的时候添加参数-Dsnappy.prefix=SNAPPY_INSTALLATION_DIR,不指定的话默认为【/usr/local】目录。

编译好的tar包在当前目录下的target目录下(hadoop-snappy-0.0.1-SNAPSHOT.tar.gz)

这里写图片描述

 

2.9 配置


2.9.1 配置native


将2.7中编译得到的hadoop-snappy-0.0.1-SNAPSHOT.tar.gz解压,拷贝需要的jar包和native到hadoop的lib目录下

  
  1. $ tar -zxvf hadoop-snappy-0.0.1-SNAPSHOT.tar.gz
  2. $ cp hadoop-snappy-0.0.1-SNAPSHOT/lib/hadoop-snappy-0.0.1-SNAPSHOT.jar $HADOOP_HOME/lib
  3. $ cp hadoop-snappy-0.0.1-SNAPSHOT/lib/native/Linux-amd64-64/* $HADOOP_HOME/lib/native/

 

2.9.2 配置core-site.xml


配置hadoop集群的的core-site.xml文件,添加如下参数:

  


  1. io.compression.codecs


  2. org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec
  3. ,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.SnappyCodec

2.9.3 配置mapred-site.xml


配置hadoop集群的mapred-site.xml,添加如下参数:

  


  1. mapreduce.map.output.compress


  2. true


  3. mapreduce.map.output.compress.codec


  4. org.apache.hadoop.io.compress.SnappyCodec

 

注:为了测试方便我们只配置map的输出压缩。

 

2.9.4 重启hadoop集群


修改完core-site.xml和mapred-site.xml文件后重启hadoop集群。

 

2.10 验证MapReduce


重新运行2.1节中的mapreduce程序

$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0-cdh5.3.3.jar wordcount /wordcount/in /wordcount/out2

 

这里写图片描述

 

2.11 错误记录


问题描述

在2.9.1节中配置native库时按照官方文档是将整个编译解压后的snappy lib目录下的所有内容都拷贝到HADOOP_HOME/lib目录下

$ cp -r hadoop-snappy-0.0.1-SNAPSHOT/lib/* $HADOOP_HOME/lib

 

但是在测试MR的时候提示无法加载到snappy的library

  
  1. Caused by: java.lang.RuntimeException: native snappy library not available: SnappyCompressor has not been loaded.
  2. at org.apache.hadoop.io.compress.SnappyCodec.checkNativeCodeLoaded(SnappyCodec.java:69)
  3. at org.apache.hadoop.io.compress.SnappyCodec.getCompressorType(SnappyCodec.java:132)
  4. at org.apache.hadoop.io.compress.CodecPool.getCompressor(CodecPool.java:148)
  5. at org.apache.hadoop.io.compress.CodecPool.getCompressor(CodecPool.java:163)
  6. at org.apache.hadoop.mapred.IFile$Writer.

    (IFile.java:114)
  7. at org.apache.hadoop.mapred.IFile$Writer.

    (IFile.java:97)
  8. at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.sortAndSpill(MapTask.java:1602)
  9. at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.access$900(MapTask.java:873)
  10. at org.apache.hadoop.mapred.MapTask$MapOutputBuffer$SpillThread.run(MapTask.java:1525)

 

解决办法

按照2.9.1节中配置native库即可,其实就是将Linux-amd64-64文件夹下的snappy库文件都直接放到$HADOOP_HOME/lib/native目录下。网上说的各种配置环境变量什么的都试过了,没有起到作用。

 

3. HBase配置snappy


 

3.1 配置native


参照2.9.1中步骤将hadoop-snappy-0.0.1-SNAPSHOT.jar和snappy的library拷贝到HBASE_HOME/lib目录下即可

  
  1. $ cp hadoop-snappy-0.0.1-SNAPSHOT/lib/hadoop-snappy-0.0.1-SNAPSHOT.jar $HBASE_HOME/lib
  2. $ mkdir $HBASE_HOME/lib/native
  3. $ cp -r hadoop-snappy-0.0.1-SNAPSHOT/lib/native/Linux-amd64-64/* $HBASE_HOME/lib/native/

 

注: 如果创建失败则使用如下命令

  
  1. $ cp hadoop-snappy-0.0.1-SNAPSHOT/lib/hadoop-snappy-0.0.1-SNAPSHOT.jar $HBASE_HOME/lib
  2. $ mkdir $HBASE_HOME/lib/native/Linux-amd64-64
  3. $ cp -r hadoop-snappy-0.0.1-SNAPSHOT/lib/native/Linux-amd64-64/* $HBASE_HOME/lib/native/Linux-amd64-64/

 

 

3.2 重启HBase集群


重启HBase集群

 

3.3 验证


先使用以下命令测试snappy对hbase是否可用

$ bin/hbase org.apache.hadoop.hbase.util.CompressionTest hdfs://hadoop-main.dimensoft.com.cn:8020/wordcount/out2/part-r-00000 snappy

 

这里写图片描述

注:hdfs://hadoop-main.dimensoft.com.cn:8020/wordcount/put2/part-r-00000是在2.10节中验证MapReduce使用snappy时候的输出文件

进入HBase的CLI创建数据表,指定压缩方式

  
  1. > create 'company', { NAME => 'department', COMPRESSION => 'snappy'}
  2. > describe 'company'

 

这里写图片描述

插入数据

  
  1. > put 'company', '001', 'department:name', 'develop'
  2. > put 'company', '001', 'department:address', 'sz'

 

查询

> scan 'company'

 

这里写图片描述

 

4. Uber模式使用Snappy


配置了uber模式后使用上述的snappy压缩配置方法后mapreduce程序运行报错:

  
  1. 2015-06-17 04:27:48,905 FATAL [uber-SubtaskRunner] org.apache.hadoop.mapred.LocalContainerLauncher: Error running local (uberized) 'child' : java.lang.UnsatisfiedLinkError: org.apache.hadoop.util.NativeCodeLoader.buildSupportsSnappy()Z
  2. at org.apache.hadoop.util.NativeCodeLoader.buildSupportsSnappy(Native Method)
  3. at org.apache.hadoop.io.compress.SnappyCodec.checkNativeCodeLoaded(SnappyCodec.java:63)
  4. at org.apache.hadoop.io.compress.SnappyCodec.getCompressorType(SnappyCodec.java:132)
  5. at org.apache.hadoop.io.compress.CodecPool.getCompressor(CodecPool.java:148)
  6. at org.apache.hadoop.io.compress.CodecPool.getCompressor(CodecPool.java:163)
  7. at org.apache.hadoop.mapred.IFile$Writer.

    (IFile.java:114)
  8. at org.apache.hadoop.mapred.IFile$Writer.

    (IFile.java:97)
  9. at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.sortAndSpill(MapTask.java:1602)
  10. at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.flush(MapTask.java:1482)
  11. at org.apache.hadoop.mapred.MapTask$NewOutputCollector.close(MapTask.java:720)
  12. at org.apache.hadoop.mapred.MapTask.closeQuietly(MapTask.java:2012)
  13. at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:794)
  14. at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
  15. at org.apache.hadoop.mapred.LocalContainerLauncher$EventHandler.runSubtask(LocalContainerLauncher.java:370)
  16. at org.apache.hadoop.mapred.LocalContainerLauncher$EventHandler.runTask(LocalContainerLauncher.java:295)
  17. at org.apache.hadoop.mapred.LocalContainerLauncher$EventHandler.access$200(LocalContainerLauncher.java:181)
  18. at org.apache.hadoop.mapred.LocalContainerLauncher$EventHandler$1.run(LocalContainerLauncher.java:224)
  19. at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
  20. at java.util.concurrent.FutureTask.run(FutureTask.java:262)
  21. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
  22. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
  23. at java.lang.Thread.run(Thread.java:745)

 

这是因为在uber模式下无法加载到snappy的native,解决办法是在mapred-site.xml中添加如下配置:

  


  1. yarn.app.mapreduce.am.env


  2. LD_LIBRARY_PATH=$HADOOP_HOME/lib/native

 

https://issues.apache.org/jira/browse/MAPREDUCE-5799

注:如果是CM安装的CDH版本hadoop则snappy的native在【/opt/cloudera/parcels/CDH/lib/hadoop/lib/native】目录下。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211674.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午9:53
下一篇 2026年3月18日 下午9:53


相关推荐

  • oracle 11g安装教程_暖气片安装方法图解

    oracle 11g安装教程_暖气片安装方法图解Oracle11G安装图解标签(空格分隔):oracleOracle介绍  OracleDatabase,又名OracleRDBMS,或简称Oracle是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的

    2026年2月9日
    4
  • PayAClaw:OpenClaw 接单赚钱平台内测版上线了

    PayAClaw:OpenClaw 接单赚钱平台内测版上线了

    2026年3月13日
    1
  • MATLAB2016b安装包

    MATLAB2016b安装包百度云盘链接:(https://pan.baidu.com/s/17NdGN-GviFWlUfMrTZA_Kw)密码:p4ue

    2022年5月29日
    42
  • Docker Compose详解

    Docker Compose详解使用 DockerCompos 预计阅读时间 11 分钟 DockerCompos 是一种用于帮助定义和共享多容器应用程序的工具 使用 Compose 我们可以创建一个 YAML 文件来定义服务 并且使用一个命令 可以启动所有内容或将其全部关闭 使用 Compose 的最大优势是您可以在一个文件中定义您的应用程序堆栈 将其保存在项目 repo 的根目录中 它现在是版本控制的 并且可以轻松地让其他人为您的项目做出贡献 有人只需要克隆您的存储库并启动撰写应用程序 事实上 你现在可能会在 GitHub Gi

    2025年6月17日
    4
  • 通义千问大模型API代码生成对比: Qwen 2.5-Coder-32B、Qwen 2.5-Coder-14B

    通义千问大模型API代码生成对比: Qwen 2.5-Coder-32B、Qwen 2.5-Coder-14B

    2026年3月12日
    3
  • keil和keil mdk的区别_keil5数据类型

    keil和keil mdk的区别_keil5数据类型楼主本人用的是stm32f407zgt6的芯片,你可以参照找到你用的芯片对应的文件。      在KeilMDK开发环境里,比如一个无符号32位整形数据会有很多种表示方法:1,unsignedint32(C语言标准表达方法)2,uint32_t;  3,u32;  这三种方式都是在表达同一个意思,可为什么ST的开发人员要搞的这么乱呢?还有其他好多你可能看起来很陌生,

    2022年10月15日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号