为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用Hadoop的Partitioner?

/ 猿问

如何使用Hadoop的Partitioner?

偶然的你 2019-01-29 07:07:59

如何使用Hadoop的Partitioner


查看完整描述

3 回答

?
Cats萌萌
  1. 想使用Partitioner,首先需要知道这个东西是做什么的。

  2. Partitioner partitions the key space.

    Partitioner controls the partitioning of the keys of the intermediate map-outputs. The key (or a subset of the key) is used to derive the partition, typically by a hash function. The total number of partitions is the same as the number of reduce tasks for the job. Hence this controls which of the m reduce tasks the intermediate key (and hence the record) is sent to for reduction.

    HashPartitioner is the default Partitioner.

    大概意思就是:Partitioner控制着map任务的输出的key的分区,也就是会根据Partitioner对key进行分区,以方便传输给不同的reduce节点处理,分区的总数等于reduce的任务个数。默认的Partitioner是HashPartitioner。

       引用自

http://hadoop.apache.org/docs/r2.7.2/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html#Partitioner


2. 如何使用?

......

Configuration conf = getConf();

//Create JobJob job = new Job(conf, "hello");......//set partitioner statementjob.setPartitionerClass(HashPartitioner.class);


查看完整回答
反对 回复 2019-03-20
?
富国沪深

  (Partition)分区出现的必要性,如何使用Hadoop产生一个全局排序的文件?最简单的方法就是使用一个分区,但是该方法在处理大型文件时效率极低,因为一台机器必须处理所有输出文件,从而完全丧失了MapReduce所提供的并行架构的优势。
  事实上我们可以这样做,首先创建一系列排好序的文件;其次,串联这些文件(类似于归并排序);最后得到一个全局有序的文件。主要的思路是使用一个partitioner来描述全局排序的输出。比方说我们有1000个1-10000的数据,跑10个ruduce任务, 如果我们运行进行partition的时候,能够将在1-1000中数据的分配到第一个reduce中,1001-2000的数据分配到第二个reduce中,以此类推。即第n个reduce所分配到的数据全部大于第n-1个reduce中的数据。
  这样,每个reduce出来之后都是有序的了,我们只要cat所有的输出文件,变成一个大的文件,就都是有序的了
基本思路就是这样,但是现在有一个问题,就是数据的区间如何划分,在数据量大,还有我们并不清楚数据分布的情况下。一个比较简单的方法就是采样,假如有一亿的数据,我们可以对数据进行采样,如取10000个数据采样,然后对采样数据分区间。在Hadoop中,patition我们可以用TotalOrderPartitioner替换默认的分区。然后将采样的结果传给他,就可以实现我们想要的分区。在采样时,我们可以使用hadoop的几种采样工具,RandomSampler,InputSampler,IntervalSampler。
这样,我们就可以对利用分布式文件系统进行大数据量的排序了,我们也可以重写Partitioner类中的compare函数,来定义比较的规则,从而可以实现字符串或其他非数字类型的排序,也可以实现二次排序乃至多次排序。 转载,仅供参考。



查看完整回答
反对 回复 2019-03-20
?
翻过高山走不出你

创建表
create table pageView5(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)partitioned by (hours string ,mm string)
row format delimited fields terminated by '\001'
location '/user/beicai/hive4';
分区---------》

insert overwrite table pageView5 partition (hours,mm)
select *,substr(track_time,12,2),substr(track_time,15,2) from pageView4 limit 500;



查看完整回答
反对 回复 2019-03-20

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信