`
zhangxiong0301
  • 浏览: 359046 次
社区版块
存档分类
最新评论

HADOOP中mapreduce开启压缩功能

 
阅读更多

           

           最近给热云公司共享数据,我们把原始数据给到他们,让他们做计算。每天同步一次,数据量压缩后10几个G,数据来自hive的mapreduce查询。通过insert overwrite local directory select语句将数据写入本地的NFS,然后对数据压缩,并在NFS的服务端机器提供文件下载功能。由于压缩前数据量太大,大概有90G左右。因此在hive作业最后写入select结果数据到本地文件系统时直接报错中断了。而且就算能拷贝到本地,之后的压缩时间没有好几个小时也甭想完成。于是就想到了用启用hadoop的数据压缩功能,使mapreduce作业直接输出压缩好的数据到本地文件系统。具体步骤如下:

 

 

1.执行hive语句之前,在hive-cli中设置如下参数:

 

set  mapreduce.output.fileoutputformat.compress=true;
set mapreduce.output.fileoutputformat.compress.type=BLOCK;
set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.GzipCodec;
set mapreduce.map.output.compress=true;
set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.GzipCodec;

 

此时执行测试语句:

 

insert overwrite  directory  '/user/reyun/testrawdataexport' 
select keywords,count(1) from qiku.illegalpackage group by keywords;

 

发现报错:

 

Diagnostic Messages for this Task:
Error: org.apache.hadoop.mapreduce.task.reduce.Shuffle$ShuffleError: error in shuffle in fetcher#1
        at org.apache.hadoop.mapreduce.task.reduce.Shuffle.run(Shuffle.java:134)
        at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:376)
        at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:415)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1642)
        at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:163)
Caused by: java.io.IOException: Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out.
        at org.apache.hadoop.mapreduce.task.reduce.ShuffleSchedulerImpl.checkReducerHealth(ShuffleSchedulerImpl.java:333)
        at org.apache.hadoop.mapreduce.task.reduce.ShuffleSchedulerImpl.copyFailed(ShuffleSchedulerImpl.java:255)
        at org.apache.hadoop.mapreduce.task.reduce.Fetcher.copyFromHost(Fetcher.java:351)
        at org.apache.hadoop.mapreduce.task.reduce.Fetcher.run(Fetcher.java:193)

 

显然,shuffle时候出问题了。再看下具体执行任务的节点的报错信息:

 

2015-10-14 10:00:03,555 INFO [main] org.apache.hadoop.io.compress.CodecPool: Got brand-new compressor [.gz]
2015-10-14 10:00:03,556 WARN [main] org.apache.hadoop.mapred.IFile: Could not obtain compressor from CodecPool

 

 压缩器是hadoop带的功能,hdfs在做文件压缩时,只是向CodecPool获取压缩器,但显然CodecPool里没有可用的压缩器,因此需要我们配置。即下面第二步所做的事情。

 

2.配置hadoop,使其加载各种压缩工具,提供压缩功能。在hadoop的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</value>
</property>

 

这时候在运行测试sql,发现正常运行了。但是结果却没有压缩。查看一下hive的执行计划。

 

STAGE PLANS:
  Stage: Stage-1
    Map Reduce
      Map Operator Tree:
          TableScan
            alias: illegalpackage
            Statistics: Num rows: 2 Data size: 250 Basic stats: COMPLETE Column stats: NONE
            Select Operator
              expressions: keywords (type: string)
              outputColumnNames: keywords
              Statistics: Num rows: 2 Data size: 250 Basic stats: COMPLETE Column stats: NONE
              Group By Operator
                aggregations: count(1)
                keys: keywords (type: string)
                mode: hash
                outputColumnNames: _col0, _col1
                Statistics: Num rows: 2 Data size: 250 Basic stats: COMPLETE Column stats: NONE
                Reduce Output Operator
                  key expressions: _col0 (type: string)
                  sort order: +
                  Map-reduce partition columns: _col0 (type: string)
                  Statistics: Num rows: 2 Data size: 250 Basic stats: COMPLETE Column stats: NONE
                  value expressions: _col1 (type: bigint)
      Reduce Operator Tree:
        Group By Operator
          aggregations: count(VALUE._col0)
          keys: KEY._col0 (type: string)
          mode: mergepartial
          outputColumnNames: _col0, _col1
          Statistics: Num rows: 1 Data size: 125 Basic stats: COMPLETE Column stats: NONE
          Select Operator
            expressions: _col0 (type: string), _col1 (type: bigint)
            outputColumnNames: _col0, _col1
            Statistics: Num rows: 1 Data size: 125 Basic stats: COMPLETE Column stats: NONE
            File Output Operator
              compressed: false
              Statistics: Num rows: 1 Data size: 125 Basic stats: COMPLETE Column stats: NONE
              table:
                  input format: org.apache.hadoop.mapred.TextInputFormat
                  output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
                  serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

 

发现其中一行compressed: false。因此想到是不是hive也加了一道开关控制数据是否压缩。在hive-defaut.xml里搜索compress关键字,发现确实有控制结果输出是否压缩的配置,默认不压缩。因此再在sql执行前加上hive的压缩开关配置.

 

set hive.exec.compress.output=true;         

 

此时,再执行sql发现能正确输出压缩后的结果。SUCCEED.

 

-rw-r--r--. 1 hadoop hadoop 48542102 10月 14 2015 000000_0.gz
-rw-r--r--. 1 hadoop hadoop 47870794 10月 14 2015 000001_0.gz
-rw-r--r--. 1 hadoop hadoop 47912034 10月 14 2015 000002_0.gz
-rw-r--r--. 1 hadoop hadoop 46831088 10月 14 2015 000003_0.gz
-rw-r--r--. 1 hadoop hadoop 47351273 10月 14 2015 000004_0.gz
-rw-r--r--. 1 hadoop hadoop 47238145 10月 14 2015 000005_0.gz
-rw-r--r--. 1 hadoop hadoop 47283714 10月 14 2015 000006_0.gz
-rw-r--r--. 1 hadoop hadoop 46932744 10月 14 2015 000007_0.gz
-rw-r--r--. 1 hadoop hadoop 46880888 10月 14 2015 000008_0.gz

 

 

分享到:
评论

相关推荐

    Java写的hadoop压缩worldcount例子

    在Hadoop MapReduce中,可以通过配置`mapreduce.map.output.compress`和`mapreduce.reduce.output.compress`来开启输出数据的压缩。同时,需要指定相应的压缩编码器,例如`mapreduce.map.output.compress.codec`和`...

    hadoop-src源代码

    "hadoop-src"压缩文件包含了Hadoop项目的所有源代码,使得开发者能够直接在Eclipse等Java开发工具中进行深入研究和开发。 一、Hadoop概述 Hadoop是一个开源的分布式计算框架,由Apache基金会维护。它主要由两个核心...

    hadoop3.x带snappy(可用于windows本地开发)

    1. **数据压缩**:Snappy可以用于HDFS(Hadoop Distributed File System)中的数据压缩,减小存储空间,提高网络传输效率。 2. **MapReduce优化**:在MapReduce任务中,使用Snappy压缩可以减少数据传输时间和内存...

    实战hadoop中的源码

    【标题】"实战hadoop中的源码"涵盖了在大数据处理领域深入理解并应用Apache Hadoop的核心技术。Hadoop是开源的分布式计算框架,它允许在大规模集群上存储和处理海量数据。通过研究Hadoop的源码,开发者可以深入了解...

    Hadoop-2.8.5全面资料

    - **hadoop-eclipse-plugin-2.8.5.jar**:这是一个Eclipse插件,可以方便地在Eclipse IDE中进行Hadoop MapReduce程序的开发和调试。通过此插件,开发者可以直接在Eclipse中编写MapReduce任务,并将其提交到Hadoop...

    hadoop-eclipse-plugin-2.8.5.jar插件下载

    它将Hadoop的功能集成到Eclipse中,允许开发者直接在IDE内创建、编辑、构建和运行MapReduce作业,无需离开熟悉的开发环境。 在下载并安装hadoop-eclipse-plugin-2.8.5.jar后,你需要按照以下步骤配置Eclipse: 1. ...

    linux下maven在eclipse安装测试Hadoop.pdf

    以下将详细讲解如何在Linux上安装Maven,配置环境变量,以及如何在Eclipse中创建和测试Hadoop项目。 首先,你需要从Maven的官方网站上下载最新版本的Maven。下载完成后,将其解压缩到你的用户根目录下,例如`~/.m2`...

    hadoop的winutils,hadoop.dll

    打开Eclipse,进入`Window &gt; Preferences &gt; Java &gt; Build Path &gt; Classpath Variables`,点击`New...`创建一个新变量,变量名为`HADOOP_HOME`,变量值设置为你的Hadoop安装路径,即`C:\hadoop`。 4. 接下来,你需要...

    Eclipse链接Hadoop集群配置.docx

    为了更好地利用Hadoop的强大功能,开发人员经常需要在本地开发环境中与Hadoop集群进行交互。本文将详细介绍如何在Eclipse IDE中配置Hadoop集群,以便进行高效的大数据应用开发。 #### 二、准备工作 **1. 确保本地...

    本地调试所需hadoop包,hadoop-common-bin-master,winutils.exe

    winutils提供了类似于Linux环境下Hadoop命令的功能,如设置HADOOP_HOME环境变量、管理HDFS(Hadoop Distributed File System)以及执行其他与Hadoop相关的任务。 Hadoop的组成部分包括Hadoop Common、Hadoop HDFS...

    Hadoop_HBase_Pig

    接下来,安装`hadoop-0.20.1.tar.gz`至`/usr/hadoop`目录,使用`tar –xvzf hadoop-0.20.1.tar.gz`进行解压缩。在完成Hadoop的解压后,需修改`hadoop-0.20.1/conf`目录下的多个配置文件,包括但不限于: - `hadoop-...

    Ubuntu下创建hadoop组和hadoop用户.docx

    bin/hadoop jar share/hadoop/mapreduce/sources/hadoop-mapreduce-examples-2.4.0-sources.jar org.apache.hadoop.examples.WordCount input output ``` 最后,查看输出结果: ```bash cat output/* ``` 这个...

    Hadoop_windows运行解决办法

    导入该插件后,可以通过右键菜单在Eclipse中创建Hadoop MapReduce项目,编写MapReduce程序,并直接提交到本地运行的Hadoop集群。 在Eclipse中调试MapReduce程序时,需要配置JobTracker和TaskTracker的地址,这通常...

    hadoop源码分析

    Hadoop源码分析对于理解其内部工作原理、优化性能以及开发自定义功能至关重要。下面,我们将深入探讨Hadoop的核心组件,包括HDFS(Hadoop Distributed File System)和MapReduce,并结合源码解析其运作机制。 1. ...

    hadoop2.7.1 Windows安装依赖文件

    这个库常用于Hadoop中的数据压缩,以减小存储空间并加速I/O操作。 4. **yarn.cmd、hadoop.cmd、hdfs.cmd、mapred.cmd**: 这些是Hadoop的命令行脚本,分别对应于YARN(Yet Another Resource Negotiator)、Hadoop、...

    Hadoop本地环境配置 需要的文件hadoopdll和winutilexe.zip

    `hadoop.dll`通常用于解决Windows平台上的JNI(Java Native Interface)调用,使得Java代码能够与C++编写的原生代码交互,这对于Hadoop的一些核心功能至关重要。 其次,`winutils.exe`是Hadoop在Windows环境下的一...

    hadoop-on-windows.rar

    8. **运行Hadoop示例**:在Hadoop的bin目录下,使用`hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep input output 'dfs[a-z.]+'`命令,运行一个简单的MapReduce任务,验证Hadoop环境...

    hadoop的windows压缩包

    Hadoop通常在Linux环境下运行,因为它的分布式文件系统HDFS和MapReduce计算模型都设计为与Unix-like系统的命令行交互。在Windows上,我们需要配置环境变量、安装Java运行时环境(JRE)以及进行一些额外的设置才能使...

Global site tag (gtag.js) - Google Analytics