【问题标题】:Re-using Bigtable connection with AbstractCloudBigtableTableDoFn通过 AbstractCloudBigtableTableDoFn 重新使用 Bigtable 连接
【发布时间】:2018-01-05 17:39:35
【问题描述】:

我有一个扩展 AbstractCloudBigtableTableDoFn<> 的 DoFn,以便向 Bigtable 发送频繁的缓冲突变请求。

当我在云端运行作业时,我在 Dataflow 管道的这一步看到重复的日志条目,如下所示:

Opening connection for projectId XXX, instanceId XXX, on data host batch-bigtable.googleapis.com, table admin host bigtableadmin.googleapis.com...

和

Bigtable options: BigtableOptions{XXXXX (lots of option entries here}

DoFn 中的代码如下所示:

@ProcessElement
    public void processElement(ProcessContext c)
    {
        try
        {
            BufferedMutator mPutUnit = getConnection().getBufferedMutator(TableName.valueOf(TABLE_NAME));

            for (CONDITION)
            {
                // create lots of different rowsIDs
                Put p = new Put(newRowID).addColumn(COL_FAMILY, COL_NAME, COL_VALUE);
                mPutUnit.mutate(p);
            }
            mPutUnit.close();
        } catch (IOException e){e.printStackTrace();}
        c.output(0);
    }

这个DoFn 经常被调用。

我是否应该担心 Dataflow 在每次调用此 DoFn 时都会尝试重新建立与 Bigtable 的连接?我的印象是从这个类继承应该确保在所有调用中都应该重复使用到 Bigtable 的单个连接?

【问题讨论】:

    标签: google-cloud-dataflow google-cloud-bigtable


    【解决方案1】:

    "Opening connection for projectId ..." 应该在每个工作人员每个 AbstractCloudBigtableTableDoFn 实例中出现一次。您能否仔细检查每个呼叫而不是每个工作人员都打开了连接?

    • 将工人数量限制在少数
    • 在堆栈驱动程序中,展开“Opening connection for projectId”消息并检查 jsonPayload.worker 是否在不同的日志消息中重复。

    另外,您能否详细说明您使用的是什么版本的客户端以及什么版本的光束?

    谢谢!

    【讨论】:

    • 抱歉,我拉得太早了。我有很多工人来做这项工作,并且有很多不同的 DoFn 继承自 AbstractCloudBigtableDoFn,所以我一开始看到很多日志条目,当工作刚开始时,我很担心,但最终他们停止了,因为工作继续。所以看起来一切都很好。我在日志条目的详细信息中没有看到对 jsonPayload.worker 的任何引用。我正在使用 Beam 2.2.0 和 bigtable-hbase-beam 1.0.0。感谢您的帮助!
    • 我们更改了实现以打开新的 HBase 连接、新的 BigtableSession,但保持相同的底层 gRPC 通道池。这实际上不是问题。
    【解决方案2】:

    回答您的问题...

    是的,您应该担心 Dataflow 会在每次调用 DoFn 时尝试重新建立与 Bigtable 的连接。 AbstractCloudBigtableDoFn 的预期行为是每个 worker 维护一个 Connection 实例。

    不,从 AbstractCloudBigtableDoFn 继承并不能确保在每次调用 DoFn 时重复使用单个 Connection 实例。这是不可能的,因为 DoFn 是根据为 Dataflow 作业分配的工作人员数量跨多台物理机序列化的。

    首先,确保 Bigtable 没有连接/身份验证问题。有时,Dataflow 需要重新建立与 Bigtable 的连接。但是,每次调用 DoFn 时都不会这样做。

    【讨论】:

    • 我们有一个设置,其中底层 Channel 池对象(HBase 连接中最昂贵的部分)在 VM 之间共享。
    猜你喜欢
    • 2010-09-06
    • 2017-12-08
    • 2011-06-10
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多