問題現象
使用Tablestore Java SDK 寫入資料到資料表時出現如下報錯:
The count of attribute columns exceeds the maximum:128
可能原因
寫入資料到Tablestore資料表時,一行最多支援寫入 1024 列。在使用 TableStoreWriter 的過程中,用戶端會有一個預設寫入 128 列的限制。
解決方案
使用 Java SDK 構造 TableStoreWriter 用戶端時,您可以通過修改 MaxColumnsCount 參數來適當調大一行預設寫入的列數。
說明
Tablestore使用 OTS_AK_ENV 環境變數名表示阿里雲帳號或者 RAM 使用者的 AccessKey ID,使用 OTS_SK_ENV 環境變數名表示對應 AccessKey Secret,請根據實際配置。關於設定環境變數的具體操作,請參見初始化 OTSClient。
final String endPoint = "";
String accessKeyId = System.getenv("OTS_AK_ENV");
String accessKeySecret = System.getenv("OTS_SK_ENV");
final String instanceName = "";
ClientConfiguration cc = new ClientConfiguration();
cc.setRetryStrategy(new DefaultRetryStrategy()); // 可定製重試策略,如果需要保證資料寫入成功率,可採用更激進的重試策略。
AsyncClient asyncClient = new AsyncClient(endPoint, accessKeyId, accessKeySecret, instanceName, cc);
// 初始化
WriterConfig config = new WriterConfig();
config.setMaxBatchSize(4 * 1024 * 1024); // 配置一次大量匯入請求的大小限制,預設值為 4 MB。
config.setMaxColumnsCount(128); // 配置一行的列數的上限,預設值為 128。
config.setBufferSize(1024); // 配置記憶體中最多緩衝的資料行數,預設值為 1024,必須是 2 的指數倍。
config.setMaxBatchRowsCount(100); // 配置一次大量匯入的行數上限,預設值為 100。
config.setConcurrency(10); // 配置最大並發數,預設值為 10。
config.setMaxAttrColumnSize(2 * 1024 * 1024); // 配置屬性列的值大小上限,預設值為 2 MB。
config.setMaxPKColumnSize(1024); // 配置主鍵列的值大小上限,預設值為 1 KB。
config.setFlushInterval(10000); // 配置緩衝區 flush 的時間間隔,預設值為 10。單位為秒。
// 配置一個 callback ,OTSWriter 通過該 callback 反饋哪些匯入成功,哪些行匯入失敗,該 callback 只簡單的統計寫入成功和失敗的行數。
AtomicLong succeedCount = new AtomicLong();
AtomicLong failedCount = new AtomicLong();
TableStoreCallback<RowChange, ConsumedCapacity> callback = new SampleCallback(succeedCount, failedCount);
ExecutorService executor = Executors.newFixedThreadPool(2);
TableStoreWriter tablestoreWriter = new DefaultTableStoreWriter(asyncClient, tableName, config, callback, executor);