与AbstractCloudBigtableTableDoFn重用Bigtable连接

时间:2018-01-05 17:39:36

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

我有DoFn扩展AbstractCloudBigtableTableDoFn<>,以便向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的单个连接?

2 个答案:

答案 0 :(得分:1)

&#34;打开projectId的连接...&#34;每个AbstractCloudBigtableTableDoFn实例应该出现一次。您是否可以仔细检查每个呼叫是否正在打开连接而不是每个工作人员?

  • 将工人数限制为少数
  • 在堆栈驱动程序中,展开&#34;打开projectId连接&#34;消息并检查jsonPayload.worker是否在不同的日志消息中重复。

另外,您能详细说明您正在使用的客户端版本以及版本的光束版本吗?

谢谢!

答案 1 :(得分:1)

回答你的问题......

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

不,继承自AbstractCloudBigtableDoFn并不能确保每次调用Connection时都会重复使用单个DoFn实例。这是不可能的,因为DoFn是基于为数据流作业分配的工作者数量在多个物理机器上序列化的。

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