2016-07-27 12 views
1

Mapperで提供されているファイルパスを読み取るために、以下のコードを使用しています。コードは、同様の質問の1つで言及されました。MapReduce - 提供されたパスからファイルを読み取る

import java.io.BufferedReader; 
    import java.io.IOException; 
    import java.io.InputStreamReader; 
    import java.util.*; 

    import org.apache.hadoop.conf.*; 
    import org.apache.hadoop.fs.*; 
    import org.apache.hadoop.io.*; 
    import org.apache.hadoop.mapreduce.*; 
    import org.apache.hadoop.mapreduce.lib.input.*; 
    import org.apache.hadoop.mapreduce.lib.output.*; 
    import org.apache.hadoop.util.*; 
    import org.apache.hadoop.mapred.MapReduceBase; 

    import java.util.StringTokenizer; 

    public class StubDriver { 

// Main Method 

public static void main(String[] args) throws Exception { 

    Configuration conf = new Configuration(); // Configuration Object  
    Job job = new Job(conf, "My Program"); 
    FileSystem fs = FileSystem.get(conf);  
    job.setJarByClass(StubDriver.class); 
    job.setMapperClass(Map1.class); 
    // job.setPartitionClass(Part1); 
    // job.setReducerClass(Reducer1); 
    // job.setNumReduceTasks(3); 

    job.setInputFormatClass(TextInputFormat.class); 
    job.setOutputFormatClass(TextOutputFormat.class); 

    TextInputFormat.addInputPath(job,new Path(args[0]));; 
    TextOutputFormat.setOutputPath(job, new Path(args[1])); 

    job.setOutputKeyClass(Text.class); 
    job.setOutputValueClass(IntWritable.class); 
    job.setMapOutputKeyClass(IntWritable.class); 
    job.setMapOutputValueClass(Text.class); 

    job.waitForCompletion(true);   
} 

// Mapper 

public static class Map1 extends Mapper<LongWritable,Text,IntWritable,Text> { 

    public void setup(Context context) throws IOException { 

     Path pt = new Path("hdfs://quickstart.cloudera:8020/dhawalhdfs/input/*"); 
     FileSystem fs = FileSystem.get(new Configuration()); 
     BufferedReader br= new BufferedReader(new InputStreamReader(fs.open(pt))); 
     String line; 
     line = br.readLine(); 
     while (line != null) { 
      System.out.println(line); 
      line = br.readLine(); 

     }    

    } 


    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 

     StringTokenizer tokenizer = new StringTokenizer(value.toString()); 

     String a = tokenizer.nextToken(); 
     String b = tokenizer.nextToken(); 
     String c = tokenizer.nextToken(); 
     String d = tokenizer.nextToken(); 
     String e = tokenizer.nextToken(); 

     context.write(new IntWritable(Integer.parseInt(c)),new Text(a + "\t" + b + "\t" + d + "\t" + e)); 

     }  
}           
} 

コードのコンパイルに成功しました。

hadoop jar /home/cloudera/dhawal/MR/Par.jar StubDriver /dhawalhdfs/dhawal000 

と私は

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 
at StubDriver.main(StubDriver.java:40) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at org.apache.hadoop.util.RunJar.run(RunJar.java:221) 
at org.apache.hadoop.util.RunJar.main(RunJar.java:136) 
+0

研ぎます彼女の問題は解決されましたか? –

答えて

1
としてエラーを取得しています - ジョブを送信する間、私は私が私のプログラムに入力パスを提供していますように、私は以下のように出力のみパスを提出しようとしています。..エラーに直面しています

その単純なミス... :-)

new Path(

引数[1]

));はエラーの原因です。あなたは、配列の1つの引数を渡すためにしようとしている、あなたはあなたが

TextInputFormat.addInputPath(job,new Path(args[0]));; 
TextOutputFormat.setOutputPath(job, new Path(args[1])); 

以下のようなあなたのスタブドライバにアクセスしているが、ドライバのためにあなたのような

の下に一つだけの引数を渡している第二の要素に

を読み取ろうとしているところ

hadoop jar /home/cloudera/dhawal/MR/Par.jar StubDriver /dhawalhdfs/dhawal000 

理想的には、スペースで区切られた引数を渡すべきである

hadoop jar /home/cloudera/dhawal/MR/Par.jar StubDriver /dhawalhdfs /dhawal000 
+0

はい、この場合、/ dhawalhdfsは無効な入力パスになります。私はMapperに入力パスを提供しようとしています。入力パスがマッパーから読み込まれ、出力パスがコマンドラインから取得されるように、私のコードで変更する必要がありますか? – shah

+0

コードの変更はありません。入力パスと出力パスの間にスペースを追加する必要があります。それではすべて –

+0

それでは、どのように私がmapperに提供した入力パスをPathとして考えますか?pt = new Path( "hdfs://quickstart.cloudera:8020/dhawalhdfs/input/*"); – shah

関連する問題