Google cloud dataflow 在Google Cloud Bigtable中填充数据需要很长时间

Google cloud dataflow 在Google Cloud Bigtable中填充数据需要很长时间,google-cloud-dataflow,google-cloud-bigtable,Google Cloud Dataflow,Google Cloud Bigtable,我使用以下代码将数据填充到Bigtable中: CloudBigtableScanConfiguration config=new CloudBigtableScanConfiguration.Builder() .withConfiguration(“clusterId”,options.getBigTableClusterId()) .withProjectId(options.getProject()) .withInstanceId(options.getBigTableInstance

我使用以下代码将数据填充到Bigtable中:

CloudBigtableScanConfiguration config=new CloudBigtableScanConfiguration.Builder()
.withConfiguration(“clusterId”,options.getBigTableClusterId())
.withProjectId(options.getProject())
.withInstanceId(options.getBigTableInstanceId())
.withTableId(options.getOutputBTTable())
.build();
Pipeline p=Pipeline.create(选项);
/**
*从大查询中读取数据
*/
CloudBigtableIO.initializeForWrite(p);
p、 apply(BigQueryIO.Read.fromQuery(getQuery(options.getDate()))
.适用(新DoFn()的第{
公共void processElement(ProcessContext c){
突变输出=convertDataToRow(c.element());
如果(输出!=null){
c、 输出(输出);
};
}
}))
.apply(CloudBigtableIO.writeTable(config));
p、 run();
私有静态数据流(TableRow元素){
LOG.info(“元素:”+元素);
if(element.get(“BASM_-AID”)!=null){
Put obj=new Put(getRowKey(element).getBytes()).addColumn(SEGMENT_FAMILY,SEGMENT_COLUMN_NAME,((String)element.get(“BAS_category”)).getBytes();
obj.addColumn(USER_FAMILY,AID,((String)element.get(“BASM_AID”)).getBytes();
if(element.get(“BASM\U段id”)!=null){
obj.addColumn(段族,段ID,((字符串)元素.get(“BASM_段ID”)).getBytes();
}
if(element.get(“基本子类别”)!=null){
obj.addColumn(SEGMENT_FAMILY,SUB_CATEGORY,((String)element.get(“BAS_SUB_CATEGORY”)).getBytes();
}
if(element.get(“BAS_name”)!=null){
obj.addColumn(SEGMENT_FAMILY,NAME,((String)element.get(“BAS_NAME”)).getBytes();
}
if(element.get(“BAS_description”)!=null){
obj.addColumn(SEGMENT_FAMILY,DESCRIPTION,((String)element.get(“BAS_DESCRIPTION”)).getBytes();
}
if(element.get(“BASM\u krux\u user\u id”)!=null){
obj.addColumn(USER_FAMILY,KRUX_USER_ID,((String)元素.get(“BASM_KRUX_USER_ID”)).getBytes();
}
if(element.get(“BAS\u last\u compute\u day”)!=null){
obj.addColumn(段族,最后计算日,((字符串)元素.get(“基本最后计算日”)).getBytes();
}
if(element.get(“BAS_type”)!=null){
obj.addColumn(段族,类型,((字符串)元素.get(“基本类型”)).getBytes();
}      
if(element.get(“BASM_REGID”)!=null){
obj.addColumn(USER_FAMILY,REGID,((String)element.get(“BASM_REGID”)).getBytes();
}
返回obj;
}否则{
返回null;
}
}
我们有30个Bigtable节点,我的数据流工作需要100个工作人员,整个过程需要处理大约100亿行数据,按照上述配置,我的工作需要一天多的时间才能完成,这并不理想


任何关于代码级别的建议,通过这些建议我们可以更快地运行我们的工作,我知道增加Bigtable节点的数量是一个选项,但目前,我正在寻找其他不必增加节点的选项。

您可能希望查看。基于此,您需要查看写入带宽,如果您的写入带宽超过80%,您可能希望减少工作节点的数量,或者要求增加配额并增加集群的大小。

将大量数据大容量加载到空表(无论是在Bigtable中还是在HBase中)将出现性能问题,除非预先分割表,因为最初,没有平板电脑,所以所有写入操作都将发送到单个服务器节点,分布不均匀

因此,无论集群大小如何,初始批量加载都不会实现高性能,因为它不会被并行化

要解决这个问题,您需要创建一个带有预拆分的表。您可以看到一些示例,了解如何使用。当我们运行将数据加载到Bigtable和HBase的基准测试时

在稳定状态下写入一个包含大量数据的现有表将有许多平板电脑,它们分布在集群上,因此它的性能会很好。但是,如果要对空表进行批量加载,则必须对其进行预拆分