Hi,

This PR has opened for several days. I will merge this PR into the master.

By the way, I notice that there is no document about TsFile API. Actually
we have previous versions about the API introduction and example on
https://github.com/thulab/tsfile/wiki , but I am not sure whether they
catch up with the latest version of API...

I open a JIRA ticket, https://issues.apache.org/jira/browse/IOTDB-40 .

Best,

-----------------------------------
Xiangdong Huang
School of Software, Tsinghua University

 黄向东
清华大学 软件学院


Xiangdong Huang <[email protected]> 于2019年3月6日周三 上午12:53写道:

> Hi,
>
> I have added a new TsFileIOWriter, which supports to recover data from a
> broken TsFile (I mean, a TsFile that is not closed correctly). The PR is
> https://github.com/apache/incubator-iotdb/pull/87.
>
> You can use the new feature by:
> ```
>     NativeRestorableIOWriter rWriter = new NativeRestorableIOWriter(file);
>     TsFileWriter writer = new TsFileWriter(rWriter);
> ```
> 1. If the file is a complete TsFile (e.g., the FileMetadata has been
> persistent into the file and the tail magic string is correct), then you
> can not write data into this TsFile anymore (actually I can remove all
> FileMetadata and then let you continue to write, but it needs more coding
> work...), `TsFileWriter writer = new TsFileWriter(rWriter);` will throw a
> IoException. You can check it before you create TsFileWriter by using
> `rWriter.canWrite()`.
>
> 2. ChunkGroup is the basic unit that can be recover. That is, if a
> ChunkGroup is complete, i.e., its chunkGroupFooter is complete, I will
> remain it, otherwise I will truncate the chunk group. However, I can not
> know whether a chunkGroupFooter is complete (if only one byte lose, the
> deserialize method does not throw exception, because  something like
> `deserializeToInt(inputstream)` does not throw exception (it will use 3
> bytes to convert them to a integer).  So, when I say "if a ChunkGroup is
> complete", I mean that not only its chunkGroupFooter  is serialized
> successfully, but also there is at least one more byte is serialized into
> the file followed the footer.
>
> 3. I have tested many cases, such only a magic head string is persisted,
> only a ChunkHeader is persisted,  the first ChunkHeader is not persisted
> completely, only some Chunks are persisted, a ChunkGroupFooter is
> persisted, Two ChunkGroupFooter are persisted, and a complete TsFile is
> persisted, etc..  (`NativeRestorableIOWriterTest.java`, hope I have cover
> all cases)
>
> Hope TsFile can be used in edge device management applications ASAP!
>
> Now please enjoy the new feature.
>
> -----------------------------------
> Xiangdong Huang
> School of Software, Tsinghua University
>
>  黄向东
> 清华大学 软件学院
>
>
> Julian Feinauer <[email protected]> 于2019年3月5日周二 下午8:10写道:
>
>> Hey,
>>
>> thank you fort he link... I did not know of this.. this is exactly what I
>> was looking for!
>>
>> Julian
>>
>> PS.: Looking forward to your PR : )
>>
>> Am 05.03.19, 12:26 schrieb "Xiangdong Huang" <[email protected]>:
>>
>>     Hi,
>>
>>     1. We have a document to introduce that:
>>     https://cwiki.apache.org/confluence/display/IOTDB/TsFile+Format
>>
>>     2. The new API for recovering data is almost done. I am writing the
>> UTs
>>     now. Maybe I can submit a PR tonight (if everything is fine...)
>>
>>     Best,
>>     -----------------------------------
>>     Xiangdong Huang
>>     School of Software, Tsinghua University
>>
>>      黄向东
>>     清华大学 软件学院
>>
>>
>>     Julian Feinauer <[email protected]> 于2019年3月5日周二 下午6:00写道:
>>
>>     > Hi Xiangdong,
>>     >
>>     > that sounds excellent.
>>     > Do you have a short overview of how the file format is designed on
>> disk?
>>     > I know that its somewhat similar to parquet but I did not find more
>>     > details.
>>     > Basically what would suffice for us would be something like
>> skipping an
>>     > invalid column group (or how you name it) and go on with the next,
>> or so.
>>     >
>>     > Julian
>>     >
>>     > Am 04.03.19, 13:21 schrieb "Xiangdong Huang" <[email protected]>:
>>     >
>>     >     Hi,
>>     >
>>     >     If so, I think I need to add a new API to allow you continue to
>> write
>>     > data
>>     >     in an existing  but not closed correctly TsFile. Then
>> everything is
>>     > fine
>>     >     for you :D
>>     >
>>     >     Best,
>>     >     -----------------------------------
>>     >     Xiangdong Huang
>>     >     School of Software, Tsinghua University
>>     >
>>     >      黄向东
>>     >     清华大学 软件学院
>>     >
>>     >
>>     >     Julian Feinauer <[email protected]> 于2019年3月4日周一
>> 下午8:08写道:
>>     >
>>     >     > Hey Xiangdong,
>>     >     >
>>     >     > thanks for the great explanation.
>>     >     > And in fact, I agree with you that it would be best if we
>> start to
>>     > play
>>     >     > around with it and reply all our findings or wishes back to
>> this
>>     > list (in
>>     >     > fact that proved to be beneficial in plc4x as well).
>>     >     >
>>     >     > You confirm my thoughts about the two "levels" of APIs (DB
>> and file)
>>     > and
>>     >     > the file api is exactly what we looked for for our use case.
>>     >     > As we do not care much about data loss (when an edge device
>> fails
>>     > its...
>>     >     > gone).
>>     >     > The crucial point for us is that no corrupt files can be
>> generated.
>>     >     > This means I'm fine when the last data submitted is lost but
>> I'm not
>>     > fine
>>     >     > if we can get to a situation where the last datafile is
>> completely
>>     > lost
>>     >     > (well, perhaps this could be acceptable).
>>     >     >
>>     >     > @tim: Perhaps its best when you give some more information to
>>     > Xiangdong
>>     >     > about our idea, and we can also point to our current code in
>> github
>>     >     >
>>     >     > Julian
>>     >     >
>>     >     > Am 04.03.19, 13:03 schrieb "Xiangdong Huang" <
>> [email protected]>:
>>     >     >
>>     >     >     Hi,
>>     >     >
>>     >     >     TsFile API is not deprecated. In fact, it is designed for
>> this
>>     >     > scenario and
>>     >     >     MapReduce/Spark computing.
>>     >     >
>>     >     >     If you just use Reader and Writer API, there is something
>> you
>>     > need to
>>     >     > know:
>>     >     >
>>     >     >     Let's suppose your block size is x Bytes,
>>     > (tsfile-format.properties:
>>     >     >     group_size_in_byte).
>>     >     >
>>     >     >     1. If you write data and a shutdown occurs, then all data
>> that is
>>     >     > flushed
>>     >     >     on disk is ok, and you can read the data ( class
>>     >     >     org.apache.iotdb.tsfile.TsFileSequenceRead is an example,
>> but
>>     > you need
>>     >     > to
>>     >     >     change it a little. I think I can write an example.)
>>     >     >
>>     >     >     2. Actually, TsFile has the ability to allow you continue
>> to
>>     > write
>>     >     > data at
>>     >     >     the end of the incomplete file. However, We do not
>> provide this
>>     > API
>>     >     > now...
>>     >     >     If needed, I can add the API.
>>     >     >
>>     >     >     3. In this scenario, you will lose at most x Bytes data.
>> If you
>>     > do not
>>     >     >     accept that, something like WAL is needed. (It is not very
>>     > complex,
>>     >     > but I
>>     >     >     am not sure that whether it should be an embedded
>> function for
>>     > TsFile).
>>     >     >
>>     >     >     Up to now, we can consider that TsFile API is suitable
>> for your
>>     >     > scenario
>>     >     >     (even though we need to add a little more API if you
>> desire).
>>     > And you
>>     >     > can
>>     >     >     get the ability to compress data, and query data from the
>> TsFile
>>     > rather
>>     >     >     than scan the data from the head to the tail.
>>     >     >
>>     >     >     However, TsFile has one constraint: You can not write
>>     > out-of-order data
>>     >     >     into a TsFile, otherwise the query API may return
>> incomplete
>>     > result.
>>     >     >     But I think it is ok for real applications, because I do
>> not
>>     > think
>>     >     > that a
>>     >     >     device can generate out-of-order data....
>>     >     >
>>     >     >     For example, If you write two devices' data into one
>> TsFile, it
>>     > is ok
>>     >     > if
>>     >     >     you write data like:
>>     >     >     - d1.t1, d1.t2, d2.t1, d2.t2, d2.t3, d1.t4, d1.t5 ....
>>     >     >     or:
>>     >     >     - d1.m1.t1, d1.m1.t2, d1.m2.t1, d1.m2.t2, d2.m1.t1 ...
>>     >     >
>>     >     >     But you can not write data like:
>>     >     >     - d1.m1.t2, d1.m1.t1 ...
>>     >     >
>>     >     >     I think it is a good chance to improve TsFile to make it
>> more
>>     > suitable
>>     >     > for
>>     >     >     real applications, so please do not hesitate to tell me
>> more
>>     > about
>>     >     > what you
>>     >     >     think TsFile should want to have?
>>     >     >
>>     >     >     Best,
>>     >     >     -----------------------------------
>>     >     >     Xiangdong Huang
>>     >     >     School of Software, Tsinghua University
>>     >     >
>>     >     >      黄向东
>>     >     >     清华大学 软件学院
>>     >     >
>>     >     >
>>     >     >     Julian Feinauer <[email protected]>
>> 于2019年3月4日周一
>>     > 下午7:17写道:
>>     >     >
>>     >     >     > Hi Xiangdong,
>>     >     >     >
>>     >     >     > thanks for the info.
>>     >     >     > How is it in the case when you use the Reader / Writer
>> API for
>>     > the
>>     >     > tsfiles
>>     >     >     > directly (or should this be considered "deprecated")?
>>     >     >     > Can these files come to corrupted state?
>>     >     >     >
>>     >     >     > One Situation where we have to deal with these
>> situations is
>>     > "at the
>>     >     > edge"
>>     >     >     > when we have devices inside large machines.
>>     >     >     > Usually at the end of the shift these machines (and
>> therefore
>>     > our
>>     >     > device)
>>     >     >     > is powered off hard, so no shutdown or
>> de-initialization is
>>     > possible.
>>     >     >     >
>>     >     >     > Best
>>     >     >     > Julian
>>     >     >     >
>>     >     >     > Am 04.03.19, 12:14 schrieb "Xiangdong Huang" <
>>     > [email protected]>:
>>     >     >     >
>>     >     >     >     Hi,
>>     >     >     >
>>     >     >     >     IoTDB can support either on a server with 7*24 or a
>>     > RaspberryPi.
>>     >     > We
>>     >     >     > have
>>     >     >     >     tested both the two scenario.
>>     >     >     >
>>     >     >     >     When you shutdown an IoTDB instance in force (e.g.,
>> power
>>     > off)
>>     >     > and
>>     >     >     > restart
>>     >     >     >     it again, no data loses ( if you enable the WAL).
>>     >     >     >
>>     >     >     >     However, currently we do not optimize the time cost
>> of the
>>     >     > restart
>>     >     >     > process.
>>     >     >     >     It is an important feature that we need to do,
>> because we
>>     > hope
>>     >     > IoTDB
>>     >     >     > can
>>     >     >     >     support data management either on the edge devices
>> or the
>>     > data
>>     >     > center.
>>     >     >     >
>>     >     >     >     And, the default configuration is not so suitable
>> for
>>     > running on
>>     >     > the
>>     >     >     > edge
>>     >     >     >     device. (e.g., block size is 128MB, which is too
>> large for
>>     > a
>>     >     >     > RaspberryPi,
>>     >     >     >     and will slow down the restart process because
>> there are
>>     > too
>>     >     > much WAL
>>     >     >     > data
>>     >     >     >     on disk).
>>     >     >     >
>>     >     >     >     Best,
>>     >     >     >     -----------------------------------
>>     >     >     >     Xiangdong Huang
>>     >     >     >     School of Software, Tsinghua University
>>     >     >     >
>>     >     >     >      黄向东
>>     >     >     >     清华大学 软件学院
>>     >     >     >
>>     >     >     >
>>     >     >     >     Tim Mitsch <[email protected]>
>> 于2019年3月4日周一
>>     >     > 下午6:53写道:
>>     >     >     >
>>     >     >     >     > Hello development-team
>>     >     >     >     >
>>     >     >     >     > First of all thanks for developing this kind of
>>     > interesting
>>     >     > project
>>     >     >     > and
>>     >     >     >     > bringing it into apache incubator.
>>     >     >     >     >
>>     >     >     >     > I have a question regarding the place of
>> operation and
>>     >     > robustness:
>>     >     >     >     >
>>     >     >     >     >   *   Is iotDB concepted as application on a
>> server
>>     > which is
>>     >     > running
>>     >     >     > 24/7
>>     >     >     >     > or
>>     >     >     >     >   *   Is it also possible to run it on a device
>> like
>>     >     > RaspberryPi or
>>     >     >     > IPC,
>>     >     >     >     > where operation can interrupt.
>>     >     >     >     > I’m asking because i’m searching for solution for
>> a
>>     > temporary
>>     >     >     > storage that
>>     >     >     >     > is robust against spontaneous interrupt, e.g.
>> switch off
>>     >     > electricity
>>     >     >     >     > without regular shutdown of OS – have u tested
>> something
>>     > like
>>     >     > this
>>     >     >     > yet?
>>     >     >     >     >
>>     >     >     >     > Best regards
>>     >     >     >     > Tim
>>     >     >     >     >
>>     >     >     >     >
>>     >     >     >     >
>>     >     >     >
>>     >     >     >
>>     >     >     >
>>     >     >
>>     >     >
>>     >     >
>>     >
>>     >
>>     >
>>
>>
>>

Reply via email to