jazz 寫:
sunbinbinbol 寫:
起始map输入只有一行,程序把reduce处理后的输出作为map的输出,数据的行数越来越多。我在伪分布式下观察运行过程中的信息,map处理越来越慢,随着reduce输出行数得减少,又慢慢变快;后来我用5个节点全分布式运行,运行时间和原来的伪分布式差不多,map处理依然是先快后慢又快。我阅读的文献中运行时间是1259秒,我得程序运行了一个小时。我不太明白为什么,来问问Jazz大大

上述程式碼,大約可以看得出疊代的動作。不過執行速度受很多因素影響。
您看到的文獻資料,也得查一下用了幾個節點,CPU/記憶體/Disk的種類與個數,甚至有很多參數可調整。
因此,若有執行出來的數字,會比較能猜測原因。
引言回覆:
用5个节点全分布式运行,运行时间和原来的伪分布式差不多
這有時候就得看運算特性,若是運算時間並不長,那很可能光是 JVM 的啟動時間就佔了超過 80% 的時間,
如此就感受不到全分散式的優點了。老話:
http://forum.hadoop.tw/viewtopic.php?f=7&t=37473引言回覆:
「運算時間(java code 執行時間)」 >> (遠大於) 「資料傳輸時間(計算資料的複製、jar 檔複製、mapper 輸出複製到 reducer)」+「準備時間(啟動 JVM 的時間+工作排程)」
- Jazz
代碼:
public class Fca extends Configured implements Tool {
static int M = 5;
static int N = 7;
@SuppressWarnings("rawtypes")
static List[] list = new ArrayList[M];//定义一个线性表数组[/color]来存储形式背景
public static class MapClass extends Mapper<Text,Text,Tuple1,Tuple2>{
@SuppressWarnings("unchecked")
public void map(Text key,Text value,Context context)throws IOException,InterruptedException{
...
代碼:
public int run(String[] args)throws Exception{
/*下面为读取形式背景并存储在list中*/
File f = new File("/home/binbin/Desktop/formalcontext1");
RandomAccessFile file = new RandomAccessFile(f,"r");//随机读文件
String s;
long filePoint = 0;//文件指针当前指向
long fileLength = file.length();//文件长度
int i=0;
while(filePoint<fileLength){
s = file.readLine();//读取文件的一行
String[] tokens = s.split(" ");//以空格分解此行字符串
list[i] = new ArrayList();//用线性表数组来存储形式背景得一行
for(int j=0;j<tokens.length;j++){
list[i].add(Integer.parseInt(tokens[j]));//把一行中的各个属性存入线性表
}
i++;
filePoint = file.getFilePointer();//获取当前指针
}
file.close();//关闭文件[
...
}
小弟遇到一个问题,我在程序里用到一个线性表数组来存储文件得内容,在map方法里需要用到这个数组。我在驱动方法里读取文件,存储在list数组中,小弟在用eclipse运行的时候,没出现任何问题,但是打包成jar包在终端用命令行运行就抛出了异常:java.lang.NullPointerException。说明map方法里这个数组没有存储文件内容。于是小弟在map方法里读取文件,导致效率极其低下。小弟想问下,在mapreduce程序里遇到这样的问题应该怎么解决。怎么能够在驱动方法里读取一次文件而不要在map函数里操作。不知道我的表达jazz大大能否看懂,小弟先谢谢了。