知识点
相关文章
更多最近更新
更多Hadoop Map-Reduce的压缩最终输出文件
2019-03-28 13:42|来源: 网络
Hadoop 可以在作业的Configuration对象中通过设定一系列参数来改变作业的行为,比如,我们需要进行一个map-reduce作业,并且吧最终作业reduce过程的结果输出为压缩的格式,我们可以在一般的map-reduce上进行一些定制。
实现
还是以以前做的删选最高气温的例子为参照:
以前的例子可以见这篇文章:http://www.linuxidc.com/Linux/2012-05/61196.htm
我们现在要求让结果输出为压缩格式,所以保持Map类(MaxTemperatureMapper)和Reduce类(MaxTemperatureReducer)不变,只要在Job类的Configuration作一些压缩的配置即可,见第45-49行所示:
- package com.charles.parseweather.compression;
- import org.apache.hadoop.conf.Configuration;
- import org.apache.hadoop.fs.Path;
- import org.apache.hadoop.io.IntWritable;
- import org.apache.hadoop.io.Text;
- import org.apache.hadoop.io.compress.CompressionCodec;
- import org.apache.hadoop.io.compress.GzipCodec;
- import org.apache.hadoop.mapreduce.Job;
- import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
- import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
- import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
- import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
- /**
- *
- *
- * Description: 这个类定义并且运行作业,压缩版
- *
- * @author charles.wang
- * @created May 24, 2012 5:29:12 PM
- *
- */
- public class MaxTemperatureWithCompression {
- /**
- * @param args
- */
- public static void main(String[] args) throws Exception{
- // TODO Auto-generated method stub
- if (args.length !=2){
- System.err.println("Usage: MaxTemperature <input path> <output path>");
- System.exit(-1);
- }
- //创建一个Map-Reduce的作业
- Configuration conf = new Configuration();
- conf.set("hadoop.job.ugi", "hadoop-user,hadoop-user");
- //在这里我们配置一些和压缩有关的参数
- //我们设定reduce输出结果使用gzip压缩的形式
- conf.setBoolean("mapred.output.compress", true);
- conf.setClass("mapred.output.compression.codec", GzipCodec.class, CompressionCodec.class);
- Job job = new Job(conf,"Get Maximum Weather Information with Compression! ^_^");
- //设定作业的启动类/
- job.setJarByClass(MaxTemperatureWithCompression.class);
- //解析输入和输出参数,分别作为作业的输入和输出,都是文件
- FileInputFormat.addInputPath(job, new Path(args[0]));
- FileOutputFormat.setOutputPath(job, new Path(args[1]));
- //配置作业,设定Mapper类,Reducer类
- job.setMapperClass(MaxTemperatureMapper.class);
- job.setReducerClass(MaxTemperatureReducer.class);
- job.setOutputKeyClass(Text.class);
- job.setOutputValueClass(IntWritable.class);
- System.exit(job.waitForCompletion(true)?0:1);
- }
- }
要运行这个例子,我们需要给出输入文件,因为Hadoop系统可以根据输入文件的扩展名自动识别基本文件,所以我们创建目录结构,并且上传一个gzip格式的文件作为map-reduce过程的输入:
然后我们运行的main中传入HDFS的输入文件和输出目录:
当执行完成之后,我们就可以在HDFS文件系统中看到最终的输出结果了,正如我们所预期的,这个结果是个gzip格式的文件:
相关问答
更多-
关于hadoop的问题,进来看看呀[2023-07-31]
java是执行文件,不是目录 java path默认是java_home/bin/目录 这个目录底下应该 java和javac等文件 -
远程运行Hadoop map-reduce作业导致EOFException?(Runnning Hadoop map-reduce job remotely causes EOFException?)[2023-07-11]
问题是客户端使用的是不同版本的Hadoop API(0.23.0),然后是Hadoop安装。 The problem was that client was using different version of Hadoop API (0.23.0) then the Hadoop instalation. -
JobTracker Web UI为您提供了非常有用的报告,可以比较每个映射器和reducer的可用日志。 另请查看hadoop-test.jar存档中的mrbench类。 网上有大量有关Hadoop集群基准测试用法的信息,如本文所述 。 JobTracker web UI gives you very useful reports which allow to compare everything up to available logs for every mapper and reducer. Als ...
-
这个想法的问题是Hadoop没有“分布式内存”的概念。 如果你想让结果“在内存中”,下一个问题必须是“哪台机器的内存?” 如果你真的想要这样访问它,你将不得不编写自己的自定义输出格式,然后使用一些现有的框架在机器之间共享内存,或者再次编写自己的。 我的建议是简单地写入HDFS,然后对于非MapReduce业务逻辑,首先通过FileSystem API从HDFS读取数据,即: FileSystem fs = new JobClient(conf).getFs(); Path outputPath = new ...
-
终于搞定了,实际上我改变了 conf.setOutputKeyComparatorClass(TaggedJoiningGroupingComparator.class); 至 conf.setOutputValueGroupingComparator(TaggedJoiningGroupingComparator.class); 也来自hadoop API文档。 - setOutputValueGroupingComparator(Class extends RawComparator> the ...
-
Muliple集合作为hadoop map-reduce工作的mongodb的输入(Muliple collections as input of mongodb for hadoop map-reduce job)[2022-01-18]
谢谢你指出这个问题。 这是一个例子中的错误。 已提交HADOOP-109来解决此问题。 我通过将子拆分器类作为所有输入集合的null来修复该问题。 请参阅此拉取请求 。 为了使其正常工作,请确保将以下参数传递给Hadoop: -D mongo.splitter.class=com.mongodb.hadoop.splitter.MultiMongoCollectionSplitter 以上修复是一种解决方法。 为您提供有关该问题的更多详细信息。 根据设计,子分割器类可以是除MultiMongoCollec ... -
我建议通过Pig或Hive运行它,因为你可以用几行来解决这种问题。 如果做不到这一点,我会做以下事情。 在已连接的数据上运行另一个MapReduce作业,并执行以下操作:在映射器中,对于每个输入拆分,保留每个国家/地区ID处理的最小订单,最大订单和元组数(具有唯一用户ID的行)的选项卡。 只有少数几个国家/地区,因此您可以在整个地图工作中将这些统计信息保存在内存中。 在拆分结束时,将累计的统计数据输出到按国家/地区ID键入的reducer。 然后,reducer简单地组合来自每个拆分的聚合数据,以找到全局m ...
-
可以使用SQOOP和HIVE 。 您可以使用SQOOP将数据从mysql表传输到HDFS,然后再传输到HIVE 。 从HIVE(操作后),您可以将表导出回Mysql。 示例: 首先下载mysql-connector-java-5.0.8并将jar放到Sqoop的lib和bin文件夹中 在Hive中创建具有精确字段名称和类型的表定义,如在mysql中 sqoop import --verbose --fields-terminated-by',' - connect jdbc:mysql:// localho ...
-
从作业跟踪器中,确定执行此任务的hadoop节点。 SSH到该节点并识别hadoop.log.dir目录的位置(检查此节点的mapred-site.xml) - 我的猜测是hadoop用户没有在此文件夹中创建子目录的正确权限 它尝试创建的实际文件夹位于$ {hadoop.log.dir} / userlogs文件夹下 - 检查此文件夹是否具有正确的权限 在你的情况下,看看ps输出,我猜这是你需要检查权限的文件夹: /home/hadoopmachine/hadoop-1.0.1/libexec/../log ...
-
您需要提供SequenceFileAsTextInputFormat作为hadoop流jar的输入inputformat 。 我从来没有使用过amazon aws mapreduce,但是在正常的hadoop安装上它会这样做: HADOOP=$HADOOP_HOME/bin/hadoop $HADOOP jar $HADOOP_HOME/contrib/streaming/hadoop-*-streaming.jar \ -input
-output