2017-02-24 1 views
0

매퍼는() 2) 국가 국가의 통계를 정렬 사용자가 방문한 두 곳 1) 기사에서 파일을 읽고 현명한 (국가)에 쓰기 문자, 문자HDFS에서 읽고</p> <p>모두 매퍼의 출력은 HBase를

나는 두 개의 서로 다른 세트에서 아마존 클러스터의

내 목표는 읽기 데이터를 프로그램을 실행하고 HBase와의 결과를 결합하여 보관하고 있습니다.

HDFS to HDFS가 작동 중입니다. 코드는 67 %를 줄이는 붙어 및

17/02/24 10:45:31 INFO mapreduce.Job: map 0% reduce 0% 
17/02/24 10:45:37 INFO mapreduce.Job: map 100% reduce 0% 
17/02/24 10:45:49 INFO mapreduce.Job: map 100% reduce 67% 
17/02/24 10:46:00 INFO mapreduce.Job: Task Id : attempt_1487926412544_0016_r_000000_0, Status : FAILED 
Error: java.lang.IllegalArgumentException: Row length is 0 
     at org.apache.hadoop.hbase.client.Mutation.checkRow(Mutation.java:565) 
     at org.apache.hadoop.hbase.client.Put.<init>(Put.java:110) 
     at org.apache.hadoop.hbase.client.Put.<init>(Put.java:68) 
     at org.apache.hadoop.hbase.client.Put.<init>(Put.java:58) 
     at com.happiestminds.hadoop.CounterReducer.reduce(CounterReducer.java:45) 
     at com.happiestminds.hadoop.CounterReducer.reduce(CounterReducer.java:1) 
     at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:171) 
     at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:635) 
     at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:390) 
     at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at javax.security.auth.Subject.doAs(Subject.java:422) 
     at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1698) 
     at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158) 

드라이버 클래스이기 때문에 오류를 제공지고

package com.happiestminds.hadoop; 



import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.conf.Configured; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.hbase.HBaseConfiguration; 
import org.apache.hadoop.hbase.MasterNotRunningException; 
import org.apache.hadoop.hbase.client.HBaseAdmin; 
import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.lib.input.MultipleInputs; 
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; 
import org.apache.hadoop.util.Tool; 
import org.apache.hadoop.util.ToolRunner; 


public class Main extends Configured implements Tool { 

    /** 
    * @param args 
    * @throws Exception 
    */ 
    public static String outputTable = "mapreduceoutput"; 

    public static void main(String[] args) throws Exception { 
     int exitCode = ToolRunner.run(new Main(), args); 
     System.exit(exitCode); 
    } 

    @Override 
    public int run(String[] args) throws Exception { 


     Configuration config = HBaseConfiguration.create(); 

     try{ 
      HBaseAdmin.checkHBaseAvailable(config); 
     } 
     catch(MasterNotRunningException e){ 
      System.out.println("Master not running"); 
      System.exit(1); 
     } 

     Job job = Job.getInstance(config, "Hbase Test"); 

     job.setJarByClass(Main.class); 

     job.setMapOutputKeyClass(Text.class); 
     job.setMapOutputValueClass(Text.class); 



     MultipleInputs.addInputPath(job, new Path(args[0]), TextInputFormat.class, ArticleMapper.class); 
     MultipleInputs.addInputPath(job, new Path(args[1]), TextInputFormat.class, StatisticsMapper.class); 

     TableMapReduceUtil.addDependencyJars(job); 
     TableMapReduceUtil.initTableReducerJob(outputTable, CounterReducer.class, job); 

     //job.setReducerClass(CounterReducer.class); 

     job.setNumReduceTasks(1); 


     return job.waitForCompletion(true) ? 0 : 1; 
    } 

} 

감속기 클래스는

package com.happiestminds.hadoop; 

import java.io.IOException; 

import org.apache.hadoop.hbase.client.Mutation; 
import org.apache.hadoop.hbase.client.Put; 
import org.apache.hadoop.hbase.io.ImmutableBytesWritable; 
import org.apache.hadoop.hbase.mapreduce.TableReducer; 
import org.apache.hadoop.hbase.util.Bytes; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Reducer; 


public class CounterReducer extends TableReducer<Text, Text, ImmutableBytesWritable> { 

    public static final byte[] CF = "counter".getBytes(); 
    public static final byte[] COUNT = "combined".getBytes(); 


    @Override 
    protected void reduce(Text key, Iterable<Text> values, 
      Reducer<Text, Text, ImmutableBytesWritable, Mutation>.Context context) 
      throws IOException, InterruptedException { 

     String vals = values.toString(); 
     int counter = 0; 

     StringBuilder sbr = new StringBuilder(); 
     System.out.println(key.toString()); 
     for (Text val : values) { 
      String stat = val.toString(); 
      if (stat.equals("***")) { 
       counter++; 
      } else { 
       sbr.append(stat + ","); 
      } 

     } 
     sbr.append("Article count : " + counter); 


     Put put = new Put(Bytes.toBytes(key.toString())); 
     put.addColumn(CF, COUNT, Bytes.toBytes(sbr.toString())); 
     if (counter != 0) { 
      context.write(null, put); 
     } 

    } 



} 

종속성

<dependencies> 
     <dependency> 
      <groupId>org.apache.hadoop</groupId> 
      <artifactId>hadoop-client</artifactId> 
      <version>2.7.3</version> 
     </dependency> 



     <dependency> 
      <groupId>org.apache.hbase</groupId> 
      <artifactId>hbase-client</artifactId> 
      <version>1.2.2</version> 
     </dependency> 

     <dependency> 
      <groupId>org.apache.hbase</groupId> 
      <artifactId>hbase-common</artifactId> 
      <version>1.2.2</version> 
     </dependency> 


     <dependency> 
      <groupId>org.apache.hbase</groupId> 
      <artifactId>hbase-server</artifactId> 
      <version>1.2.2</version> 
     </dependency> 



    </dependencies> 

답변

0

null 값을 삽입하는지 여부를 확인할 수 있습니까?

HBase 데이터 모델은 길이가 0 인 행 키를 허용하지 않으므로 1 바이트 이상이어야합니다.

일부 값이 널 (null)로 채워지는지 여부를 입력하여 put 명령을 실행하기 전에 감속기 코드 을 점검하십시오.

1

어딘가에 제출하기 전에 값을 확인하는 것이 좋습니다. 특정 경우에 sbr의 유효성을 검사하거나 적절한 알림 정책을 사용하여 try-catch 섹션으로 래핑 할 수 있습니다. 일부 로그에 당신은해야 출력을가 정확하지 않은 새로운 테스트 케이스와 함께 사용하면 단위 테스트를 업데이트 할 경우 : 당신이 얻을

try 
{ 
    Put put = new Put(Bytes.toBytes(key.toString())); 
    put.addColumn(CF, COUNT, Bytes.toBytes(sbr.toString())); 
    if (counter != 0) { 
     context.write(null, put); 
    } 
} 
catch (IllegalArgumentException ex) 
{ 
     System.err.println("Error processing record - Key: "+ key.toString() +", values: " +sbr.ToString()); 
} 
0

오류가 매우 자명하다. HBase의 행 키는 비어있을 수 없습니다 (값은 가능할 수 있음).

@Override 
protected void reduce(Text key, Iterable<Text> values, 
     Reducer<Text, Text, ImmutableBytesWritable, Mutation>.Context context) 
     throws IOException, InterruptedException { 
    if (key == null || key.getLength() == 0) { 
     // Log a warning about the empty key. 
     return; 
    } 
    // Rest of your reducer follows. 
} 
+0

이제 감속기가 100 % 멈춤. –

1

는 프로그램에 의해 던져진 예외에 따르면,이 키 길이 키 길이 만 당신은 HBase를 넣어 수 0인지 아닌지 0 그래서 HBase를로 퍼팅하기 전에 검사 할 수 있음을 알 수있다.

키 길이의 0, 그것은 적어도 1 바이트해야 길이가 0 인 행 키를 허용하지 않습니다 HBase를

Becuase HBase를 데이터 모델에서 지원되지 않는 이유를 더 명확하게. 0 바이트 행 키는 내부 사용 (비어있는 시작 키와 종료 키 지정)을 위해 예약되어 있습니다.