最近给热云公司共享数据,我们把原始数据给到他们,让他们做计算。每天同步一次,数据量压缩后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
相关推荐
在Hadoop MapReduce中,可以通过配置`mapreduce.map.output.compress`和`mapreduce.reduce.output.compress`来开启输出数据的压缩。同时,需要指定相应的压缩编码器,例如`mapreduce.map.output.compress.codec`和`...
"hadoop-src"压缩文件包含了Hadoop项目的所有源代码,使得开发者能够直接在Eclipse等Java开发工具中进行深入研究和开发。 一、Hadoop概述 Hadoop是一个开源的分布式计算框架,由Apache基金会维护。它主要由两个核心...
1. **数据压缩**:Snappy可以用于HDFS(Hadoop Distributed File System)中的数据压缩,减小存储空间,提高网络传输效率。 2. **MapReduce优化**:在MapReduce任务中,使用Snappy压缩可以减少数据传输时间和内存...
【标题】"实战hadoop中的源码"涵盖了在大数据处理领域深入理解并应用Apache Hadoop的核心技术。Hadoop是开源的分布式计算框架,它允许在大规模集群上存储和处理海量数据。通过研究Hadoop的源码,开发者可以深入了解...
- **hadoop-eclipse-plugin-2.8.5.jar**:这是一个Eclipse插件,可以方便地在Eclipse IDE中进行Hadoop MapReduce程序的开发和调试。通过此插件,开发者可以直接在Eclipse中编写MapReduce任务,并将其提交到Hadoop...
它将Hadoop的功能集成到Eclipse中,允许开发者直接在IDE内创建、编辑、构建和运行MapReduce作业,无需离开熟悉的开发环境。 在下载并安装hadoop-eclipse-plugin-2.8.5.jar后,你需要按照以下步骤配置Eclipse: 1. ...
以下将详细讲解如何在Linux上安装Maven,配置环境变量,以及如何在Eclipse中创建和测试Hadoop项目。 首先,你需要从Maven的官方网站上下载最新版本的Maven。下载完成后,将其解压缩到你的用户根目录下,例如`~/.m2`...
打开Eclipse,进入`Window > Preferences > Java > Build Path > Classpath Variables`,点击`New...`创建一个新变量,变量名为`HADOOP_HOME`,变量值设置为你的Hadoop安装路径,即`C:\hadoop`。 4. 接下来,你需要...
为了更好地利用Hadoop的强大功能,开发人员经常需要在本地开发环境中与Hadoop集群进行交互。本文将详细介绍如何在Eclipse IDE中配置Hadoop集群,以便进行高效的大数据应用开发。 #### 二、准备工作 **1. 确保本地...
winutils提供了类似于Linux环境下Hadoop命令的功能,如设置HADOOP_HOME环境变量、管理HDFS(Hadoop Distributed File System)以及执行其他与Hadoop相关的任务。 Hadoop的组成部分包括Hadoop Common、Hadoop HDFS...
接下来,安装`hadoop-0.20.1.tar.gz`至`/usr/hadoop`目录,使用`tar –xvzf hadoop-0.20.1.tar.gz`进行解压缩。在完成Hadoop的解压后,需修改`hadoop-0.20.1/conf`目录下的多个配置文件,包括但不限于: - `hadoop-...
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/* ``` 这个...
导入该插件后,可以通过右键菜单在Eclipse中创建Hadoop MapReduce项目,编写MapReduce程序,并直接提交到本地运行的Hadoop集群。 在Eclipse中调试MapReduce程序时,需要配置JobTracker和TaskTracker的地址,这通常...
Hadoop源码分析对于理解其内部工作原理、优化性能以及开发自定义功能至关重要。下面,我们将深入探讨Hadoop的核心组件,包括HDFS(Hadoop Distributed File System)和MapReduce,并结合源码解析其运作机制。 1. ...
这个库常用于Hadoop中的数据压缩,以减小存储空间并加速I/O操作。 4. **yarn.cmd、hadoop.cmd、hdfs.cmd、mapred.cmd**: 这些是Hadoop的命令行脚本,分别对应于YARN(Yet Another Resource Negotiator)、Hadoop、...
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.dll`通常用于解决Windows平台上的JNI(Java Native Interface)调用,使得Java代码能够与C++编写的原生代码交互,这对于Hadoop的一些核心功能至关重要。 其次,`winutils.exe`是Hadoop在Windows环境下的一...
Hadoop通常在Linux环境下运行,因为它的分布式文件系统HDFS和MapReduce计算模型都设计为与Unix-like系统的命令行交互。在Windows上,我们需要配置环境变量、安装Java运行时环境(JRE)以及进行一些额外的设置才能使...