作者n3oanderson (wake up ...)
看板java
标题Re: [问题] 资料量很大的处理
时间Sun Mar 11 22:17:41 2012
第一眼看起来可以用Hadoop MapReduce处理
- 资料更动不频繁 (HDFS write-once-read-multiple times)
- 资料格式 key value pair
key ... ... ... value1 ... valueN (一笔 record)
...
key key ... ... value1 ... valueN (一笔 record)
...
key key key ... value1 ... valueN (一笔 record)
...
Steps:
1.) 资料上传到HDFS
2.) Map phase:
针对每笔 record 处理 e.g. 依据 key 值 collect(value n)
Reduce phase:
依 key 值整合所有的资料 e.g. 把相同 key 值的资料 (value) 作整合
比如说有份时间/天气的资料表
02/Dec/1987 ... ... ... 11C ...
...
28/Feb/1945 ... ... ... 00C ...
...
16/Mar/1990 ... ... ... 32C ...
...
23/Jan/2011 ... ... ... 02C ...
...
02/Dec/1987 ... ... ... 12C ...
...
29/Aug/2012 ... ... ... 50C ...
...
Map phase:
def map(key: T, value: T, collector: OutputCollector, ...) {
// ... read from some where containing corresponded id as filter
// key -> 02/Dec/1987 value -> 11C
if(id.equals(key))
collector.collect(key, value);
}
Reduce phase:
def reduce(key T, values: Iterator, collector: OutputCollector ...) {
// iterate and then process values
// key -> 02/Dec/1987 values -> [11C, 12C]
while(values.hasNext()) {
// do something
}
}
※ 引述《johnhao1206 (Ya大熊)》之铭言:
: 现在正在写一个程式处理一个极大的文章 (256MB)
: 目前写的方法是硬把他存到二维阵列之中再去做处理
: 基本的格式是这样
: id data1 data2 data3 ...
: 现在困扰的是要去找到对应id的资料去做处理的时候
: 搜寻整个array需要花费相当多的时间 (也要考虑记忆体的问题)
: 上网看了几个方法但是好像不是我要的
: 1.File Channel
: 不用读入整个档案可以减少记忆体花费
: (但是external search不是很花时间吗?)
: 2.Map
: 有尝试用map的方法去做,但是这样耗费的记忆体好像会相当庞大
: (我初始给到512MB了还是会爆炸)
: 3.
: 这个不知道是不是方法,
: 想把原本的资料按照id排序之後再用binary search
: 希望可以增加搜寻速度
: 不知道各位有没有什麽方法处理这种问题?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.168.82.81
1F:→ sqrt998001:只有一台cluster,hadoop跑起来够力吗? 03/12 10:25
2F:推 johnhao1206:谢谢! 但我的应用好像不太适合用hadoop XD 03/14 00:55
3F:→ Lordaeron:你都用hash 了,不就是hadoop 了, 不适合? 03/15 22:41
4F:→ sqrt998001:hash = hadoop ??? 03/16 15:36