我在DataFlow中设置Java Pipeline来读取.csv
文件并根据文件内容创建一堆BigTable行。我在BigTable文档中看到连接到BigTable是一个“昂贵”的说明。操作并且只做一次并且在需要它的功能之间共享连接是一个好主意。
但是,如果我在主类中将Connection对象声明为public static
变量并首先在main函数中连接到BigTable,那么当我随后尝试引用该连接时,我会得到NullPointerException
DoFn
子类的实例' processElement()
作为我的DataFlow管道的一部分。
相反,如果我将Connection声明为实际DoFn
类中的静态变量,那么该操作将成功运行。
最佳做法或最佳方式是什么?
我担心如果我大规模实施第二种选择,我将浪费大量的时间和资源。如果我将变量保持为DoFn
类中的静态变量,是否足以确保API不会每次都尝试重新建立连接?
我意识到有一个特殊的BigTable I / O调用来与BigTable同步DataFlow管道对象,但我想我需要自己编写一个来构建一个特殊的逻辑到DoFn
{{1功能......
这就是"工作"代码如下:
processElement()
这是更新的代码,FYI:
class DigitizeBT extends DoFn<String, String>{
private static Connection m_locConn;
@Override
public void processElement(ProcessContext c)
{
try
{
m_locConn = BigtableConfiguration.connect("projectID", "instanceID");
Table tbl = m_locConn.getTable(TableName.valueOf("TableName"));
Put put = new Put(Bytes.toBytes(rowKey));
put.addColumn(
Bytes.toBytes("CF1"),
Bytes.toBytes("SomeName"),
Bytes.toBytes("SomeValue"));
tbl.put(put);
}
catch (IOException e)
{
e.printStackTrace();
System.exit(1);
}
}
}
输入.csv文件如下所示:
玛丽,3000
约翰,5000
彼得,2000
因此,对于.csv文件中的每一行,我必须在BigTable中放入x行,其中x是.csv文件中的第二个单元格...
答案 0 :(得分:0)
我们为此目的建立了AbstractCloudBigtableTableDoFn。扩展该类而不是DoFn,并调用getConnection()
而不是自己创建连接。
10,000个小行应该花费一两秒的实际工作量。
编辑:根据评论,应使用BufferedMutator代替Table.put()以获得最佳吞吐量。