1

別のレデューサーに別のファイルを添付したい。Hadoopで分散キャッシュテクノロジーを使用することは可能ですか?

すべてのレデューサーに同じファイルを添付できます。しかし、メモリの制約のため、さまざまなファイルをさまざまなレデューサーに添付できるかどうかを知りたいです。

それが無知な質問なら許してください。

plsは助けます!

前もって感謝します!

4

3 に答える 3

1

また、GridGain、Infinispanなどのインメモリコンピューティング/データグリッドテクノロジーを使用する価値があるかもしれません...このようにして、データをメモリにロードでき、計算ジョブのマッピング方法に制限はありません(データアフィニティを使用して任意のデータにマップ/リデュース)。

于 2012-09-21T17:19:26.560 に答える
0
package com.a;

import javax.security.auth.login.Configuration;

import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reducer;
import org.apache.hadoop.mapred.Reporter;

public class PrefixNew4Reduce4 extends MapReduceBase implements Reducer<Text, Text,   Text, Text>{
//  @SuppressWarnings("unchecked")


 ArrayList<String> al = new ArrayList<String>();
public void configure(JobConf conf4)
{

    String from = "home/users/mlakshm/haship"; 

    OutputStream dst = null;
    try {
        dst = new BufferedOutputStream(new FileOutputStream(to, false));
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } /* src (hdfs file) something like hdfs://127.0.0.1:8020/home/rystsov/hi                                         */


    FileSystem fs = null;
    try {
        fs = FileSystem.get(new URI(from), conf4);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (URISyntaxException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    FSDataInputStream src;
    try {
        src = fs.open(new Path(from));

        String val = src.readLine();
        StringTokenizer st = new StringTokenizer(val);

        al.add(val);


        System.out.println("val:----------------->"+val);

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }



}



    public void reduce (Text key, Iterator<Text> values, OutputCollector<Text, Text> output, Reporter reporter) throws IOException {


        StringTokenizer stk = new StringTokenizer(key.toString());
        String t = stk.nextToken();
        String i = stk.nextToken();
        String j = stk.nextToken();

    ArrayList<String> al1 = new ArrayList<String>();

           for(int i = 0; i<al.size(); i++)
            {

                     boolean a = (al.get(i).equals(i)) || (al.get(i).equals(j));

                     if(a==true)
                     {

                         output.collect(key, new Text(al.get(i));                              

                     }


      while(values.hasNext())
          {

             String val = values.next().toString();
             al1.add(val);

      }

for(int i = 0; i<al1.size(); i++)
{
output.collect(key, new Text(al1.get(i));
}
于 2012-09-24T00:01:27.783 に答える
0

レデューサーは特定のノードにバインドされておらず、実行中にレデューサーを任意のノードまたはノードで実行できるため (失敗または投機的実行がある場合)、これは奇妙な要求です。したがって、すべてのレデューサーは同種でなければなりません。異なるのは処理するデータだけです。

したがって、さまざまなファイルをさまざまなレデューサーに配置したいと言うとき、実際にはさまざまなファイルをレデューサーに配置したいと思います。それらのファイルは、それらのレデューサーが処理するデータ (キー) に対応する必要があります。

私が知っている唯一の方法は、データを HDFS に置き、データの処理を開始するときにレデューサーから読み取ることです。

于 2012-09-19T08:32:36.983 に答える