求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
要资料
 
 
 

Hadoop教程
Hadoop大数据解决方案
Hadoop介绍快速入门
Hadoop安装
Hadoop HDFS入门
MapReduce简介和入门
Hadoop程序入门实践
理解 MapReducer
MapReduce计数器和连接
MapReduce程序连接数据
Flume和Sqoop
Pig & Hive介绍
OOZIE 五分钟入门学习
 
 

理解 MapReducer
1095 次浏览
58次  

本教程中的代码分为 3 个部分:

1.解释 SalesMapper 类

2.解释 SalesCountryReducer 类

3.解释 SalesCountryDriver 类

SalesMapper类的说明

在本节中,我们将了解 SalesMapper 类的实现。

我们首先指定类的包名称。 SalesCountry 就是这个示例中使用的包名。请注意编译的输出,SalesMapper.class 将进入目录并命名这个软件包名称:SalesCountry.

其次,我们导入库软件包。

以下快照显示实现 SalesMapper 类 

代码解释:

1. SalesMapper 类定义

public class SalesMapper extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> {...}

每一个 mapper 类必须从 MapReduceBase 类进行扩展,它必须实现 Mapper 接口。

2. 定义 'map' 函数

Mapper类的主要部分是接受四个参数的 “map()” 方法。

每次调用 'map()' 方法, 一个键值 key-value 对 ('key' 和 'value' 在代码里) 被传递。

'map()' 方法开始被接受拆分输入文本作为一个参数,并使用分词来拆分这些行成词。

这里,“,” 被用作分隔符。

在这之后,使用记录在数组  'SingleCountryData' 中的第七索引,其值为 '1'.

output.collect(new Text(SingleCountryData[7]), one);

我们在选择第7索引记录,因为我们需要的国家数据,它位于数组 'SingleCountryData' 的第七索引。

请注意,我们输入的数据是下面的格式 (Country 在索引的位置为:7,  0 是开始的索引)-

Transaction_date,Product,Price,Payment_Type,Name,City,State,Country,Account_Created,Last_Login,Latitude,Longitude

mapper的输出使用的是 'OutputCollector' 的 'collect()' 方法的键值对.

SalesCountryReducer 类的说明

在本节中,我们将了解 SalesCountryReducer 类的实现。

1. 我们首先为类指定包的名称。SalesCountry 是包的名称。请注意编译的输出, SalesCountryReducer.class 将进入命名这个软件包名称目录: SalesCountry.

其次,我们导入库软件包。

以下快照显示实现 SalesCountryReducer 类

代码解释:

1. SalesCountryReducer 类定义 -

public class SalesCountryReducer extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {

此处,前两个数据类型, 'Text' 和 'IntWritable' 是输入键值的数据类型到reducer。

映射器的输出的形式<CountryName1, 1>, <CountryName2, 1>.映射器的输出被输入到reducer。所以,以配合其数据类型, Text 和 IntWritable 数据在这里输入被使用。

最后两个数据类型,'Text' 和 'IntWritable' 是由 reducer 的键 - 值对的形式生成的输出的数据类型。

每个 reducer 类必须从MapReduceBase类进行扩展,它必须实现 Reducer 接口。

2. Defining 'reduce' function-

输入到 reduce() 方法是在具有多个值的列表中选择一个键。

例如,在我们的示例中,这将是 -

<United Arab Emirates, 1>, <United Arab Emirates, 1>, <United Arab Emirates, 1>,<United Arab Emirates, 1>, <United Arab Emirates, 1>, <United Arab Emirates, 1>.

这赋予 reducer 作为 <United Arab Emirates, {1,1,1,1,1,1}>

因此,接受这种形式参数,前两个数据类型的使用,即 Text 和 Iterator<IntWritable>. Text是一个数据类型的键 和 Iterator<IntWritable>为对于键的值的列表的数据类型。

接下来的参数的类型是 OutputCollector<Text,IntWritable> 它收集 reducer 阶段的输出。

reduce() 方法开始通过复制键值和初始化频率计数为0。

Text key = t_key;

int frequencyForCountry = 0;

然后,使用 “while” 循环,我们通过与键关联的值列表循环,并通过总结所有计算的值。

现在,结果中的键得到的频率计数输出到收集器。

下面的代码执行这个 -

output.collect(key, new IntWritable(frequencyForCountry));

SalesCountryDriver类的说明

在本节中,我们将了解 SalesCountryDriver 类实现。

1. 我们首先为类指定包的名称。 SalesCountry 是这里使用的包名。请注意编译的输出, SalesCountryDriver.class 将进入命名这个包名称的目录: SalesCountry.

这里一行指定是包名称后面的代码是导入库软件包。

2. 定义一个用于创建一个新的客户端工作,配置 Mapper及Reducer 类对象驱动程序类。

该驱动程序类负责设置我们的 MapReduce 作业在 Hadoop 运行。 在这个类中,我们指定作业名称,输入/输出,mapper 和 reducer 类名称的数据类型。

3. 在下面的代码片段中,我们设置这是用来输入数据集消费和生产输出,分别输入和输出目录。

arg[0] 和 arg[1] 是通过 MapReduce 的实际操作,也就是赋予在命令行参数执行命令,

$HADOOP_HOME/bin/hadoop jar ProductSalePerCountry.jar /inputMapReduce /mapreduce_output_sales

4. 触发我们的作业

下面的代码开始执行 MapReduce 作业

try{             // Run the job            
 JobClient.runJob(job_conf);        
  } catch(Exception e) {           
    e.printStackTrace();         }

 


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



1095 次浏览
58次
 捐助