在DataFlow DoFn子类之间共享BigTable Connection对象

时间:2016-12-11 22:13:04

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

我在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文件中的第二个单元格...

1 个答案:

答案 0 :(得分:0)

我们为此目的建立了AbstractCloudBigtableTableDoFn。扩展该类而不是DoFn,并调用getConnection()而不是自己创建连接。

10,000个小行应该花费一两秒的实际工作量。

编辑:根据评论,应使用BufferedMutator代替Table.put()以获得最佳吞吐量。