我有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的单个连接?
答案 0 :(得分:1)
&#34;打开projectId的连接...&#34;每个AbstractCloudBigtableTableDoFn实例应该出现一次。您是否可以仔细检查每个呼叫是否正在打开连接而不是每个工作人员?
另外,您能详细说明您正在使用的客户端版本以及版本的光束版本吗?
谢谢!
答案 1 :(得分:1)
回答你的问题......
是的,您应该担心Dataflow会在每次调用DoFn
时尝试重新建立与Bigtable的连接。 AbstractCloudBigtableDoFn
的预期行为是每个工作者维护一个Connection
实例。
不,继承自AbstractCloudBigtableDoFn
并不能确保每次调用Connection
时都会重复使用单个DoFn
实例。这是不可能的,因为DoFn
是基于为数据流作业分配的工作者数量在多个物理机器上序列化的。
首先,确保Bigtable没有连接/身份验证问题。有时,Dataflow需要重新建立与Bigtable的连接。但是,不希望每次调用DoFn
都这样做。