1

HDFSにあるファイルからデータをロードし、HbaseMapReduceを使用してHbaseテーブルにロードする必要があります。次のように列修飾子の値のみを含むcsvファイルがあります。

Hbaseテーブルで、mapReduceプログラムからこの値をロードするにはどうすればよいですか。そして、RowIdがどのように自動生成されるか。

    Class:


    public class SampleExample {

          private static final String NAME = "SampleExample "; //class Name

          static class Uploader extends Mapper<LongWritable, Text, ImmutableBytesWritable, Put> 
          {
            private long statuspoint = 100;
            private long count = 0;
            @Override
            public void map(LongWritable key, Text line, Context context)
            throws IOException {
              String [] values = line.toString().split(",");
                      /* How to read values into columnQualifier and how to generate row id */
         // put function-------------------
                               try {
                context.write(new ImmutableBytesWritable(row), put);
              } catch (InterruptedException e) {
                e.printStackTrace();
              }
              if(++count % statuspoint == 0) {
                context.setStatus("Emitting Put " + count);
              }
            }
          }
      public static Job configureJob(Configuration conf, String [] args)
          throws IOException {

                                   }
        }

エラー:

12/09/17 05:23:30 INFO mapred.JobClient: Task Id : attempt_201209041554_0071_m_000000_0, Status : FAILED
java.io.IOException: Type mismatch in value from map: expected org.apache.hadoop.io.Writable, recieved org.apache.hadoop.hbase.client.Put
        at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:1019)
        at org.apache.hadoop.mapred.MapTask$NewOutputCollector.write(MapTask.java:691)
        at org.apache.hadoop.mapreduce.TaskInputOutputContext.write(TaskInputOutputContext.java:80)
        at com.hbase.Administration$Uploader.map(HealthAdministration.java:51)
        at com.hbase.Administration$Uploader.map(HealthAdministration.java:1)
        at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
        at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
        at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:415)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)
        at org.apache.hadoop.mapred.Child.main(Child.java:249)

誰かが私を助けてくれますか、私は値を修飾子に読み取る方法を理解できません。

4

3 に答える 3

1
String stringLine = line.toString();
StringTokenizer stringTokenizer = new StringTokenizer(line, "\t");`

Put put = new Put(key.get());
put.add(family, column1,stringTokenizer.nextToken().getBytes());
put.add(family, column2,stringTokenizer.nextToken().getBytes());
put.add(family, column3,stringTokenizer.nextToken().getBytes());
put.add(family, column4,stringTokenizer.nextToken().getBytes());

try {
    context.write(new ImmutableBytesWritable(row), put);
} catch (InterruptedException e) {
    e.printStackTrace();
}
于 2012-09-14T06:22:22.717 に答える
0

マップを変更して、次のように縮小してください。Mapでは、行IDのみで作業し、この作業済みのrowIDとLine(そのまま)をレデューサーに渡します。

map{
  byte[] row=Bytes.toBytes(key.get());
  try {
            context.write(new ImmutableBytesWritable(row),line);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
    }

変更を減らす

@Override     
reduce (ImmutableBytesWritable row , Text line ){
String stringLine=line.toString();
StringTokenizer stringTokenizer=new StringTokenizer(line, "\t");

Put put = new Put(key.getBytes());
put.add(family, column1,stringTokenizer.nextToken().getBytes());
put.add(family, column2,stringTokenizer.nextToken().getBytes());
put.add(family, column3,stringTokenizer.nextToken().getBytes());
put.add(family, column4,stringTokenizer.nextToken().getBytes());
try {
    context.write(new ImmutableBytesWritable(row), put);
  } catch (InterruptedException e) {
    e.printStackTrace();
  }

上記のコードに従って、適切な変更を加えてください。例外はcozです。+ve個のレデューサーがある場合、map関数はテーブルに書き込めない(またはputオブジェクトを使用する)ことができないため、context.write(writable、put)はテーブルを持つreduceにシフトされます-name、最終出力を書き込む必要がある場所。うまくいけば、これはうまくいくはずです。それ以外の場合は、同じ入力ファイルの作業コードを記述して、ここに貼り付けます

于 2012-09-18T05:13:31.603 に答える
0

こんにちは、次のようにputコマンドで+1を削除します。Putput = new Putkey.get()); job.setNumReduceTasks(0);のコメントを削除します。その後、それは確かに動作します

于 2012-09-18T05:21:15.030 に答える