Google cloud dataflow 使用AbstractCloudBigTableDofn重新使用Bigtable连接

Google cloud dataflow 使用AbstractCloudBigTableDofn重新使用Bigtable连接,google-cloud-dataflow,google-cloud-bigtable,Google Cloud Dataflow,Google Cloud Bigtable,我有一个DoFn,它扩展了AbstractCloudBigtableDofn,以便向Bigtable发送频繁的缓冲突变请求 在云中运行作业时,我在数据流管道的这一步看到重复的日志条目,如下所示: Opening connection for projectId XXX, instanceId XXX, on data host batch-bigtable.googleapis.com, table admin host bigtableadmin.googleapis.com... @Pro

我有一个
DoFn
,它扩展了
AbstractCloudBigtableDofn
,以便向Bigtable发送频繁的缓冲突变请求

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

Opening connection for projectId XXX, instanceId XXX, on data host batch-bigtable.googleapis.com, table admin host bigtableadmin.googleapis.com...
@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
中的代码如下所示:

Opening connection for projectId XXX, instanceId XXX, on data host batch-bigtable.googleapis.com, table admin host bigtableadmin.googleapis.com...
@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
经常被调用

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

“为projectId打开连接…”应该在每个AbstractCloudBigTabledOfn实例的每个worker中显示一次。您是否可以再次检查每个呼叫打开的连接是否与每个工作人员打开的连接相反

  • 把工人人数限制在少数几个人以内
  • 在stack driver中,展开“Opening connection for projectId”消息,并检查jsonPayload.worker是否在不同的日志消息中重复
另外,您能否详细说明正在使用的客户端的版本以及beam的版本


谢谢

要回答您的问题

是的,您应该担心数据流在每次调用
DoFn
时都会试图重新建立到Bigtable的连接。
AbstractCloudBigtableDoFn
的预期行为是,每个工作者维护一个
连接
实例

否,从
AbstractCloudBigtableDoFn
继承不会确保对
DoFn
的每次调用都重用单个
连接
实例。这是不可能的,因为
DoFn
是基于为数据流作业分配的工作线程数跨多台物理机器序列化的


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

抱歉,我过早地发出警报。我有很多工作人员负责这项工作,并且有很多不同的dofn继承自AbstractCloudBigtableDoFn,所以我一开始看到很多日志条目,当作业刚刚开始时,我开始担心,但随着作业的继续,它们最终停止了。看来一切都很好。在日志条目的详细信息中,我没有看到任何对jsonPayload.worker的引用。我使用的是Beam 2.2.0和bigtable hbase Beam 1.0.0。谢谢你的帮助!我们更改了实现以打开新的HBase连接、新的BigtableSessions,但保留了相同的底层gRPC ChannelPool。这实际上不是问题。我们有一个设置,在该设置中,基础通道池对象(HBase连接中最昂贵的部分)跨VM共享。