MR程序编写

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/asdfgggggggg/article/details/52163399

做了一个有关于读取三张hbase表处理进行统一处理的项目:

(1)MR中读取多张表:TableMapReduceUtil.initTableMapperJob()支持对多张scan组成的list,每个scan是对每张表的浏览,其中scan又可以对表进行过滤类似于hbase。

<span style="font-size:14px;">List scans = new ArrayList<>();
		
Scan scan1 = new Scan();
scan1.setAttribute(Scan.SCAN_ATTRIBUTES_TABLE_NAME, "7111".getBytes());
scans.add(scan1);
		
Scan scan2 = new Scan();
scan2.setAttribute(Scan.SCAN_ATTRIBUTES_TABLE_NAME, "8111".getBytes());
scans.add(scan2);
	
Scan scan3 = new Scan();
scan3.setAttribute(Scan.SCAN_ATTRIBUTES_TABLE_NAME, "9111".getBytes());
scans.add(scan3);

TableMapReduceUtil.initTableMapperJob(scans, MyMapper.class, Text.class, Text.class, job);</span>

(2)在Hbase中不同的表有相同的行健,可以存在相同的列族与列。此时需要筛选数据得到不同的数据,这时候就需要区分度,这次是侥幸,行键由时间戳构成易于区分。可以在全局configure中传递数据,使用context.getConfiguration.get()获取数据,但是在每次执行map(实际上每次读取hbase表,都是重新执行一次map阶段)的时候又会重新获取configuration,所以获取的数据又是初始值。

(3)写入本地文件,在本地运行MR的时候,在静态代码块中定义好

conf.set("fs.default.name", "hdfs://localhost:9000")
如果添加这句代码,默认的是hdfs文件系统机hadoop存储系统,如果不添加的话便是存储在本地的系统中。但是还没有研究如果在分布式条件下是什么情况,还有就是伪分布式条件下的集群运行。

(4)在MR运行的过程中,map阶段结束后,进入shuffle阶段会进行一次排序,此时如果设置了Combine,又会进行一次设置即执行了一次Reducer代码阶段。切记是否需要两次同时执行。

(5)CSV文件是逗号分隔符文件(并不局限于这一种符号,还可以是其他的符号,如分号、Tab键、引号等),这种文件可以使用excel文件进行打开,在打开时,首先新建一个excel文件,然后数据---本地文本--选择CSV文件,接下来根据提示进行操作就可以了。
(6)conf在加入参数的时候一定要在job定义之前,因为job的定义是以configuration问参数的。

猜你喜欢

转载自blog.csdn.net/asdfgggggggg/article/details/52163399
MR