如何将reducer的输出写入数据库?

oxosxuxt  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(351)

我将从一个例子开始。假设输入数据是

User1,product1,time1
User1,product2,time2
User1,product3,time3
User2,product2,time2
User2,product4,time6

现在,预期的输出是我必须将数据插入数据库(在我的情况下是aerospike(键值存储))中,在该数据库中,数据的格式应为

User1, [ [product1,time1],[product2,time2],[product3,time3] ]
User2, [ [product2,time2],[product4,time6] ]

所以在mapper中我输出了下面的

UserID, [productid,timestamp]

请不要假定[x,y]表示我正在输出列表,我可以从mapper以任何方式发送数据,也可以将数据写入自定义对象
所以在接收端我有格式的数据

User1, [ [product1,time1],[product2,time2],[product3,time3] ]
User2, [ [product2,time2],[product4,time6] ]

现在我可以做两件事
a) 我可以编写逻辑,只在reducer中将这些数据推送到数据库中(我不想这样做)
b) 我想做的是,当我们执行context.write()时,我想把数据写入数据库。
请帮助如何做到这一点,如果可能的话附加一个代码段或伪代码
ps:context.write()做什么?它写在哪里?它经历了哪些步骤和阶段?

xt0899hw

xt0899hw1#

据我所知,调用context.write需要一定数量的步骤
在驱动程序中,我们必须指定输出格式。现在让我们看看如果我们想写入一个文件会发生什么
对于写入文本文件,我们指定如下内容

job.setOutputFormatClass(TextOutputFormat.class);

现在,如果我们看到textoutputformat类的实现,它扩展了fileoutputformat(抽象类),fileoutputformat实现了outputformat接口,outputformat接口提供了两种方法

1) getRecordWriter
2) checkOutputSpecs

现在,outputformatclass只会告诉您要写什么样的记录,以及记录编写器是如何给出的,对于记录编写器来说,它只是 Object Key, Object Value 其中的值可以是单个的,也可以是一个列表,在记录编写器的实现中,我们指定了实际的逻辑,比如应该如何编写这个记录。
现在回到最初的问题,在我的例子中,记录应该如何写入数据库
我创建了一个自定义输出格式

public class AerospikeOutputFormat extends OutputFormat {
    //Return a new instance of record writer
    @Override
    public RecordWriter getRecordWriter(TaskAttemptContext context) throws IOException, InterruptedException {
        return new AerospikeRecordWriter(context.getConfiguration(), new Progressable() {
        @Override
        public void progress() {

        }
    });
    }

}

现在我们必须定义一个定制的记录编写器,它将获得一个键和一个值,并将数据写入数据库

public class RSRVRecordWriter<KK,VV> extends RecordWriter<KK, VV> {

    @Override
    public void write(KK key, VV value) throws IOException {
        //Now here we can have an instance of aerospikeclient from a singleton class and then we could do client.put()

    }

以上代码只是一个片段,必须采取适当的设计策略。
附言:aerospike已经提供了一个录音机,可以扩展到这个链接,以满足您的需要

相关问题