我使用以下代码将数据填充到Bigtable:
CloudBigtableScanConfiguration config = new CloudBigtableScanConfiguration.Builder()
.withConfiguration("clusterId", options.getBigTableClusterId())
.withProjectId(options.getProject())
.withInstanceId(options.getBigTableInstanceId())
.withTableId(options.getOutputBTTable())
.build();
Pipeline p = Pipeline.create(options);
/**
* Read Data from Big Query
*/
CloudBigtableIO.initializeForWrite(p);
p.apply(BigQueryIO.Read.fromQuery(getQuery(options.getDate())))
.apply(ParDo.of(new DoFn<TableRow, Mutation>() {
public void processElement(ProcessContext c) {
Mutation output = convertDataToRow(c.element());
if (output != null) {
c.output(output);
};
}
}))
.apply(CloudBigtableIO.writeToTable(config));
p.run();
private static Mutation convertDataToRow(TableRow element) {
LOG.info("element: "+ element);
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_segment_id") != null){
obj.addColumn(SEGMENT_FAMILY, SEGMENT_ID, ((String)element.get("BASM_segment_id")).getBytes());
}
if(element.get("BAS_sub_category") != 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_krux_user_id") != null){
obj.addColumn(USER_FAMILY, KRUX_USER_ID, ((String)element.get("BASM_krux_user_id")).getBytes());
}
if(element.get("BAS_last_compute_day") != null){
obj.addColumn(SEGMENT_FAMILY, LAST_COMPUTE_DAY, ((String)element.get("BAS_last_compute_day")).getBytes());
}
if(element.get("BAS_type") != null){
obj.addColumn(SEGMENT_FAMILY, TYPE, ((String)element.get("BAS_type")).getBytes());
}
if(element.get("BASM_REGID") != null){
obj.addColumn(USER_FAMILY, REGID, ((String)element.get("BASM_REGID")).getBytes() );
}
return obj;
}else{
return null;
}
}
我们有30个Bigtable节点,我的数据流工作正在与100名工人一起工作,整个过程必须处理大约100亿行数据,上述配置我的工作需要一天以上来完成,这是不理想的
代码级别的任何建议,通过它我们可以更快地运行我们的工作,我知道增加Bigtable节点的数量是其中一个选项但目前,我正在寻找其他选项,我们不必增加节点。
答案 0 :(得分:1)
您可能希望查看this question。基于此,您将要查看写入带宽,如果您超过80%,您可能希望减少工作节点的数量,或者要求增加配额并增加您的大小。群集。
答案 1 :(得分:0)
将大量数据批量加载到空表(无论是Bigtable还是HBase)都会出现性能问题,除非您事先预先拆分表,因为最初没有平板电脑,因此所有写入都是转到单个服务器节点,而不是分布均匀。
因此,无论您的群集大小如何,初始批量加载都无法实现高性能,因为它无法并行化。
要解决此问题,您需要创建一个包含预分割的表格。您可以查看有关如何create tables in Cloud Bigtable via the HBase shell with pre-splits的示例。当我们运行将数据加载到Bigtable和HBase的基准时,we also pre-split the tables。
在具有大量数据的稳定状态下写入现有表将具有许多平板电脑,在集群上分布良好,因此它将表现良好。但是,如果您正在为空表执行批量加载,则必须对其进行预分割。