Taiwan Hadoop Forum

台灣 Hadoop 技術討論區
現在的時間是 2020-08-07, 06:29

所有顯示的時間為 UTC + 8 小時




發表新文章 回覆主題  [ 12 篇文章 ]  前往頁數 12  下一頁
發表人 內容
 文章主題 : map函数执行缓慢
文章發表於 : 2013-05-10, 01:46 
離線

註冊時間: 2013-03-23, 14:38
文章: 10
最近在做毕设实验分析的时候,测试了一个大数据。我的程序是map和reduce多次迭代得过程,部分代码如下:

代碼:
while(isdone == false){
           Job job = new Job(conf,"Fca");
           job.setJarByClass(Fca.class);
      
           FileInputFormat.setInputPaths(job, new Path(infile));
           FileOutputFormat.setOutputPath(job, new Path(outfile));
      
           job.setMapperClass(MapClass.class);
           job.setReducerClass(Reduce.class);
      
           job.setInputFormatClass(KeyValueTextInputFormat.class);
           job.setOutputFormatClass(TextOutputFormat.class);
           job.setMapOutputKeyClass(Tuple1.class);
           job.setMapOutputValueClass(Tuple2.class);
           job.setOutputKeyClass(Text.class);
           job.setOutputValueClass(Text.class);
      
           success = job.waitForCompletion(true);
      
           infile = outfile+"/part-r-00000";
           FileSystem fs = FileSystem.get(URI.create(infile), conf);
           @SuppressWarnings("deprecation")
           long flength = fs.getLength(new Path(infile));
           if(flength==0){
              isdone = true;
              fs.delete(new Path(outfile), true);
           }
           outfile = OUT + System.nanoTime();
      
        }
        return success ? 0 : 1;
   }




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


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: map函数执行缓慢
文章發表於 : 2013-05-10, 21:59 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
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


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: map函数执行缓慢
文章發表於 : 2013-05-13, 02:44 
離線

註冊時間: 2013-03-23, 14:38
文章: 10
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大大能否看懂,小弟先谢谢了。


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: map函数执行缓慢
文章發表於 : 2013-05-13, 10:40 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
sunbinbinbol 寫:
怎么能够在驱动方法里读取一次文件而不要在map函数里操作。不知道我的表达jazz大大能否看懂,小弟先谢谢了。


嗯,有一些術語上的習慣用法,不是 100% 確定您講的問題。
但聽起來如果您要讓每個 mapper 都使用同一個檔案的話,一般會用 DistributedCache

http://hadoop.apache.org/docs/stable/api/org/apache/hadoop/filecache/DistributedCache.html

如果情況複雜一點的話,但是又希望在 mapper 開始時只做一次 HDFS 操作,那可以寫在 Mapper Class 的 setup() 函數中。
http://hadoop.apache.org/docs/stable/api/org/apache/hadoop/mapreduce/Mapper.html#setup%28org.apache.hadoop.mapreduce.Mapper.Context%29

- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: map函数执行缓慢
文章發表於 : 2013-05-14, 03:59 
離線

註冊時間: 2013-03-23, 14:38
文章: 10
jazz 寫:
sunbinbinbol 寫:
怎么能够在驱动方法里读取一次文件而不要在map函数里操作。不知道我的表达jazz大大能否看懂,小弟先谢谢了。


嗯,有一些術語上的習慣用法,不是 100% 確定您講的問題。
但聽起來如果您要讓每個 mapper 都使用同一個檔案的話,一般會用 DistributedCache

http://hadoop.apache.org/docs/stable/api/org/apache/hadoop/filecache/DistributedCache.html

如果情況複雜一點的話,但是又希望在 mapper 開始時只做一次 HDFS 操作,那可以寫在 Mapper Class 的 setup() 函數中。
http://hadoop.apache.org/docs/stable/api/org/apache/hadoop/mapreduce/Mapper.html#setup%28org.apache.hadoop.mapreduce.Mapper.Context%29

- Jazz

小弟用setup()函数,可以在集群上运行了。但是小弟在观察节点运行的时候发现4个slave节点只有一个在running tasks,是我的数据量太小了么?这样的话和一个节点上运行没什么区别了。我的起始输入数据只有500KB左右,只不过后来生成的行数比较多,但是最大也就达到20几兆。

圖檔


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: map函数执行缓慢
文章發表於 : 2013-05-14, 17:42 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
sunbinbinbol 寫:
小弟用setup()函数,可以在集群上运行了。但是小弟在观察节点运行的时候发现4个slave节点只有一个在running tasks,是我的数据量太小了么?这样的话和一个节点上运行没什么区别了。我的起始输入数据只有500KB左右,只不过后来生成的行数比较多,但是最大也就达到20几兆。
圖檔


必須這麼說,您的疊代輸入一開始的檔案很小,所以只會用到一的 mapper 所以會在一台上執行。
而第二次疊代拿的是 part-r-0000 也是只有一個,所以除非 part-r-0000 大於一個 block size (64MB)
否則還是只有 1 個 mapper,只會用到其中一台。

所以幾種驗證方式:(1) 最開始的檔案大於一個輸入檔 (2) 最開始的輸入大於 1 個 Block (預設 64MB) (3) 增加 Reducer 個數,且變更程式疊代條件,拿 part-r-0000 ~ part-r-XXXX 當疊代輸入。

否則,縱使多台,還是沒有辦法跑出該有的平行效果。一些想法,供參考~

- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: map函数执行缓慢
文章發表於 : 2013-05-14, 20:09 
離線

註冊時間: 2013-03-23, 14:38
文章: 10
jazz 寫:
sunbinbinbol 寫:
小弟用setup()函数,可以在集群上运行了。但是小弟在观察节点运行的时候发现4个slave节点只有一个在running tasks,是我的数据量太小了么?这样的话和一个节点上运行没什么区别了。我的起始输入数据只有500KB左右,只不过后来生成的行数比较多,但是最大也就达到20几兆。
圖檔


必須這麼說,您的疊代輸入一開始的檔案很小,所以只會用到一的 mapper 所以會在一台上執行。
而第二次疊代拿的是 part-r-0000 也是只有一個,所以除非 part-r-0000 大於一個 block size (64MB)
否則還是只有 1 個 mapper,只會用到其中一台。

所以幾種驗證方式:(1) 最開始的檔案大於一個輸入檔 (2) 最開始的輸入大於 1 個 Block (預設 64MB) (3) 增加 Reducer 個數,且變更程式疊代條件,拿 part-r-0000 ~ part-r-XXXX 當疊代輸入。

否則,縱使多台,還是沒有辦法跑出該有的平行效果。一些想法,供參考~

- Jazz

谢谢Jazz大大的指点!非常感谢。 :)


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: map函数执行缓慢
文章發表於 : 2013-05-17, 17:31 
離線

註冊時間: 2013-03-23, 14:38
文章: 10
jazz 寫:
sunbinbinbol 寫:
小弟用setup()函数,可以在集群上运行了。但是小弟在观察节点运行的时候发现4个slave节点只有一个在running tasks,是我的数据量太小了么?这样的话和一个节点上运行没什么区别了。我的起始输入数据只有500KB左右,只不过后来生成的行数比较多,但是最大也就达到20几兆。
圖檔


必須這麼說,您的疊代輸入一開始的檔案很小,所以只會用到一的 mapper 所以會在一台上執行。
而第二次疊代拿的是 part-r-0000 也是只有一個,所以除非 part-r-0000 大於一個 block size (64MB)
否則還是只有 1 個 mapper,只會用到其中一台。

所以幾種驗證方式:(1) 最開始的檔案大於一個輸入檔 (2) 最開始的輸入大於 1 個 Block (預設 64MB) (3) 增加 Reducer 個數,且變更程式疊代條件,拿 part-r-0000 ~ part-r-XXXX 當疊代輸入。

否則,縱使多台,還是沒有辦法跑出該有的平行效果。一些想法,供參考~

- Jazz

小弟在hdfs-site.xml里设置了dfs.block.size为1048576(1MB),然后在mapred-site.xml里设置map.tasktraker.map.task.maximum为10。先使用了一个master节点一个slave节点。但是小弟在终端用命令执行的时候发现slave节点上的map数最大仍为默认的2,小弟不明白是怎么回事,设置怎么没有用啊?

P.S 小弟的那个slave节点配置为双核CPU,是硬件的问题吗?


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: map函数执行缓慢
文章發表於 : 2013-05-17, 17:41 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
sunbinbinbol 寫:
小弟在hdfs-site.xml里设置了dfs.block.size为1048576(1MB),然后在mapred-site.xml里设置map.tasktraker.map.task.maximum为10。先使用了一个master节点一个slave节点。但是小弟在终端用命令执行的时候发现slave节点上的map数最大仍为默认的2,小弟不明白是怎么回事,设置怎么没有用啊?

P.S 小弟的那个slave节点配置为双核CPU,是硬件的问题吗?


有重新啟動 TaskTracker ? JVM 只有在啟動時才有去讀 mapred-site.xml 並不會在 runtime 就知道有參數修改。
代碼:
${HADOOP_HOME}/bin/hadoop-daemon.sh stop tasktracker
${HADOOP_HOME}/bin/hadoop-daemon.sh start tasktracker


- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: map函数执行缓慢
文章發表於 : 2013-05-17, 20:54 
離線

註冊時間: 2013-03-23, 14:38
文章: 10
jazz 寫:
sunbinbinbol 寫:
小弟在hdfs-site.xml里设置了dfs.block.size为1048576(1MB),然后在mapred-site.xml里设置map.tasktraker.map.task.maximum为10。先使用了一个master节点一个slave节点。但是小弟在终端用命令执行的时候发现slave节点上的map数最大仍为默认的2,小弟不明白是怎么回事,设置怎么没有用啊?

P.S 小弟的那个slave节点配置为双核CPU,是硬件的问题吗?


有重新啟動 TaskTracker ? JVM 只有在啟動時才有去讀 mapred-site.xml 並不會在 runtime 就知道有參數修改。
代碼:
${HADOOP_HOME}/bin/hadoop-daemon.sh stop tasktracker
${HADOOP_HOME}/bin/hadoop-daemon.sh start tasktracker


- Jazz

我stop-all.sh后又重新start-all.sh,应该是重新启动了


回頂端
 個人資料 E-mail  
 
顯示文章 :  排序  
發表新文章 回覆主題  [ 12 篇文章 ]  前往頁數 12  下一頁

所有顯示的時間為 UTC + 8 小時


誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 3 位訪客


不能 在這個版面發表主題
不能 在這個版面回覆主題
不能 在這個版面編輯您的文章
不能 在這個版面刪除您的文章
不能 在這個版面上傳附加檔案

搜尋:
前往 :  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
正體中文語系由 竹貓星球 維護製作