Hadoop 分布式计算模型MapReduce(四):编程进阶

前几篇文章主要讲了MapReduce的概念、思想、原理剖析以及编程基础,本章将进一步讲解MapReduce编程,通过本章的讲解相信大家可以基本掌握MapReduce的编程技术,能知道如何在项目中应用。

1、传递全局变量

1)全局变量写入

public static void main(String[] args) {

try {

Configuration conf = new Configuration();

conf.set("parameter1", "value1");

conf.set("parameter2", "value2");

Job job = Job.getInstance(conf);

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (Exception e) {

e.printStackTrace();

}

}

2)在Mapper类的Map函数中获取全局变量

public void map(Object key, Text value, Context context)

throws IOException, InterruptedException {

Configuration conf = context.getConfiguration();

String value1 = conf.get("parameter1");

String value2 = conf.get("parameter2");

}

3)在reducer类的reduce函数中获取全局变量

public void reduce(Text key, Iterablevalues, Context

context ) throws IOException, InterruptedException {

Configuration conf = context.getConfiguration();

String value1 = conf.get("parameter1");

String value2 = conf.get("parameter2");

}

2、InputFormat

1)FileInputFormat

FileInputFormat

是所有使用文件作为其数据源的InputFormat实现的基类。

它提供了两个功能:

一个定义哪些文件包含在一个作业的输入中;

一个为输入文件生成分片的实现。

把分片分割成记录的作业由其子类来完成。

2)FilelnputFormat类的输入路径与过滤器

FileInputFormat提供四种静态方法来设定JobConf的输入路径:

public static void addInputPath(JobConf conf, Path path)

public static void addInputPaths(JobConf conf, String commaSeparatedPaths)

public static void setInputPaths(JobConf conf, Path…inputPaths)

public static void setInputPaths(JobConf conf, String commaSeparatedPaths)

如果需要排除特定文件,可以使用FileInputFormat的setInputPathFilter()方法设置一个过滤器。

3)文本输入

Hadoop非常擅长处理非结构化文本数据;

TextInputFormat是默认的InputFormat

每条记录是一行输入;

键是LongWritable类型,存储该行在整个文件中的字节偏移量;

值是这行的内容,不包括任何行终止符(换行符和回车符),它是Text类型的。

4)二进制输入

Hadoop的MapReduce不只是可以处理文本信息,它还可以处理二进制格式的数据。

Hadoop的顺序文件格式存储二进制的键/值对的序列。

如果要用顺序文件数据作为MapReduce的输入,应用sequenceFileInputFormat。

键和值是由顺序文件决定,所以只需要保证map输入的类型匹配。

5)数据库输入

DBInputFormat这种输入格式用于使用JDBC从关系数据库中读取数据。

没有任何共享能力,所以在访问数据库的时候必须非常小心,在运行太多的mapper数据库中读数据可能会使数据库受不了;

正是由于这个原因,DBInputFormat最好用于加载小量的数据集;

与来自HDFS的大数据集连接,要使用MultipleInputs,与之相对应的输出格式是DBOutputFormat,它适用于将作业输出数据(中等规模的数据)转储到数据库。

3、OutputFormat

1)文本输出

默认的输出格式是TextOutputFormat

每条记录写为文本行;

键和值可以是任意类型,TextOutputFormat调用toString()方法把它们转换为字符串;

与TextoutputFormat对应的输入格式是KeyValueTextInputFormat,它通过可配置的分隔符将为键/值对文本行分隔。

2)二进制输出

SequenceFileOutputFormat将它的输出写为一个顺序文件。

如果输出需要作为后续MapReduce任务的输入,这便是一种好的输出格式,因为它的格式紧凑,很容易被压缩;

压缩由SequenceFileoutputFormat的静态方法来实现。

SequenceFileAsBinary0utputFormat与SequenceFileAsBinaryInputForrmat相对应,它把键/值对作为二进制格式写到一个SequenceFile容器中。

3)多个输出

FileOutputFormat及其子类产生的文件放在输出目录下。

每个reducer一个文件并且文件由分区号命名:part-00000, part-00001,等等。

有时可能需要对输出的文件名进行控制,或让每个reducer输出多个文件。MapReduce为此提供了两个库 Multiple0utputFormat和Multiple0utput类。

加米谷大数据Hadoop 分布式计算模型MapReduce(四):编程进阶。有兴趣的童鞋请关注加米谷大数据,后续将持续分享大数据相关技术。需要大数据技术资料的童鞋可以关注本头条号后私信获取。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180206A0NGSS00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券