使用org.apache.hadoop.utilprogressible接口

kulphzqa  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(572)

有人能举一个例子说明在调用filesystem.create()时如何实现progressible接口吗?我在另一篇文章中看到了以下代码片段,但没有显示BytesWrite的来源:

OutputStream os = hdfs.create( file,
    new Progressable() {
        public void progress() {
            out.println("...bytes written: [ "+bytesWritten+" ]");
        } });

这个接口的文档说它是用来向hadoop框架报告进度的,以避免在长时间操作的情况下超时,但是“hadoop:the definal guide”说它是用来通知应用程序正在将数据写入数据节点的进度的,因为这是一个创建过程,所以没有多大意义。
谢谢,rf

hsvhsicv

hsvhsicv1#

我应该进一步阅读hadoop的书--下面是他们稍后给出的示例:

OutputStream    out =   fs.create(new   Path(dst),  new Progressable()  {
                    public  void    progress()  {
                            System.out.print(".");
                    }

随附的文本说“我们通过每次hadoop调用progress()方法时打印一个句点来说明进度,这是在每个64KB的数据包写入datanode管道之后”。
我想我的问题变成了,这个“显式地向hadoop框架报告进度”是如何在progressible文档中声明的?

qhhrdooz

qhhrdooz2#

如果你有一个 Mapper 在这里 map() 可能需要很长时间(比如超过几分钟),然后你可以定期打电话 progress() 在提供的context对象上,让hadoop知道您的代码没有挂起。这就是他们所说的“显式报告进度”的意思——当您使用由框架提供的对象实现 Progressable ,当您编写自己的 Progressable .

相关问题