Cloud Bigtable 批量突变因不明原因而失败

Posted

技术标签:

【中文标题】Cloud Bigtable 批量突变因不明原因而失败【英文标题】:Cloud Bigtable bulk mutations failing for unclear reasons 【发布时间】:2019-10-09 17:23:53 【问题描述】:

我正在使用 Java bigtable-client-core 库 v1.12.0,并且我正在尝试对行进行简单的批量突变,如下所示。这些都是通过 Apache Beam 中的转换完成的。

   try 
        client.bulkMutateRows(mutation);
     catch (MutateRowsException e) 
        updateFailures.inc();
        e.printStackTrace();
     catch (ApiException e) 
        updateFailures.inc();
        e.printStackTrace();
    

我收到“某些突变未能应用”错误,并且似乎没有数据正在写入 - “cbt read”在运行后显示没有行。但是,我确实在表的 Web 监控上看到了写入尝试。我不知道在哪里可以找到任何进一步的信息。如何确定失败的根源?

【问题讨论】:

【参考方案1】:

已修复 - 我的错误;我试图写入的列族已从表中删除。现在更新工作正常!

【讨论】:

【参考方案2】:

我遇到了同样的问题,并且到处寻找对我不起作用的解决方案,因为我已经检查了时间戳和列族是否相同。根据文档,如果大小超过 100k,则突变失败。但就我而言,我正在处理 46k。所以为了调试这个问题,我首先通过一个一个地执行 rowMutate() 而不是批量突变来尝试它,它可以工作,但这非常耗时,所以我创建了自己的批处理List<BulkMutation> batchBulkRowMutation = new ArrayList<>();,然后像批量突变一样处理这些批处理. `

    List batchBulkRowMutation = new ArrayList<>();
    RowMutationEntry rowMutation = null;
    long btRowCounter = 0;

    try 
        BulkMutation bulkMutation = BulkMutation.create(bigTableId);
        for (Row row : dispatchPlanRowStream)  // reading data from other bigtable
        var rowKey = row.getKey().toStringUtf8();
        if (rowKey != null) 
                rowMutation = RowMutationEntry.create(rowKey);
                rowMutation = addingToBT(rowKey, rowMutation, row); // setting cell data for the column family in separate method, this is simple you can refer this in docs (calling setCell method and adding column family, qualifier, timestamp and value to it).
                bulkMutation.add(rowMutation);
            
            btRowCounter++;

            if (btRowCounter % 20000 == 0)  // creating batch for 20k records
                batchBulkRowMutation.add(bulkMutation); // adding to the list
                bulkMutation = BulkMutation.create(bigTableId); // reassigning the value into bulkMutation to get other 20k records
            
        


        if (rowMutation != null) 
                // bulk mutation
            BigtableDataClient dataClient = GCPBigtableConnection.getBigtableDataClient(gcpProjectId, bigTableInstanceId);
            dataClient.bulkMutateRows(bulkMutation); // first processing the odd one records, let assume we have 50k records so for that we created 2 batch and the rest of records will be processed here or you can add those other records into the list as well to optimize the code.
      
            if (!batchBulkRowMutation.isEmpty()) 
                for (int j =0; j < batchBulkRowMutation.size(); j++) 
                    dataClient.bulkMutateRows(batchBulkRowMutation.get(j)); // processing the batch over here iterating the list of bulk mutations
                
            
        
     catch (Exception ex) 
        log.error("Failed to write to BigTable process"); // print your own exception
    

` 不确定是否有任何理想的解决方案,但没有找到任何相关内容。

【讨论】:

以上是关于Cloud Bigtable 批量突变因不明原因而失败的主要内容,如果未能解决你的问题,请参考以下文章

Cloud Bigtable:区域或区域服务

apache Beam bigtable 可迭代突变

因不明原因日本全国机场系统瘫痪:官方紧急修复

google bigtable 上的多行

React Native、GraphQL、Apollo - 如何创建批量插入突变

Google Cloud Bigtable 协处理器支持