2016-10-07 2 views
1

Я использую пакетную обработку для записи в InfluxDB, а ниже - мой код для этого.Неожиданный выпуск пакета InfluxDB write

String dbName = "test"; 
    influxDB.query(new Query("CREATE DATABASE " + dbName, dbName)); 
    Stopwatch watch = Stopwatch.createStarted(); 
    influxDB.enableBatch(2000, 100, TimeUnit.MILLISECONDS); 


     for (int j = 0; j < 100000; j++) { 
      Point point = Point.measurement("cpu") 
        .addField("idle", (double) j) 
        .addField("system", 3.0 * j).build(); 
      influxDB.write(dbName, "autogen", point); 
     } 
     influxDB.disableBatch(); 
     System.out.println("Write for " + 100000 + " Points took:" + watch); 
    } 

Здесь я пишу 100000 точек и который принимает очень разумное время, чтобы писать, однако лишь немногие записи записываются в БД вместо ожидаемых 100000 записей.

select count(idle) from cpu дает мне только «89» Я ожидаю, что это будет «100000»

Хотя select * from cpu дает мне следующее:

cpu 
time      idle system 
2016-10-06T23:57:41.184Z 8  24 
2016-10-06T23:57:41.185Z 196  588 
2016-10-06T23:57:41.186Z 436  1308 
2016-10-06T23:57:41.187Z 660  1980 
2016-10-06T23:57:41.188Z 916  2748 
2016-10-06T23:57:41.189Z 1278 3834 
2016-10-06T23:57:41.19Z  1405 4215 
2016-10-06T23:57:41.191Z 1409 4227 
2016-10-06T23:57:41.192Z 1802 5406 
2016-10-06T23:57:41.193Z 1999 5997 
2016-10-06T23:57:41.456Z 3757 11271 
2016-10-06T23:57:41.457Z 3999 11997 
2016-10-06T23:57:41.858Z 4826 14478 and so on..... 

Вот мой вопрос, почему значения холостого хода отсутствуют, для Например, после 8 это должно быть 9, 10, 11 и т. д., но эти значения не сохранялись и приходили непосредственно 196, а затем отсутствовали между ними, а затем 436. Любая идея о том, как сохранить всю ценность переменной цикла «j» в этой ситуации ?

ответ

0

Эта линия

influxDB.enableBatch(2000, 100, TimeUnit.MILLISECONDS); 

говорит, что она будет вымывать входные данные, если есть более 2000 образцов за период 100 мс. Поскольку вы пытаетесь записать 100k выборок, тогда логически большинство из них очищаются.

Вместо этого напишите меньше образцов в одной партии. Моя рекомендация заключалась бы в том, чтобы написать 5000 образцов в одной партии и сделать несколько партий, пока все ваши данные не будут в db.

// Batch 1 
influxDB.enableBatch(5000, 100, TimeUnit.MILLISECONDS); 
for (int j = 0; j < 5000; j++) { 
    Point point = Point.measurement("cpu") 
         .addField("idle", (double) j) 
         .addField("system", 3.0 * j).build(); 
    influxDB.write(dbName, "autogen", point); 
} 
influxDB.disableBatch(); 

// Batch 2 
// ... 
+0

для кода, который вы вставили выше, даже когда я пишу несколько образцов в пакетных данных не написано в БД полностью, я могу видеть только очень немногие пункты написаны, не знаю, как я могу писать все 5000 записей/очков за первую партию. – Ammad

+0

Некоторые из пакетов имеют значения Point [name = cpu, time = 1475881348762, tags = {blubber = bla}, precision = MILLISECONDS, fields = {idle = 0.0}], Point [name = cpu, time = 1475881348762, tags = {blubber = bla}, precision = MILLISECONDS, fields = {idle = 1.0}], Точка [name = cpu, time = 1475881348762, tags = {blubber = bla}, precision = MILLISECONDS, fields = {idle = 2.0} ], Точка [name = cpu, time = 1475881348762, tags = {blubber = bla}, precision = MILLISECONDS, fields = {idle = 3.0}], Но я вижу, что каждая точка имеет одно и то же значение времени, заставляя его писать только один раз в БД. Интересно, как я могу использовать пакетную запись с "над написанием точек? – Ammad

Смежные вопросы