apache / apache/iotdb

批量写入报 TSStatus(code:500)

Đang mở
#4,639 2 bình luận 0 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
Java
Star
6.4k
Fork
1.2k
Merge trung bình
1 ngày 23 giờ
Pull request đã merge (30 ngày)
115

Mô tả

**Describe the bug**
从 mysql 迁移数据,开始每次从数据迁移1000条记录,开始正常,后来我就改为 1万条,就开始报这个错,我再改为200条都报
TSStatus(code:500)

**To Reproduce**
Steps to reproduce the behavior:
1. 从mysql 查询1000条记录,每条记录60个字段,for 循环插入 iotdb
2. 开始测试了3个表正常,数据都迁移完成
3. 上线到正式平台,每次迁移1000条,发现要迁移4500个表要很久
4. 加大到每次迁移1万条,iotdb 开始报错 TSStatus(code:500)
5. 改回到1000条,继续报错 TSStatus(code:500)
6. 改回到200条,继续报错 TSStatus(code:500)
7. 插入代码:
public void saveTracks(List tracks) {
if(tracks !=null && tracks.size() > 0)
{
log.error("saveTracks size:" + tracks.size());
Map tablets = new HashMap();
for(int i = 0; i < tracks.size(); ++i)
{
Track track = tracks.get(i);
String deviceId = track.getDeviceid();
String tableName = getTableName(deviceId);
Tablet tablet = tablets.get(tableName);
if(tablet == null)
{
tablet = new Tablet(tableName, schemas);
tablet.rowSize = 0;
tablets.put(tableName, tablet);
}

Map entityToMap = EntityUtil.entityToMap(track);
int rowIndex = tablet.rowSize;
tablet.rowSize = rowIndex + 1;
long timestamp = track.getUpdatetime();
tablet.addTimestamp(rowIndex, timestamp);
Iterator> it = entityToMap.entrySet().iterator();
while (it.hasNext()) {
Entry entry = it.next();
String measurementId = entry.getKey();
Object value = entry.getValue();
try
{
Integer indexOfValueObject = measurementIndex.get(measurementId);
if(indexOfValueObject != null && indexOfValueObject >= 0)
{
if(value instanceof String)
{
String valueString = (String) value;
Binary valueBinary = Binary.valueOf(valueString);
tablet.addValue(measurementId, rowIndex, valueBinary);
}
else
{
tablet.addValue(measurementId, rowIndex, value);
}
}
}catch(Exception e)
{
log.error("measurementId:" + measurementId, e);
}
}

}

try {
pool.insertTablets(tablets);
} catch (Exception e) {
e.printStackTrace();
}
}
}
[log_error.zip](https://github.com/apache/iotdb/files/7777944/log_error.zip)

8. 客户端报错:
TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500), TSStatus(code:500)];Batch process failed:[TSStatus(code:500)];Batch process failed:[TSStatus(code:500), TSStatus(code:500)];
at org.apache.iotdb.session.Session.insertByGroup(Session.java:1734)
at org.apache.iotdb.session.Session.insertTabletsWithLeaderCache(Session.java:1302)
at org.apache.iotdb.session.Session.insertTablets(Session.java:1281)
at org.apache.iotdb.session.pool.SessionPool.insertTablets(SessionPool.java:478)
at org.apache.iotdb.session.pool.SessionPool.insertTablets(SessionPool.java:465)
at com.minigps.iotdb.IotDBMgr.saveTracks(IotDBMgr.java:1117)
9. 服务器日志:
2021-12-27 02:06:13,072 [pool-14-IoTDB-RPC-Client-106] ERROR o.a.i.d.e.s.StorageGroupProcessor:961 - insert to TsFileProcessor error
org.apache.iotdb.db.exception.WriteProcessException: java.lang.NullPointerException
at org.apache.iotdb.db.engine.storagegroup.TsFileProcessor.insertTablet(TsFileProcessor.java:273)
at org.apache.iotdb.db.engine.storagegroup.StorageGroupProcessor.insertTabletToTsFileProcessor(StorageGroupProcessor.java:956)
at org.apache.iotdb.db.engine.storagegroup.StorageGroupProcessor.insertTablet(StorageGroupProcessor.java:898)
at org.apache.iotdb.db.engine.StorageEngine.insertTablet(StorageEngine.java:706)
at org.apache.iotdb.db.qp.executor.PlanExecutor.insertTablet(PlanExecutor.java:1432)
at org.apache.iotdb.db.qp.executor.PlanExecutor.insertTablet(PlanExecutor.java:1411)
at org.apache.iotdb.db.qp.executor.PlanExecutor.processNonQuery(PlanExecutor.java:258)
at org.apache.iotdb.db.service.TSServiceImpl.executeNonQuery(TSServiceImpl.java:1153)
at org.apache.iotdb.db.service.TSServiceImpl.executeNonQueryPlan(TSServiceImpl.java:1891)
at org.apache.iotdb.db.service.TSServiceImpl.insertTabletsInternal(TSServiceImpl.java:1608)
at org.apache.iotdb.db.service.TSServiceImpl.insertTablets(TSServiceImpl.java:1564)
at org.apache.iotdb.service.rpc.thrift.TSIService$Processor$insertTablets.getResult(TSIService.java:2848)
at org.apache.iotdb.service.rpc.thrift.TSIService$Processor$insertTablets.getResult(TSIService.java:2828)
at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:38)
at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:38)
at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:248)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)

**Expected behavior**
能够正常迁移1万一次数据

**Screenshots**
If applicable, add screenshots to help explain your problem.

**Desktop (please complete the following information):**
- OS: Ubuntu 16.04
- Version: iotdb server 0.12.4 客户端 java:0.12.3 jar

**Additional context**
服务器日志文件,见附件
[log_error.zip](https://github.com/apache/iotdb/files/7777945/log_error.zip)

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Hướng nghiên cứu

Bắt đầu với server stack trace tại TsFileProcessor.java:273 và theo dõi đường đi của insertTablets qua StorageGroupProcessor.java và StorageEngine.java. Tái hiện quá trình migration bằng server IoTDB 0.12.4 và client Java 0.12.3 được báo cáo, thay đổi kích thước batch và các log đã cung cấp. Được xem là hoàn tất khi insert được báo cáo không còn tạo ra NullPointerException hoặc TSStatus(code:500).

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
java
Lĩnh vực
databases
Loại issue
Lỗi
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Ít trao đổi
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
35/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.