Welly,
Please see below
On 12/3/2015 3:33 PM, Welly Tambunan wrote:
Hi Denis,
Thanks for your clear explanation.
Our data structure is something like this one <sensorid: UUID, time:
Long, value: Double>
When i put a data point with that composite key. <sensorid, time>, is
there any guarantee that it will be store close together in a same node ?
Yes, to force such a behavior you should use so called affinity collocation.
https://apacheignite.readme.io/docs/affinity-collocation
In you case you can mark sensorId as an affinity key and this will
enforce all its data (and keys) to be stored on the same partition where
sensorID is mapped to.
SampleKey {
@AffinityKeyMapped
int sernsorId;
long sampleTime;
}
In case of update, however we need to be able to update in range, like
replace the range <startId, endIdx, List[DataPoint]>, (where DataPoint
=> <time, value> )
so it will clear that range and insert the new data point into that
range.
If the result set of such query is not significant then you can split it
into two steps:
- use SQL query to retrieve keys which entries should be updated or
removed according to you 'WHERE' clause above;
- use removeAll or putAll to delete or update the values for the keys.
So we need to do two step process to do that ? Select the key and then
delete the key ?
If the questions are related to the range like query above, then, yes in
cases if the SQL result set is not significant follow this way.
Otherwise it's always possible to come up with other solution.
Regards,
Denis
Thanks
On Thu, Dec 3, 2015 at 7:00 PM, Denis Magda <[email protected]
<mailto:[email protected]>> wrote:
Hi Welly,
Ignite perfectly fits for your task.
First, if I understand you properly there are will be many time
series for a give sensor ID.
If so then I would use a compound key like (sensorId, time) for
all cache related operations.
As an example you may want to use classes like this.
SampleKey {
int sernsorId;
long sampleTime;
}
Sample {
int sensorId;
long sampleTime;
byte[] data1;
byte[] data2;
etc.
}
And use them this way
cache.put(new SampleKey(1, time), sample);
cache.get(new SampleKey(2, time));
Second, to retrieve samples depending on sensor ID, time (time
range) or other parameters you can leverage Ignite SQL engine that
is designed exactly for the use cases you have. [1]
However, if you're going to use an object field in 'SELECT' or
'WHERE' clause you have to annotate it properly or specify using
CacheTypeMetadata [2]
Third, when you need to update data series you can remove the old
one and insert the new one that should have new time.
To perform a remove I would suggest doing the following:
- select sensor ID and sampleTime of all the entries to delete;
- use cache.removeAll by passing SampleKeys that are created using
the data retrieved with SQL above.
Moreover, you can use an eviction or expire policy that is used in
cases when old data must be removed from cache automatically.
Just refer to these articles for more info - [3]
Finally, Ignite has bunch of cache and SQL related examples. They
are located in "datagrid" folder of "examples" module.
Have a look at them and probably you'll come up with better
solution based on Ignite that suggested by me above cause
definitely you know all the details of your case better ;)
[1] https://apacheignite.readme.io/docs/sql-queries
[2]
https://apacheignite.readme.io/docs/sql-queries#configuring-sql-indexes-by-annotations
[3] https://apacheignite.readme.io/docs/evictions
[4] https://apacheignite.readme.io/docs/expiry-policies
Regards,
Denis
On 12/3/2015 12:50 PM, Welly Tambunan wrote:
Hi Igniters,
Currently we are trying to asses the possibility of using Ignite
on our Architecture.
We have a case where we want to store time series data in
memory. We will have a lots of sensor data. So i think i will
use sensor id as a key to retrieve the time series from cache.
However i can't find any sorted list structure in ignite to store
our time series. The index can be long ( for time ). So it will
need to be sorted by index.
We also have a query for getting range of index, ex: Give me all
series from start idx to end idx.
For updating we also need to be able to update a range with new
data series.
We just don't want to re uploaded the data again over and over
again to cache everytime there's an update on the range. We want
to be able to update the cache partially based on the range.
Is there any way we can achieve this on Ignite ?
Any suggestion or reference would be really appreciated.
Cheers
--
Welly Tambunan
Triplelands
http://weltam.wordpress.com
http://www.triplelands.com <http://www.triplelands.com/blog/>
--
Welly Tambunan
Triplelands
http://weltam.wordpress.com
http://www.triplelands.com <http://www.triplelands.com/blog/>