`
Yinny
  • 浏览: 295006 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

搜索切换dump之MapReduce讲解

阅读更多
分享聚合dump的是评价的数据库,由于数据量超大且经常超时所以进行了数据源的切换,即从数据库dump切换为云梯dump,整个工作就是由一个mr的job去云梯读取数据然后进行一系列转化最后输出数据到文件的过程。

对于MapReduce编程模型,网上有很多文章,自己去学习哈,在这里不再赘述啦~,此处就这次mr的代码进行讲解。
MR的核心一共三个类,Mapper,Reduce和Submitter,其余的都是做一些数据转换的类。
首先来看Mapper类:
Map类中map方法的分析:

public class FullIndexMatrixtaodanMapper extends MapReduceBase implements Mapper<Writable, Text, LongWritable, IndexMatrixtaodanWriter> {

	private final LongWritable auctionId = new LongWritable(0);

	private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

	
	@Override
	public void map(Writable key, Text value, OutputCollector<LongWritable, IndexMatrixtaodanWriter> output, Reporter reporter) throws IOException {
		String line = value.toString();
		// 评价表
		String[] records = this.splitRecords(line);
		long userId = NumberUtils.toLong(records[1], 0l);
		if (userId == 0l) {
			return;
		}
		auctionId.set(userId);
		IndexMatrixtaodanWriter record = this.buildFeedToTaodanWriter(records);
		if (null != record) {
			output.collect(auctionId, record);
		}

	}
}

Map类继承自MapReduceBase,并且它实现了Mapper接口,此接口是一个规范类型,它有4种形式的参数,分别用来指定map的输入key值类型、输入value值类型、输出key值类型和输出value值类型。mapper的输入数据类型由InputFormat控制,默认的输入格式是TextInputFormat,它会以(LongWritable,Text)键值对的方式加载数据。long值表示某一行在文件中的偏移量,Text对象则保存某一行的字符串内容。在本例中map的输入类型为<LongWritable,Text>,(其实map的输入key没啥作用,它表示在一行中的偏移量),在这个日常中需要输出<userId,淘单对象>这样的形式,因此输出的key值类型是LongWritable,输出的value值类型是IndexMatrixtaodanWriter(输出的淘单对象)。

  实现此接口类还需要实现map方法,map方法会具体负责对输入进行操作,在本例中,map方法对输入的行以空格为单位进行切分,然后使用OutputCollect收集输出的<userId,IndexMatrixtaodanWriter>,OutputCollector 由 Hadoop 框架提供, 负责收集 Mapper 和 Reducer 的输出数据,实现 map 函数和 reduce 函数时,只需要简单地将其输出的 <key,value> 对往 OutputCollector 中一丢即可,剩余的事框架自会帮你处理好。


Reduce中reduce方法的分析:

public class FullIndexMatrixtaodanReduce extends MapReduceBase implements Reducer<LongWritable, IndexMatrixtaodanWriter, Text, Text> {

	private final Text outContent = new Text();

	@Override
	public void reduce(LongWritable key, Iterator<IndexMatrixtaodanWriter> values, OutputCollector<Text, Text> output, Reporter reporter) throws IOException {
		String rowIndex = null;

		while (values.hasNext()) {
			IndexMatrixtaodanWriter taodanWriter = values.next();
			MatrixtaodanSearchSchemaDo taodanSchemaDo = adaptoTaodanSchemaDO(taodanWriter);
            try {
                rowIndex = taodanSchemaDo.unmarshall();
                outContent.set(rowIndex);
                output.collect(null, outContent);
            } catch (MarshallRateException e) {
            }
        }

	}
}

Reduce类也是继承自MapReduceBase的,需要实现Reducer接口。Reduce类以map的输出作为输入,因此Reduce的输入类型是<userId,IndexMatrixtaodanWriter>。而Reduce的输出用户id和对应的淘单对象,因此,它的输出类型是<LongWritable,Text>。Reduce类也要实现reduce方法,在此方法中,reduce函数将输入的key值作为输出的key值,然后将获得多个value值加起来,作为输出的值。

提交任务,运行:
public class FullIndexTaodanJobSubmitter {

	public static void main(String[] args) throws Exception {

		String jobName = JOB_NAME_FULLINDEX_MATRIXTAODAN;

		// 任务结束后,时间文件路径放在数据文件路径中,文件名为tsearcher.ok,内容为yyyyMMddHHmmss

		JobConf conf = new JobConf(FullIndexTaodanJobSubmitter.class);
		conf.setJobName(jobName);
		// 中间结果输出格式 默认和output一致
		conf.setMapOutputKeyClass(LongWritable.class);
		conf.setMapOutputValueClass(IndexMatrixtaodanWriter.class);
		conf.setOutputKeyClass(Text.class);
		conf.setOutputValueClass(Text.class);
		conf.setReducerClass(FullIndexMatrixtaodanReduce.class);

		// 重新分配reduce任务数 90
		conf.setNumReduceTasks(FULL_INDEX_REDUCE_COUNT);
		// reduce 最后输出结果格式。
		conf.setOutputFormat(TextOutputFormat.class);
		// 评价数据源mapper
		MultipleInputs.addInputPath(conf, new Path(args[0]), TextInputFormat.class, FullIndexMatrixtaodanMapper.class);

		FileOutputFormat.setOutputPath(conf, new Path(args[1]));

		JobClient.runJob(conf);

	}

}



main方法是整个mr任务的入口,在 Hadoop 可以通过一个 JobConf 对象设置如何运行这个 job,此处定义了job的名字,map输出的 key 的类型是 LongWritable, value 的类型是 IndexMatrixtaodanWriter, 指定FullIndexMatrixtaodanReduce作为 Reducer 类, 任务的输入路径和输出路径由命令行参数指定,这样 job 运行时会处理输入路径下的所有文件,并将计算结果写到输出路径下。
然后将 JobConf 对象作为参数,调用 JobClient 的 runJob, 开始执行这个计算任务。

如果作业中涉及到对不同的数据集进行连接(join),即定义多个不同的数据输入源时,可用MultipleInputs.addInputPath(JobConf conf, InputPath, TextInputFormat.class, Mapper.class) 这个方法原理是多个数据源就采用多个map来处理,以上任务中只涉及一个数据源,没有多表join,故可用 FileInputFormat.addInputPath(conf, new Path(inputPath));
分享到:
评论

相关推荐

    dump文件生成工具DumpTool

    DumpTool主要用来在用户机器上对目标进程生成dump文件,定位“卡死”、Crash等问题。 (1)MiniDump: 表示生成一个包含必要信息的dump文件,文件大小约200-500k,具体Flag =MiniDumpNormal|...

    MTK系统DUMP之Crash-8.0.1工具

    MTK(MediaTek)系统DUMP之Crash-8.0.1工具是专为基于MediaTek芯片的Android设备设计的故障排查和日志收集工具。这个工具主要用于当设备遇到崩溃或异常情况时,帮助开发者或者技术人员分析并解决系统问题。在Android...

    dump1090-win.1.10.3010.14_dump1090win_dump1090_eastixg_

    标题 "dump1090-win.1.10.3010.14_dump1090win_dump1090_eastixg_" 指的是一个针对Windows平台的dump1090软件的特定版本。这个软件主要用于接收和处理航空雷达数据,特别是与RTL-SDR(低成本软件定义无线电)设备...

    dumptxt转换工具

    标题中的“dumptxt转换工具”指的是一个程序或软件,其主要功能是将特定格式的“dump”文件转换成常见的文本文件(txt)。在IT领域,dump文件通常是指系统崩溃时产生的内存转储,或者数据库的备份文件,它们包含了...

    C++生成dump文件

    现在,我们来详细讲解如何在C++ Windows工程中生成dump文件。 首先,我们需要包含相应的头文件。在`main.cpp`中,引入`windows.h`和`dbghelp.h`,这两个头文件分别提供了Windows API和用于处理dump文件的API: ```...

    heapdump分析工具

    在Java应用程序中,内存管理是性能优化的关键环节。当遇到应用程序运行缓慢,频繁出现Full GC,甚至出现OutOfMemoryError等问题时,我们...正确使用heapdump工具和相关的分析资源,是每个Java开发者必备的技能之一。

    c++ 自动dump AutoDump

    C++ 自动dump,也称为自动崩溃转储(Automatic Dump),是编程中一种常见的调试技术。当应用程序出现异常或者崩溃时,系统会自动保存当前进程的状态,包括内存映射、堆栈信息、线程状态等,形成一个dump文件。这个...

    高通core dump解析工具

    本篇文章主要针对“高通core dump解析工具”进行详细讲解。 首先,我们需要理解“高通”在这个场景下可能指的是高通公司的芯片或平台,因为高通是全球知名的半导体制造商,尤其在移动通信领域有着广泛的影响。其...

    DUMP_C++_dump_

    在C++编程中,捕获内存相关错误并生成dump文件是一项关键的技术,它能帮助开发者在程序崩溃或出现异常时分析问题原因。"DUMP_C++_dump_"这个标题暗示了我们将讨论如何在C++中处理内存错误并创建内存转储(dump)文件...

    C++ 生成Dump文件

    为了解决这些问题,开发者通常需要借助调试工具,其中一种常用的方法是生成Dump文件。Dump文件可以记录程序崩溃时的内存状态,包括堆栈信息、线程状态、内存分配等,帮助开发者定位问题所在。 "C++ 生成Dump文件"是...

    Dump文件转txt

    Dump文件是一种用于记录系统或应用程序在异常崩溃时内存状态的文件,它包含了程序运行时的内存快照,通常用于故障排查和调试。将Dump文件转换为txt文本文件可以帮助开发者更方便地阅读和分析这些数据,寻找可能导致...

    IBM分析dump文件工具

    IBM分析dump文件工具是针对IBM软件系统中出现的问题或异常情况的一种诊断手段。在IBM的众多产品线中,如DB2数据库、WebSphere应用服务器、z/OS操作系统等,都有可能产生dump文件,这些文件记录了系统运行时的内存...

    dump文件对比软件.rar

    在IT行业中,dump文件是一种常见的数据转储格式,通常用于记录系统或应用程序的内存状态,以便于调试和故障排查。本文将深入探讨dump文件、如何使用对比软件进行分析以及与IC卡相关的技术。 首先,我们需要了解dump...

    heapdump-tool工具

    【标题】:heapdump-tool工具 【正文】: 在IT领域,内存管理是优化系统性能的关键环节,尤其是在Java应用程序中。Heapdump-tool工具是专为Java开发者设计的,用于生成和分析堆转储(Heap Dump)文件的强大工具。...

    Linux下生成core dump

    ### Linux下生成Core Dump详解 #### 一、Core Dump简介 在Linux环境下,当一个程序因为某种原因(如段错误)而崩溃时,系统可以自动为该程序创建一个名为“core dump”的文件。这个文件包含了程序崩溃时内存的快照...

    ramdump-tools

    在IT行业中,尤其是在移动设备和嵌入式系统的故障排查领域,ramdump是一个至关重要的概念。ramdump-tools是一款针对高通方案设备的专业宕机本地ramdump分析工具,它提供了比高通在线宕机分析工具qcap更为强大和便捷...

    Dump文件编辑中文版

    Dump文件编辑中文版 分析DUMP文件数据 修改数据

    Windows下如何手工抓取was的dump文件

    在Windows操作系统中,手工抓取WebSphere Application Server (WAS) 的dump文件是解决系统异常、性能问题或诊断故障的重要步骤。以下是一个详尽的指南,涵盖了如何在Windows环境下进行这个过程。 首先,理解什么是...

    window COREdump文件生成 c++代码

    在Windows操作系统上,生成Coredump文件对于调试和分析C++程序崩溃原因至关重要。Coredump文件包含了程序崩溃时内存中的关键信息,如进程的内存映射、全局变量、堆栈信息等,使得开发者能够定位到问题的具体位置,...

Global site tag (gtag.js) - Google Analytics