使用Partitioner實現輸出到多個檔案

2022-04-10 10:39:04 字數 1965 閱讀 5972

1、需求

按學生的年齡段,將資料輸出到不同的檔案。這裡我們分為三個年齡段:小於等於20歲、大於20歲小於等於50歲和大於50歲

2、實現

1、編寫partitioner,**如下

public

static

class studentpartitioner extends partitioner

else

if (ageint <= 50)

else

}}

public

static

@override

protected

void map(longwritable key, text value,context context) throws

ioexception, interruptedexception

}}

3、編寫reducer

public

static

class studentreducer extends reducer

}}

4、一些執行**

@override

public

int run(string arg0) throws

exception

//新建乙個任務

job job = new job(conf, "partitionerdemo");

//設定主類

job.setjarbyclass(studentpartitioner.class

);

//輸入路徑

fileinputformat.addinputpath(job, new path(arg0[0]));

//輸出路徑

fileoutputformat.setoutputpath(job, new path(arg0[1]));

//);

//reducer

job.setreducerclass(studentreducer.class

);

// job.setmapoutputkeyclass(intwritable.class

); job.setmapoutputvalueclass(text.

class

);

//reducer輸出格式

job.setoutputkeyclass(nullwritable.class

);

job.setoutputvalueclass(text.

class

);

//設定partitioner類

job.setpartitionerclass(studentpartitioner.class

);

//reduce個數設定為3

job.setnumreducetasks(3);

//提交任務

return job.waitforcompletion(true)?0:1;

}

public

static

void main(string args0) throws

exception ;

int ec = toolrunner.run(new configuration(), new

studentagepartitionerdemo(), args0);

system.exit(ec);

}

3、總結

partitioner適用於事先知道分割槽數的情況下,比如像上面這個需求

缺點:1、在作業執行之前需要知道分割槽數,也就是年齡段的個數,如果分割槽數未知,就無法操作。

2、一般來說,讓應用程式來嚴格限定分割槽數並不好,因為可能導致分割槽數少或分割槽不均

】。

spark的自定義partitioner

在hadoop的mapreduce中預設patitioner是hashpartitioner,我們可以自定義partitioner可以有效防止資料傾斜,在spark裡面也是一樣,在spark裡也是預設的hashpartitioner,如果自己想自己定義partitioner繼承org.apache....

使用Apache HTTPServer實現負載均衡

採用http 模式配置方法 修改conf目錄下的httpd.conf檔案 第一步 載入module loadmodule proxy module modules mod proxy.so loadmodule proxy balancer module modules mod proxy bala...

使用陣列實現棧,使用單向鍊錶實現佇列

棧 源 使用陣列實現棧的 出棧 入棧 返回棧頂元素 取得棧的大小 及棧的複製 最重要的是定義結構體,結構體內部兩個屬性,乙個 int 型陣列,乙個 top 表示陣列內的有效資料為 top 個。include include include typedef int datetype define ma...