복붙노트

[HADOOP] 다중 출력을 사용하여 MapReduce에서 HBase에 쓰기

HADOOP

다중 출력을 사용하여 MapReduce에서 HBase에 쓰기

현재 MultipleOutputs를 사용하여 여러 HDFS 위치로 데이터를 보내는 MapReduce 작업이 있습니다. 완료된 후, HBase 클라이언트 호출 (MR 외부)을 사용하여 몇 가지 HBase 테이블에 동일한 요소를 추가합니다. TableOutputFormat을 사용하여 HBase 출력을 추가 MultipleOutputs로 추가하는 것이 좋습니다. 그런 식으로 HBase 처리를 배포합니다.

문제는 이것이 작동하지 않는다는 것입니다. 누구든지 MultipleOutputs에서 TableOutputFormat을 사용한 적이 있습니까? 여러 개의 HBase 출력이 있습니까?

기본적으로 이런 수집기를 설정하고 있습니다.

Outputcollector<ImmutableBytesWritable, Writable> hbaseCollector1 = multipleOutputs.getCollector("hbase1", reporter); 
Outputcollector<ImmutableBytesWritable, Writable> hbaseCollector2 = multipleOutputs.getCollector("hbase2", reporter); 
Put put = new Put(mykey.getBytes());
put.add("family".getBytes(), "column".getBytes(), somedata1);
hbaseCollector1.collect(NullWritable.get(), put);

put = new Put(mykey.getBytes());
put.add("family".getBytes(), "column".getBytes(), somedata2);
hbaseCollector2.collect(newImmutableBytesWritable(mykey.getBytes()), put);

이것은 hbase 작문의 일반적인 아이디어를 따르는 것 같습니다.

내가 입력하면 문제의 일부가 작업 정의에 더있을 수 있습니다. MR (및 Hbase)이 이와 같은 전역 매개 변수 세트를 원하는 것처럼 보입니다 ....

conf.set(TableOutputFormat.OUTPUT_TABLE, "articles");

테이블 이름을 제공하십시오. 문제는 두 개의 테이블이 있다는 것입니다.

어떤 아이디어?

감사

해결법

  1. ==============================

    1.데이터를 HBase 3에 다른 방식으로 넣었습니다. 가장 효율적이고 분산 된 것은 HFileOutputFormat 클래스를 사용하는 것입니다.

    데이터를 HBase 3에 다른 방식으로 넣었습니다. 가장 효율적이고 분산 된 것은 HFileOutputFormat 클래스를 사용하는 것입니다.

    다음과 같이 작업을 설정했습니다 ... (실제 코드에서 편집되었지만 핵심 내용은 남아 있습니다.)

    cubeBuilderETLJob.setJobName(jobName);
    cubeBuilderETLJob.setMapOutputKeyClass(ImmutableBytesWritable.class);
    cubeBuilderETLJob.setMapOutputValueClass(Put.class);
    cubeBuilderETLJob.setMapperClass(HiveToHBaseMapper.class);      
    cubeBuilderETLJob.setJarByClass(CubeBuilderDriver.class);       
    cubeBuilderETLJob.setInputFormatClass(TextInputFormat.class);
    cubeBuilderETLJob.setOutputFormatClass(HFileOutputFormat.class);
    HFileOutputFormat.setOutputPath(cubeBuilderETLJob, cubeOutputPath);
    HTable hTable = null;
    Configuration hConf = HBaseConfiguration.create(conf);
    hConf.set("ZOOKEEPER_QUORUM", hbaseZookeeperQuorum);
    hConf.set("ZOOKEEPER_CLIENTPORT", hbaseZookeeperClientPort);
    hTable = new HTable(hConf, tableName);
    HFileOutputFormat.configureIncrementalLoad(cubeBuilderETLJob, hTable);
    

    우리가 볼 수 있듯이 Mapper 클래스는 HiveToHBaseMapper-Nice and original입니다. :) 여기에 (거의 거친) 정의가 있습니다.

    public class HiveToHBaseMapper extends
        Mapper<WritableComparable, Writable, ImmutableBytesWritable, Put> {
    @Override
    public void map(WritableComparable key, Writable val, Context context)
        throws IOException, InterruptedException {
        Configuration config = context.getConfiguration();
        String family = config.get("FAMILY");
        Double value = Double.parseDouble(sValue);
        String sKey = generateKey(config);
        byte[] bKey = Bytes.toBytes(sKey);
        Put put = new Put(bKey);
        put.add(Bytes.toBytes(family), Bytes.toBytes(column), (value <= 0) 
            ? Bytes.toBytes(Double.MIN_VALUE)
            : Bytes.toBytes(value));        
        ImmutableBytesWritable ibKey = new ImmutableBytesWritable(bKey);
        context.write(ibKey, put);
    }
    

    이것을 사용하여 MultipleOutputs에 맞출 수 있는지 또는 새로운 MR 작업을 작성해야하는지 모르겠습니다. 이것이 내가 데이터를 HBase로 가져 오기 위해 온 가장 좋은 방법입니다. :)

    이것은 해결책을 찾는 올바른 방향으로 당신을 얻을 것입니다.

  2. ==============================

    2.내 경험상 가장 좋은 방법은 데이터를 대량으로로드하지 않는 한 가능한 한 빨리 hbase 테이블에 데이터를 저장하는 것입니다. 지도 작업에 사용 가능한 데이터가있는 경우,이를 hbase로 푸시하기 가장 좋은시기입니다. 작업 축소까지 데이터가 없으면 hbase에 푸시를 추가하십시오. HBase가 병목 상태임을 알 때까지 HBase가 캐싱 문제에 대해 걱정하도록하십시오.

    내 경험상 가장 좋은 방법은 데이터를 대량으로로드하지 않는 한 가능한 한 빨리 hbase 테이블에 데이터를 저장하는 것입니다. 지도 작업에 사용 가능한 데이터가있는 경우,이를 hbase로 푸시하기 가장 좋은시기입니다. 작업 축소까지 데이터가 없으면 hbase에 푸시를 추가하십시오. HBase가 병목 상태임을 알 때까지 HBase가 캐싱 문제에 대해 걱정하도록하십시오.

  3. ==============================

    3.따라서 오래된 맵 패키지에서는 불가능합니다. mapreduce 패키지 세트에 새로운 OutputFormat이 있지만 지금은 그 형식으로 변환하고 싶지 않습니다. 따라서 여러 MR 작업을 작성해야합니다.

    따라서 오래된 맵 패키지에서는 불가능합니다. mapreduce 패키지 세트에 새로운 OutputFormat이 있지만 지금은 그 형식으로 변환하고 싶지 않습니다. 따라서 여러 MR 작업을 작성해야합니다.

  4. from https://stackoverflow.com/questions/5983122/writing-to-hbase-in-mapreduce-using-multipleoutputs by cc-by-sa and MIT license