前几篇文章主要讲了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(四):编程进阶。有兴趣的童鞋请关注加米谷大数据,后续将持续分享大数据相关技术。需要大数据技术资料的童鞋可以关注本头条号后私信获取。
领取专属 10元无门槛券
私享最新 技术干货