<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Apache SkyWalking – IoTDB</title>
    <link>/tags/iotdb/</link>
    <description>Recent content in IoTDB on Apache SkyWalking</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Wed, 08 Dec 2021 00:00:00 +0000</lastBuildDate>
    
	  <atom:link href="/tags/iotdb/feed.xml" rel="self" type="application/rss+xml" />
    
    
      
        
      
    
    
    <item>
      <title>Blog: The Application Guide of Apache IoTDB Storage Option</title>
      <link>/blog/2021-12-08-application-guide-of-iotdb-storage-option/</link>
      <pubDate>Wed, 08 Dec 2021 00:00:00 +0000</pubDate>
      <guid>/blog/2021-12-08-application-guide-of-iotdb-storage-option/</guid>
      <description>
        
        
        &lt;p&gt;This document is one of the outcomes of &lt;a href=&#34;https://summer.iscas.ac.cn/#/org/prodetail/210070771&#34;&gt;Apache IoTDB - Apache SkyWalking Adapter&lt;/a&gt; in &lt;a href=&#34;https://summer.iscas.ac.cn/#/homepage&#34;&gt;Summer 2021 of Open Source Promotion Plan&lt;/a&gt;. The design and development work is under the guidance of &lt;a href=&#34;https://github.com/jixuan1989&#34;&gt;@jixuan1989&lt;/a&gt; from IoTDB and &lt;a href=&#34;https://github.com/wu-sheng&#34;&gt;@wu-sheng&lt;/a&gt; from SkyWalking. Thanks for their guidance and the help from community.&lt;/p&gt;
&lt;h2 id=&#34;start-with-skywalking-showcase&#34;&gt;Start with SkyWalking Showcase&lt;/h2&gt;
&lt;p&gt;Before using SkyWalking Showcase to quick start with IoTDB, please ensure your have &lt;code&gt;make&lt;/code&gt; installed and Docker daemon running.&lt;/p&gt;
&lt;p&gt;Please run the command below.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/LIU-WEI-git/skywalking-showcase.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6639ba&#34;&gt;cd&lt;/span&gt; skywalking-showcase
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make deploy.docker &lt;span style=&#34;color:#953800&#34;&gt;FEATURE_FLAGS&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;single-node.iotdb,agent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The former variable &lt;code&gt;single-node.iotdb&lt;/code&gt; will deploy only one single node of SkyWalking OAP-v8.9.0, and SkyWalking RocketBot UI-v8.9.0, IoTDB-v0.12.3 as storage. The latter variable &lt;code&gt;agent&lt;/code&gt; will deploy micro-services with SkyWalking agent enabled, which include agents for Java, NodeJS server, browser, Python.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;iotdb-showcase-command.png&#34; alt=&#34;iotdb-showcase-command&#34;&gt;&lt;/p&gt;
&lt;p&gt;These shell command maybe take a long while. After pulling and running docker image, please visit http://localhost:9999/. Then you will see the SkyWalking UI and data from OAP backend.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;iotdb-showcase-screenshot.png&#34; alt=&#34;iotdb-showcase-screenshot&#34;&gt;&lt;/p&gt;
&lt;p&gt;If you want to use more functions of SkyWalking Showcase, please visit its &lt;a href=&#34;https://skywalking.apache.org/docs/skywalking-showcase/latest/readme/&#34;&gt;official document&lt;/a&gt; and clone &lt;a href=&#34;https://github.com/apache/skywalking-showcase&#34;&gt;official repository&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;start-manually&#34;&gt;Start Manually&lt;/h2&gt;
&lt;p&gt;If you want to download and run IoTDB and SkyWalking manually, here is the guidance.&lt;/p&gt;
&lt;h3 id=&#34;install-and-run-iotdb&#34;&gt;Install and Run IoTDB&lt;/h3&gt;
&lt;p&gt;Apache IoTDB (Database for Internet of Things) is an IoT native database with high performance for data management and analysis, deployable on the edge and the cloud. It is a time-series database storage option for SkyWalking now.
Please ensure your &lt;strong&gt;IoTDB server version &amp;gt;= &lt;a href=&#34;https://github.com/apache/iotdb/releases/tag/v0.12.3&#34;&gt;0.12.3&lt;/a&gt;&lt;/strong&gt; and a single node version is sufficient. For more installation details, please see official document: &lt;a href=&#34;https://iotdb.apache.org/UserGuide/V0.12.x/QuickStart/QuickStart.html&#34;&gt;IoTDB Quick Start&lt;/a&gt; and &lt;a href=&#34;https://iotdb.apache.org/Download/&#34;&gt;IoTDB Download Page&lt;/a&gt;. You could download it from &lt;a href=&#34;https://hub.docker.com/r/apache/iotdb&#34;&gt;Docker Hub&lt;/a&gt; as well.&lt;/p&gt;
&lt;p&gt;There is some connection tools for IoTDB&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://iotdb.apache.org/UserGuide/V0.12.x/CLI/Command-Line-Interface.html&#34;&gt;Command Line Interface(CLI)&lt;/a&gt;&lt;br&gt;
If iotdb-cli connects successfully, you will see&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; _____       _________  ______   ______
|_   _|     |  _   _  ||_   _ `.|_   _ \
  | |   .--.|_/ | | \_|  | | `. \ | |_) |
  | | / .&amp;#39;`\ \  | |      | |  | | |  __&amp;#39;.
 _| |_| \__. | _| |_    _| |_.&amp;#39; /_| |__) |
|_____|&amp;#39;.__.&amp;#39; |_____|  |______.&amp;#39;|_______/  version x.x.x


IoTDB&amp;gt; login successfully
IoTDB&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://iotdb.apache.org/UserGuide/V0.12.x/Ecosystem%20Integration/Grafana.html&#34;&gt;IoTDB-Grafana&lt;/a&gt;&lt;br&gt;
IoTDB-Grafana is a connector which we developed to show time series data in IoTDB by reading data from IoTDB and sends to &lt;a href=&#34;https://grafana.com/&#34;&gt;Grafana&lt;/a&gt;.
&lt;img src=&#34;https://user-images.githubusercontent.com/13203019/51664878-6e54a380-1ff5-11e9-9718-4d0e24627fa8.png&#34; alt=&#34;Grafana-IoTDB-Screenshot&#34;&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://iotdb.apache.org/UserGuide/V0.12.x/Ecosystem%20Integration/Zeppelin-IoTDB.html&#34;&gt;Zeppelin-IoTDB&lt;/a&gt;&lt;br&gt;
You could enable Zeppelin to operate IoTDB via SQL.
&lt;img src=&#34;https://user-images.githubusercontent.com/5548915/102752947-520a3e80-43a5-11eb-8fb1-8fac471c8c7e.png&#34; alt=&#34;Zeppelin-IoTDB-Screenshot&#34;&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more ecosystem integration, please visit official documents.&lt;/p&gt;
&lt;p&gt;We will use iotdb-cli in the next examples.&lt;/p&gt;
&lt;h3 id=&#34;run-skywalking-oap-server&#34;&gt;Run SkyWalking OAP Server&lt;/h3&gt;
&lt;p&gt;There are some SkyWalking official documents which will help you start. Please ensure your &lt;strong&gt;SkyWalking version &amp;gt;= &lt;a href=&#34;https://github.com/apache/skywalking/releases/tag/v8.9.0&#34;&gt;8.9.0&lt;/a&gt;&lt;/strong&gt;. We recommend you download SkyWalking OAP distributions from its official download page or pull docker images.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://skywalking.apache.org/downloads/&#34;&gt;SkyWalking Download Page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://skywalking.apache.org/docs/main/latest/en/setup/backend/backend-setup/&#34;&gt;SkyWalking Backend Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://skywalking.apache.org/docs/main/latest/en/setup/backend/ui-setup/&#34;&gt;SkyWalking UI Setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before starting SkyWalking backend, please edit &lt;code&gt;/config/application.yml&lt;/code&gt;, set &lt;code&gt;storage.selector: ${SW_STORAGE:iotdb}&lt;/code&gt; or set environment variable &lt;code&gt;SW_STORAGE=iotdb&lt;/code&gt;. All config options about IoTDB is following, please edit it or not according to your local environment:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;storage&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;selector&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;${SW_STORAGE:iotdb}&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;iotdb&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;host&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;${SW_STORAGE_IOTDB_HOST:127.0.0.1}&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;rpcPort&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;${SW_STORAGE_IOTDB_RPC_PORT:6667}&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;username&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;${SW_STORAGE_IOTDB_USERNAME:root}&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;password&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;${SW_STORAGE_IOTDB_PASSWORD:root}&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;storageGroup&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;${SW_STORAGE_IOTDB_STORAGE_GROUP:root.skywalking}&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;sessionPoolSize&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;${SW_STORAGE_IOTDB_SESSIONPOOL_SIZE:16}&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;fetchTaskLogMaxSize&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;${SW_STORAGE_IOTDB_FETCH_TASK_LOG_MAX_SIZE:1000}&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# the max number of fetch task log in a request&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;visit-iotdb-server-and-query-skywalking-data&#34;&gt;Visit IoTDB Server and Query SkyWalking Data&lt;/h2&gt;
&lt;p&gt;There are some official document about data model and IoTDB-SQL language:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://iotdb.apache.org/UserGuide/V0.12.x/Data-Concept/Data-Model-and-Terminology.html&#34;&gt;Data Model and Terminology&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://iotdb.apache.org/UserGuide/V0.12.x/IoTDB-SQL-Language/DDL-Data-Definition-Language.html&#34;&gt;DDL (Data Definition Language)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://iotdb.apache.org/UserGuide/V0.12.x/IoTDB-SQL-Language/DML-Data-Manipulation-Language.html&#34;&gt;DML (Data Manipulation Language)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://iotdb.apache.org/UserGuide/V0.12.x/IoTDB-SQL-Language/Maintenance-Command.html&#34;&gt;Maintenance Command&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;example-model-and-insert-sql&#34;&gt;Example Model and Insert SQL&lt;/h3&gt;
&lt;p&gt;Before giving any example, we set time display type as long (CLI: &lt;code&gt;set time_display_type=long&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;In our design, we choose &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;entity_id&lt;/code&gt;, &lt;code&gt;node_type&lt;/code&gt;, &lt;code&gt;service_id&lt;/code&gt;, &lt;code&gt;service_group&lt;/code&gt;, &lt;code&gt;trace_id&lt;/code&gt; as indexes and fix their appearance order. The value of these indexed fields store in the path with double quotation mark wrapping, just like &lt;code&gt;&amp;quot;value&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;There is a model named &lt;code&gt;service_traffic&lt;/code&gt; with fields &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;time_bucket&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;node_type&lt;/code&gt;, &lt;code&gt;service_group&lt;/code&gt;. In order to see its data, we could use a query SQL: &lt;code&gt;select * from root.skywalking.service_traffic align by device&lt;/code&gt;. &lt;code&gt;root.skywalking&lt;/code&gt; is the default storage group and &lt;code&gt;align by device&lt;/code&gt; could return a more friendly result. The query result is following:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Time&lt;/th&gt;
          &lt;th&gt;Device&lt;/th&gt;
          &lt;th&gt;name&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;1637919540000&lt;/td&gt;
          &lt;td&gt;root.skywalking.service_traffic.&amp;ldquo;YXBwbGljYXRpb24tZGVtbw==.1&amp;rdquo;.&amp;ldquo;0&amp;rdquo;.&amp;quot;&amp;quot;&lt;/td&gt;
          &lt;td&gt;application-demo&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;1637919600000&lt;/td&gt;
          &lt;td&gt;root.skywalking.service_traffic.&amp;ldquo;YXBwbGljYXRpb24tZGVtby1teXNxbA==.1&amp;rdquo;.&amp;ldquo;0&amp;rdquo;.&amp;quot;&amp;quot;&lt;/td&gt;
          &lt;td&gt;application-demo-mysql&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Another example model is &lt;code&gt;service_cpm&lt;/code&gt; which has fields &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;service_id&lt;/code&gt;, &lt;code&gt;total&lt;/code&gt;, &lt;code&gt;value&lt;/code&gt;. Query its data with &lt;code&gt;select * from root.skywalking.service_cpm align by device&lt;/code&gt;. The result is following:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Time&lt;/th&gt;
          &lt;th&gt;Device&lt;/th&gt;
          &lt;th&gt;total&lt;/th&gt;
          &lt;th&gt;value&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;1637919540000&lt;/td&gt;
          &lt;td&gt;root.skywalking.service_cpm.&amp;ldquo;202111261739_YXBwbGljYXRpb24tZGVtbw==.1&amp;rdquo;.&amp;ldquo;YXBwbGljYXRpb24tZGVtbw==.1&amp;rdquo;&lt;/td&gt;
          &lt;td&gt;2&lt;/td&gt;
          &lt;td&gt;2&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;1637919600000&lt;/td&gt;
          &lt;td&gt;root.skywalking.service_cpm.&amp;ldquo;202111261740_YXBwbGljYXRpb24tZGVtby1teXNxbA==.1&amp;rdquo;.&amp;ldquo;YXBwbGljYXRpb24tZGVtby1teXNxbA==.1&amp;rdquo;&lt;/td&gt;
          &lt;td&gt;1&lt;/td&gt;
          &lt;td&gt;1&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;1637917200000&lt;/td&gt;
          &lt;td&gt;root.skywalking.service_cpm.&amp;ldquo;2021112617_YXBwbGljYXRpb24tZGVtbw==.1&amp;rdquo;.&amp;ldquo;YXBwbGljYXRpb24tZGVtbw==.1&amp;rdquo;&lt;/td&gt;
          &lt;td&gt;2&lt;/td&gt;
          &lt;td&gt;0&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For the first data of &lt;code&gt;service_traffic&lt;/code&gt;, the mapping between fields and values is following. Notice, all &lt;code&gt;time_bucket&lt;/code&gt; are converted to &lt;code&gt;timestamp&lt;/code&gt;(also named &lt;code&gt;time&lt;/code&gt; in IoTDB) and the value of all indexed fields are stored in the Device path.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Field&lt;/th&gt;
          &lt;th&gt;Value&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;id(indexed)&lt;/td&gt;
          &lt;td&gt;YXBwbGljYXRpb24tZGVtbw==.1&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;time(converted from time_bucket)&lt;/td&gt;
          &lt;td&gt;1637919540000&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;name&lt;/td&gt;
          &lt;td&gt;application-demo&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;node_type(indexed)&lt;/td&gt;
          &lt;td&gt;0&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;service_group(indexed)&lt;/td&gt;
          &lt;td&gt;(empty string)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;You could use the SQL below to insert example data.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;create&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;storage&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;group&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;root&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;skywalking&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;insert&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;into&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;root&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;skywalking&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;service_traffic&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;YXBwbGljYXRpb24tZGVtbw==.1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;0&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;timestamp&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;name&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;values&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;1637919540000&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;application-demo&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;insert&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;into&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;root&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;skywalking&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;service_traffic&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;YXBwbGljYXRpb24tZGVtby1teXNxbA==.1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;0&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;timestamp&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;name&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;values&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;1637919600000&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;application-demo-mysql&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;insert&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;into&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;root&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;skywalking&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;service_cpm&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;202111261739_YXBwbGljYXRpb24tZGVtbw==.1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;YXBwbGljYXRpb24tZGVtbw==.1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;timestamp&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;total&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;value&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;values&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;1637919540000&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;insert&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;into&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;root&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;skywalking&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;service_cpm&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;202111261740_YXBwbGljYXRpb24tZGVtby1teXNxbA==.1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;YXBwbGljYXRpb24tZGVtby1teXNxbA==.1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;timestamp&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;total&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;value&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;values&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;1637919600000&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;insert&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;into&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;root&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;skywalking&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;service_cpm&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;2021112617_YXBwbGljYXRpb24tZGVtbw==.1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;YXBwbGljYXRpb24tZGVtbw==.1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;timestamp&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;total&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;value&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;values&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;1637917200000&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;query-sql&#34;&gt;Query SQL&lt;/h3&gt;
&lt;p&gt;Now, let&amp;rsquo;s show some query examples.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Filter Query&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you want to query &lt;code&gt;name&lt;/code&gt; field of &lt;code&gt;service_traffic&lt;/code&gt;, the query SQL is &lt;code&gt;select name from root.skywalking.service_traffic align by device&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If you want to query &lt;code&gt;service_traffic&lt;/code&gt; with &lt;code&gt;id = YXBwbGljYXRpb24tZGVtbw==.1&lt;/code&gt;, the query SQL is &lt;code&gt;select * from root.skywalking.service_traffic.&amp;quot;YXBwbGljYXRpb24tZGVtbw==.1&amp;quot; align by device&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If you want to query &lt;code&gt;service_traffic&lt;/code&gt; with &lt;code&gt;name = application-demo&lt;/code&gt;, the query SQL is &lt;code&gt;select * from root.skywalking.service_traffic where name = &amp;quot;application-demo&amp;quot; align by device&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Combining the above three, the query SQL is &lt;code&gt;select name from root.skywalking.service_traffic.&amp;quot;YXBwbGljYXRpb24tZGVtbw==.1&amp;quot; where name = &amp;quot;application-demo&amp;quot; align by device&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fuzzy Query&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you want to query &lt;code&gt;service_traffic&lt;/code&gt; with &lt;code&gt;name&lt;/code&gt; contains &lt;code&gt;application&lt;/code&gt;, the query SQL is &lt;code&gt;select * from root.skywalking.service_traffic.*.*.* where name like &#39;%application%&#39; align by device&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Aggregate Query&lt;br&gt;
IoTDB only supports &lt;code&gt;group by time&lt;/code&gt; and &lt;code&gt;group by level&lt;/code&gt;. The former please refer to &lt;a href=&#34;https://iotdb.apache.org/UserGuide/V0.12.x/IoTDB-SQL-Language/DML-Data-Manipulation-Language.html#down-frequency-aggregate-query&#34;&gt;Down-Frequency Aggregate Query&lt;/a&gt; and the latter please refer to &lt;a href=&#34;https://iotdb.apache.org/UserGuide/V0.12.x/IoTDB-SQL-Language/DML-Data-Manipulation-Language.html#aggregation-by-level&#34;&gt;Aggregation By Level&lt;/a&gt;. Here is an example about &lt;code&gt;group by level&lt;/code&gt;: &lt;code&gt;select sum(total) from root.skywalking.service_cpm.*.* group by level = 3&lt;/code&gt;. We couldn&amp;rsquo;t get a expected result since our design make the data of one model spread across multiple devices. So we don&amp;rsquo;t recommend using &lt;code&gt;group by level&lt;/code&gt; to query SkyWalking backend data. You could refer to the &lt;a href=&#34;https://github.com/apache/iotdb/discussions/3907&#34;&gt;Discussion #3907&lt;/a&gt; in IoTDB community for more details.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sort Query&lt;br&gt;
IoTDB only supports &lt;code&gt;order by time&lt;/code&gt;, but we could use its &lt;a href=&#34;https://iotdb.apache.org/UserGuide/V0.12.x/IoTDB-SQL-Language/DML-Data-Manipulation-Language.html#selector-functions&#34;&gt;select function&lt;/a&gt; which contains &lt;code&gt;top_k&lt;/code&gt; and &lt;code&gt;bottom_k&lt;/code&gt; to get top/bottom k data. For example, &lt;code&gt;select top_k(total, &amp;quot;k&amp;quot;=&amp;quot;3&amp;quot;) from root.skywalking.service_cpm.*.*&lt;/code&gt;. We don&amp;rsquo;t recommend using this to query SkyWalking backend data since its result is not friendly. You could refer to the &lt;a href=&#34;https://github.com/apache/iotdb/discussions/3888&#34;&gt;Discussion #3888&lt;/a&gt; in IoTDB community for more details.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pagination Query&lt;br&gt;
We could use &lt;code&gt;limit&lt;/code&gt; and &lt;code&gt;offset&lt;/code&gt; to paginate the query result. Please refer to &lt;a href=&#34;https://iotdb.apache.org/UserGuide/V0.12.x/IoTDB-SQL-Language/DML-Data-Manipulation-Language.html#row-and-column-control-over-query-results&#34;&gt;Row and Column Control over Query Results&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Delete&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Delete storage group:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;delete storage group root.skywalking&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Delete timeseries:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;delete timeseries root.skywalking.service_cpm.*.*.total&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delete timeseries root.skywalking.service_cpm.&amp;quot;202111261739_YXBwbGljYXRpb24tZGVtbw==.1&amp;quot;.&amp;quot;YXBwbGljYXRpb24tZGVtbw==.1&amp;quot;.total&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Delete data:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;delete from root.skywalking.service_traffic&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delete from root.skywalking.service_traffic where time &amp;lt; 1637919540000&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

      </description>
    </item>
    
    <item>
      <title>Blog: The Design of Apache IoTDB Storage Option</title>
      <link>/blog/2021-11-23-design-of-iotdb-storage-option/</link>
      <pubDate>Tue, 23 Nov 2021 00:00:00 +0000</pubDate>
      <guid>/blog/2021-11-23-design-of-iotdb-storage-option/</guid>
      <description>
        
        
        &lt;p&gt;This plugin is one of the outcomes of &lt;a href=&#34;https://summer.iscas.ac.cn/#/org/prodetail/210070771&#34;&gt;Apache IoTDB - Apache SkyWalking Adapter&lt;/a&gt; in &lt;a href=&#34;https://summer.iscas.ac.cn/#/homepage&#34;&gt;Summer 2021 of Open Source Promotion Plan&lt;/a&gt;. The design and development work is under the guidance of &lt;a href=&#34;https://github.com/jixuan1989&#34;&gt;@jixuan1989&lt;/a&gt; from IoTDB and &lt;a href=&#34;https://github.com/wu-sheng&#34;&gt;@wu-sheng&lt;/a&gt; from SkyWalking. Thanks for their guidance and the help from community.&lt;/p&gt;
&lt;h2 id=&#34;iotdb-storage-plugin-setup&#34;&gt;IoTDB Storage Plugin Setup&lt;/h2&gt;
&lt;p&gt;IoTDB is a time-series database from Apache, which is one of the storage plugin options. If you want to use iotdb as SkyWalking backend storage, please refer to the following configuration.&lt;br&gt;
IoTDB storage plugin is still in progress. Its efficiency will improve in the future.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;storage&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;selector&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;${SW_STORAGE:iotdb}&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;iotdb&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;host&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;${SW_STORAGE_IOTDB_HOST:127.0.0.1}&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;rpcPort&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;${SW_STORAGE_IOTDB_RPC_PORT:6667}&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;username&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;${SW_STORAGE_IOTDB_USERNAME:root}&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;password&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;${SW_STORAGE_IOTDB_PASSWORD:root}&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;storageGroup&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;${SW_STORAGE_IOTDB_STORAGE_GROUP:root.skywalking}&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;sessionPoolSize&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;${SW_STORAGE_IOTDB_SESSIONPOOL_SIZE:16}&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;fetchTaskLogMaxSize&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;${SW_STORAGE_IOTDB_FETCH_TASK_LOG_MAX_SIZE:1000}&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# the max number of fetch task log in a request&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;All connection related settings, including host, rpcPort, username, and password are found in &lt;code&gt;application.yml&lt;/code&gt;. Please ensure the IoTDB version &amp;gt;= 0.12.3.&lt;/p&gt;
&lt;h2 id=&#34;iotdb-introduction&#34;&gt;IoTDB Introduction&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://iotdb.apache.org/&#34;&gt;Apache IoTDB&lt;/a&gt; (Database for Internet of Things) is an IoT native database with high performance for data management and analysis, deployable on the edge and the cloud. It is a time-series database donated by Tsinghua University to Apache Foundation.&lt;/p&gt;
&lt;h3 id=&#34;the-data-model-of-iotdb&#34;&gt;The Data Model of IoTDB&lt;/h3&gt;
&lt;p&gt;We can use the tree structure to understand the data model of iotdb. If divided according to layers, from high to low is: &lt;code&gt;Storage Group&lt;/code&gt; &amp;ndash; (&lt;code&gt;LayerName&lt;/code&gt;) &amp;ndash; &lt;code&gt;Device&lt;/code&gt; &amp;ndash; &lt;code&gt;Measurement&lt;/code&gt;. From the top layer to a certain layer below it is called a Path. The top layer is &lt;code&gt;Storage Group&lt;/code&gt; (must start with &lt;code&gt;root&lt;/code&gt;), the penultimate layer is &lt;code&gt;Device&lt;/code&gt;, and the bottom layer is &lt;code&gt;Measurement&lt;/code&gt;. There can be many layers in the middle, and each layer is called a &lt;code&gt;LayerName&lt;/code&gt;. For more information, please refer to the &lt;a href=&#34;https://iotdb.apache.org/UserGuide/V0.12.x/Data-Concept/Data-Model-and-Terminology.html&#34;&gt;Data Model and Terminology&lt;/a&gt; in the official document of the version 0.12.x.&lt;/p&gt;
&lt;h2 id=&#34;the-design-of-iotdb-storage-plugin&#34;&gt;The Design of IoTDB Storage Plugin&lt;/h2&gt;
&lt;h3 id=&#34;the-data-model-of-skywalking&#34;&gt;The Data Model of SkyWalking&lt;/h3&gt;
&lt;p&gt;Each storage model of SkyWalking can be considered as a Model, which contains multiple Columns. Each Column has ColumnName and ColumnType attributes, representing the name and type of Column respectively. Each Column named ColumnName stores multiple Value of the ColumnType. From a relational database perspective, Model is a relational table and Column is the field in a relational table.&lt;/p&gt;
&lt;h3 id=&#34;schema-design&#34;&gt;Schema Design&lt;/h3&gt;
&lt;p&gt;Since each &lt;code&gt;LayerName&lt;/code&gt; of IoTDB is stored in memory, it can be considered as an index, and this feature can be fully utilized to improve IoTDB query performance. The default storage group is &lt;code&gt;root.skywalking&lt;/code&gt;, it will occupy the first and the second layer of the path. The model name is stored at the next layer of the storage group (the third layer of the path), such as &lt;code&gt;root.skywalking.model_name&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;SkyWalking has its own index requirement, but it isn&amp;rsquo;t applicable to IoTDB. Considering query frequency and referring to the implementation of the other storage options, we choose &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;entity_id&lt;/code&gt;, &lt;code&gt;node_type&lt;/code&gt;, &lt;code&gt;service_id&lt;/code&gt;, &lt;code&gt;service_group&lt;/code&gt;, &lt;code&gt;trace_id&lt;/code&gt; as indexes and fix their appearance order in the path. The value of these indexed columns will occupy the last few layers of the path. If we don&amp;rsquo;t fix their order, we cannot map their value to column, since we only store their value in the path but don&amp;rsquo;t store their column name. The other columns are treated as Measurements.&lt;/p&gt;
&lt;p&gt;The mapping from SkyWalking data model to IoTDB data model is below.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;SkyWalking&lt;/th&gt;
          &lt;th&gt;IoTDB&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Database&lt;/td&gt;
          &lt;td&gt;Storage Group (1st and 2nd layer of the path)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Model&lt;/td&gt;
          &lt;td&gt;LayerName (3rd layer of the path)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Indexed Column&lt;/td&gt;
          &lt;td&gt;stored in memory through hard-code&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Indexed Column Value&lt;/td&gt;
          &lt;td&gt;LayerName (after 3rd layer of the path)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Non-indexed Column&lt;/td&gt;
          &lt;td&gt;Measurement&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Non-indexed Value&lt;/td&gt;
          &lt;td&gt;the value of Measurement&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;for-general-example&#34;&gt;For general example&lt;/h4&gt;
&lt;p&gt;There are model1(&lt;u&gt;column11&lt;/u&gt;, column12), model2(&lt;u&gt;column21&lt;/u&gt;, &lt;u&gt;column22&lt;/u&gt;, column23), model3(column31). Underline indicates that the column requires to be indexed. In this example, &lt;code&gt;modelx_name&lt;/code&gt; refers to the name of modelx, &lt;code&gt;columnx_name&lt;/code&gt; refers to the name of columnx and &lt;code&gt;columnx_value&lt;/code&gt; refers to the value of columnx.&lt;/p&gt;
&lt;p&gt;Before these 3 model storage schema, here are some points we need to know.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In order to avoid the value of indexed column contains dot(&lt;code&gt;.&lt;/code&gt;), all of them should be wrapped in double quotation mark since IoTDB use dot(&lt;code&gt;.&lt;/code&gt;) as the separator in the path.&lt;/li&gt;
&lt;li&gt;We use &lt;code&gt;align by device&lt;/code&gt; in query SQL to get a more friendly result. For more information about &lt;code&gt;align by device&lt;/code&gt;, please see &lt;a href=&#34;https://iotdb.apache.org/UserGuide/V0.12.x/IoTDB-SQL-Language/DML-Data-Manipulation-Language.html&#34;&gt;DML (Data Manipulation Language)&lt;/a&gt; and &lt;a href=&#34;https://iotdb.apache.org/SystemDesign/DataQuery/AlignByDeviceQuery.html&#34;&gt;Query by device alignment&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The path of them is following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Model with index:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;root.skywalking.model1_name.column11_value.column12_name&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;root.skywalking.model2_name.column21_value.column22_value.column23_name&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The Model without index:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;root.skywalking.model3_name.column31_Name&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use &lt;code&gt;select * from root.skywalking.modelx_name align by device&lt;/code&gt; respectively to get their schema and data. The SQL result is following:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Time&lt;/th&gt;
          &lt;th&gt;Device&lt;/th&gt;
          &lt;th&gt;column12_name&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;1637494020000&lt;/td&gt;
          &lt;td&gt;root.skywalking.model1_name.&amp;ldquo;column11_value&amp;rdquo;&lt;/td&gt;
          &lt;td&gt;column12_value&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Time&lt;/th&gt;
          &lt;th&gt;Device&lt;/th&gt;
          &lt;th&gt;column23_name&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;1637494020000&lt;/td&gt;
          &lt;td&gt;root.skywalking.model2_name.&amp;ldquo;column21_value&amp;rdquo;.&amp;ldquo;column22_value&amp;rdquo;&lt;/td&gt;
          &lt;td&gt;column23_value&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Time&lt;/th&gt;
          &lt;th&gt;Device&lt;/th&gt;
          &lt;th&gt;column31_name&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;1637494020000&lt;/td&gt;
          &lt;td&gt;root.skywalking.model3_name&lt;/td&gt;
          &lt;td&gt;column31_value&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;for-specific-example&#34;&gt;For specific example&lt;/h4&gt;
&lt;p&gt;Before 5 typical examples, here are some points we need to know.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The indexed columns and their order: &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;entity_id&lt;/code&gt;, &lt;code&gt;node_type&lt;/code&gt;, &lt;code&gt;service_id&lt;/code&gt;, &lt;code&gt;service_group&lt;/code&gt;, &lt;code&gt;trace_id&lt;/code&gt;. Other columns are treated as non indexed and stored as Measurement.&lt;/li&gt;
&lt;li&gt;The storage entity extends Metrics or Record contains a column &lt;code&gt;time_bucket&lt;/code&gt;. The &lt;code&gt;time_bucket&lt;/code&gt; column in SkyWalking Model can be converted to the &lt;code&gt;timestamp&lt;/code&gt; of IoTDB when inserting data. We don&amp;rsquo;t need to store &lt;code&gt;time_bucket&lt;/code&gt; separately. In the next examples, we won&amp;rsquo;t list &lt;code&gt;time_bucket&lt;/code&gt; anymore.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;Time&lt;/code&gt; in query result corresponds to the &lt;code&gt;timestamp&lt;/code&gt; in insert SQL and API.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Metadata: service_traffic&lt;br&gt;
service_traffic entity has 4 columns: &lt;u&gt;id&lt;/u&gt;, name, &lt;u&gt;node_type&lt;/u&gt;, &lt;u&gt;service_group&lt;/u&gt;.
When service_traffic entity includes a row with timestamp 1637494020000, the row should be as following:
(&lt;strong&gt;Notice&lt;/strong&gt;: the value of service_group is null.)&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;id&lt;/th&gt;
          &lt;th&gt;name&lt;/th&gt;
          &lt;th&gt;node_type&lt;/th&gt;
          &lt;th&gt;service_group&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;ZTJlLXNlcnZpY2UtcHJvdmlkZXI=.1&lt;/td&gt;
          &lt;td&gt;e2e-service-provider&lt;/td&gt;
          &lt;td&gt;0&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;And the row stored in IoTDB should be as following:
(Query SQL: &lt;code&gt;select  from root.skywalking.service_traffic align by device&lt;/code&gt;)&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Time&lt;/th&gt;
          &lt;th&gt;Device&lt;/th&gt;
          &lt;th&gt;name&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;1637494020000&lt;/td&gt;
          &lt;td&gt;root.skywalking.service_traffic.&amp;ldquo;ZTJlLXNlcnZpY2UtcHJvdmlkZXI=.1&amp;rdquo;.&amp;ldquo;0&amp;rdquo;.&amp;ldquo;null&amp;rdquo;&lt;/td&gt;
          &lt;td&gt;e2e-service-provider&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The value of id, node_type and service_group are stored in the path in the specified order.
&lt;strong&gt;Notice&lt;/strong&gt;: If those index value is null, it will be transformed to a string &amp;ldquo;null&amp;rdquo;.&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Metrics: service_cpm&lt;br&gt;
service_cpm entity has 4 columns: &lt;u&gt;id&lt;/u&gt;, &lt;u&gt;service_id&lt;/u&gt;, total, value.&lt;br&gt;
When service_cpm entity includes a row with timestamp 1637494020000, the row should be as following:&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;id&lt;/th&gt;
          &lt;th&gt;service_id&lt;/th&gt;
          &lt;th&gt;total&lt;/th&gt;
          &lt;th&gt;value&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;202111211127_ZTJlLXNlcnZpY2UtY29uc3VtZXI=.1&lt;/td&gt;
          &lt;td&gt;ZTJlLXNlcnZpY2UtY29uc3VtZXI=.1&lt;/td&gt;
          &lt;td&gt;4&lt;/td&gt;
          &lt;td&gt;4&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;And the row stored in IoTDB should be as following:
(Query SQL: &lt;code&gt;select from root.skywalking.service_cpm align by device&lt;/code&gt;)&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Time&lt;/th&gt;
          &lt;th&gt;Device&lt;/th&gt;
          &lt;th&gt;total&lt;/th&gt;
          &lt;th&gt;value&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;1637494020000&lt;/td&gt;
          &lt;td&gt;root.skywalking.service_cpm.&amp;ldquo;202111211127_ZTJlLXNlcnZpY2UtY29uc3VtZXI=.1&amp;rdquo;.&amp;ldquo;ZTJlLXNlcnZpY2UtY29uc3VtZXI=.1&amp;rdquo;&lt;/td&gt;
          &lt;td&gt;4&lt;/td&gt;
          &lt;td&gt;4&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The value of id and service_id are stored in the path in the specified order.&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Trace segment: segment&lt;br&gt;
segment entity has 10 columns at least: &lt;u&gt;id&lt;/u&gt;, segment_id, &lt;u&gt;trace_id&lt;/u&gt;, &lt;u&gt;service_id&lt;/u&gt;, service_instance_id, endpoint_id, start_time, latency, is_error, data_binary. In addition, it could have variable number of tags.&lt;br&gt;
When segment entity includes 2 rows with timestamp 1637494106000 and 1637494134000, these rows should be as following. The &lt;code&gt;db.type&lt;/code&gt; and &lt;code&gt;db.instance&lt;/code&gt; are two tags. The first data has two tags, and the second data doesn&amp;rsquo;t have tag.&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;id&lt;/th&gt;
          &lt;th&gt;segment_id&lt;/th&gt;
          &lt;th&gt;trace_id&lt;/th&gt;
          &lt;th&gt;service_id&lt;/th&gt;
          &lt;th&gt;service_instance_id&lt;/th&gt;
          &lt;th&gt;endpoint_id&lt;/th&gt;
          &lt;th&gt;start_time&lt;/th&gt;
          &lt;th&gt;latency&lt;/th&gt;
          &lt;th&gt;is_error&lt;/th&gt;
          &lt;th&gt;data_binary&lt;/th&gt;
          &lt;th&gt;db.type&lt;/th&gt;
          &lt;th&gt;db.instance&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;id_1&lt;/td&gt;
          &lt;td&gt;segment_id_1&lt;/td&gt;
          &lt;td&gt;trace_id_1&lt;/td&gt;
          &lt;td&gt;service_id_1&lt;/td&gt;
          &lt;td&gt;service_instance_id_1&lt;/td&gt;
          &lt;td&gt;endpoint_id_1&lt;/td&gt;
          &lt;td&gt;1637494106515&lt;/td&gt;
          &lt;td&gt;1425&lt;/td&gt;
          &lt;td&gt;0&lt;/td&gt;
          &lt;td&gt;data_binary_1&lt;/td&gt;
          &lt;td&gt;sql&lt;/td&gt;
          &lt;td&gt;testdb&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;id_2&lt;/td&gt;
          &lt;td&gt;segment_id_2&lt;/td&gt;
          &lt;td&gt;trace_id_2&lt;/td&gt;
          &lt;td&gt;service_id_2&lt;/td&gt;
          &lt;td&gt;service_instance_id_2&lt;/td&gt;
          &lt;td&gt;endpoint_id_2&lt;/td&gt;
          &lt;td&gt;2637494106765&lt;/td&gt;
          &lt;td&gt;1254&lt;/td&gt;
          &lt;td&gt;0&lt;/td&gt;
          &lt;td&gt;data_binary_2&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;And these row stored in IoTDB should be as following:
(Query SQL: &lt;code&gt;select from root.skywalking.segment align by device&lt;/code&gt;)&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Time&lt;/th&gt;
          &lt;th&gt;Device&lt;/th&gt;
          &lt;th&gt;start_time&lt;/th&gt;
          &lt;th&gt;data_binary&lt;/th&gt;
          &lt;th&gt;latency&lt;/th&gt;
          &lt;th&gt;endpoint_id&lt;/th&gt;
          &lt;th&gt;is_error&lt;/th&gt;
          &lt;th&gt;service_instance_id&lt;/th&gt;
          &lt;th&gt;segment_id&lt;/th&gt;
          &lt;th&gt;&amp;ldquo;db.type&amp;rdquo;&lt;/th&gt;
          &lt;th&gt;&amp;ldquo;db.instance&amp;rdquo;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;1637494106000&lt;/td&gt;
          &lt;td&gt;root.skywalking.segment.&amp;ldquo;id_1&amp;rdquo;.&amp;ldquo;service_id_1&amp;rdquo;.&amp;ldquo;trace_id_1&amp;rdquo;&lt;/td&gt;
          &lt;td&gt;1637494106515&lt;/td&gt;
          &lt;td&gt;data_binary_1&lt;/td&gt;
          &lt;td&gt;1425&lt;/td&gt;
          &lt;td&gt;endpoint_id_1&lt;/td&gt;
          &lt;td&gt;0&lt;/td&gt;
          &lt;td&gt;service_instance_id_1&lt;/td&gt;
          &lt;td&gt;segment_id_1&lt;/td&gt;
          &lt;td&gt;sql&lt;/td&gt;
          &lt;td&gt;testdb&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;1637494106000&lt;/td&gt;
          &lt;td&gt;root.skywalking.segment.&amp;ldquo;id_2&amp;rdquo;.&amp;ldquo;service_id_2&amp;rdquo;.&amp;ldquo;trace_id_2&amp;rdquo;&lt;/td&gt;
          &lt;td&gt;1637494106765&lt;/td&gt;
          &lt;td&gt;data_binary_2&lt;/td&gt;
          &lt;td&gt;1254&lt;/td&gt;
          &lt;td&gt;endpoint_id_2&lt;/td&gt;
          &lt;td&gt;0&lt;/td&gt;
          &lt;td&gt;service_instance_id_2&lt;/td&gt;
          &lt;td&gt;segment_id_2&lt;/td&gt;
          &lt;td&gt;null&lt;/td&gt;
          &lt;td&gt;null&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The value of id, service_id and trace_id are stored in the path in the specified order.
&lt;strong&gt;Notice&lt;/strong&gt;: If the measurement contains dot(&lt;code&gt;.&lt;/code&gt;), it will be wrapped in double quotation mark since IoTDB doesn&amp;rsquo;t allow it. In order to align, IoTDB will append null value for those data without tag in some models.&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;Log&lt;br&gt;
log entity has 12 columns at least: &lt;u&gt;id&lt;/u&gt;, unique_id, &lt;u&gt;service_id&lt;/u&gt;, service_instance_id, endpoint_id, &lt;u&gt;trace_id&lt;/u&gt;, trace_segment_id, span_id, content_type, content, tags_raw_data, timestamp. In addition, it could have variable number of tags.
When log entity includes a row with timestamp 1637494052000, the row should be as following and the level is a tag.&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;id&lt;/th&gt;
          &lt;th&gt;unique_id&lt;/th&gt;
          &lt;th&gt;service_id&lt;/th&gt;
          &lt;th&gt;service_instance_id&lt;/th&gt;
          &lt;th&gt;endpoint_id&lt;/th&gt;
          &lt;th&gt;trace_id&lt;/th&gt;
          &lt;th&gt;trace_segment_id&lt;/th&gt;
          &lt;th&gt;span_id&lt;/th&gt;
          &lt;th&gt;content_type&lt;/th&gt;
          &lt;th&gt;content&lt;/th&gt;
          &lt;th&gt;tags_raw_data&lt;/th&gt;
          &lt;th&gt;timestamp&lt;/th&gt;
          &lt;th&gt;level&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;id_1&lt;/td&gt;
          &lt;td&gt;unique_id_1&lt;/td&gt;
          &lt;td&gt;service_id_1&lt;/td&gt;
          &lt;td&gt;service_instance_id_1&lt;/td&gt;
          &lt;td&gt;endpoint_id_1&lt;/td&gt;
          &lt;td&gt;trace_id_1&lt;/td&gt;
          &lt;td&gt;trace_segment_id_1&lt;/td&gt;
          &lt;td&gt;0&lt;/td&gt;
          &lt;td&gt;1&lt;/td&gt;
          &lt;td&gt;content_1&lt;/td&gt;
          &lt;td&gt;tags_raw_data_1&lt;/td&gt;
          &lt;td&gt;1637494052118&lt;/td&gt;
          &lt;td&gt;INFO&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;And the row stored in IoTDB should be as following:
(Query SQL: &lt;code&gt;select from root.skywalking.log align by device&lt;/code&gt;)&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Time&lt;/th&gt;
          &lt;th&gt;Device&lt;/th&gt;
          &lt;th&gt;unique_id&lt;/th&gt;
          &lt;th&gt;content_type&lt;/th&gt;
          &lt;th&gt;span_id&lt;/th&gt;
          &lt;th&gt;tags_raw_data&lt;/th&gt;
          &lt;th&gt;&amp;ldquo;timestamp&amp;rdquo;&lt;/th&gt;
          &lt;th&gt;level&lt;/th&gt;
          &lt;th&gt;service_instance_id&lt;/th&gt;
          &lt;th&gt;content&lt;/th&gt;
          &lt;th&gt;trace_segment_id&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;1637494052000&lt;/td&gt;
          &lt;td&gt;root.skywalking.&amp;ldquo;id_1&amp;rdquo;.&amp;ldquo;service_id_1&amp;rdquo;.&amp;ldquo;trace_id_1&amp;rdquo;&lt;/td&gt;
          &lt;td&gt;unique_id_1&lt;/td&gt;
          &lt;td&gt;1&lt;/td&gt;
          &lt;td&gt;0&lt;/td&gt;
          &lt;td&gt;tags_raw_data_1&lt;/td&gt;
          &lt;td&gt;1637494052118&lt;/td&gt;
          &lt;td&gt;INFO&lt;/td&gt;
          &lt;td&gt;service_instance_id_1&lt;/td&gt;
          &lt;td&gt;content_1&lt;/td&gt;
          &lt;td&gt;trace_segment_id_1&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The value of id, service_id and trace_id are stored in the path in the specified order.
&lt;strong&gt;Notice&lt;/strong&gt;: If the measurement named timestamp, it will be wrapped in double quotation mark since IoTDB doesn&amp;rsquo;t allow it.&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;Profiling snapshots: profile_task_segment_snapshot&lt;br&gt;
profile_task_segment_snapshot entity has 6 columns: &lt;u&gt;id&lt;/u&gt;, task_id, segment_id, dump_time, sequence, stack_binary.
When profile_task_segment_snapshot includes a row with timestamp 1637494131000, the row should be as following.&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;id&lt;/th&gt;
          &lt;th&gt;task_id&lt;/th&gt;
          &lt;th&gt;segment_id&lt;/th&gt;
          &lt;th&gt;dump_time&lt;/th&gt;
          &lt;th&gt;sequence&lt;/th&gt;
          &lt;th&gt;stack_binary&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;id_1&lt;/td&gt;
          &lt;td&gt;task_id_1&lt;/td&gt;
          &lt;td&gt;segment_id_1&lt;/td&gt;
          &lt;td&gt;1637494131153&lt;/td&gt;
          &lt;td&gt;0&lt;/td&gt;
          &lt;td&gt;stack_binary_1&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;And the row stored in IoTDB should be as following:
(Query SQL: &lt;code&gt;select from root.skywalking.profile_task_segment_snapshot align by device&lt;/code&gt;)&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Time&lt;/th&gt;
          &lt;th&gt;Device&lt;/th&gt;
          &lt;th&gt;sequence&lt;/th&gt;
          &lt;th&gt;dump_time&lt;/th&gt;
          &lt;th&gt;stack_binary&lt;/th&gt;
          &lt;th&gt;task_id&lt;/th&gt;
          &lt;th&gt;segment_id&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;1637494131000&lt;/td&gt;
          &lt;td&gt;root.skywalking.profile_task_segment_snapshot.&amp;ldquo;id_1&amp;rdquo;&lt;/td&gt;
          &lt;td&gt;0&lt;/td&gt;
          &lt;td&gt;1637494131153&lt;/td&gt;
          &lt;td&gt;stack_binary_1&lt;/td&gt;
          &lt;td&gt;task_id_1&lt;/td&gt;
          &lt;td&gt;segment_id_1&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The value of id is stored in the path in the specified order.&lt;/p&gt;
&lt;h3 id=&#34;query&#34;&gt;Query&lt;/h3&gt;
&lt;p&gt;In this design, part of the data is stored in memory through &lt;code&gt;LayerName&lt;/code&gt;, so data from the same Model is spread across multiple &lt;code&gt;devices&lt;/code&gt;. Queries often need to cross multiple &lt;code&gt;devices&lt;/code&gt;. But in this aspect, IoTDB&amp;rsquo;s support is not perfect in cross-device aggregation query, sort query and pagination query. In some cases, we have to use a &lt;strong&gt;violence method&lt;/strong&gt; that query all data meets the condition and then aggregate, sort or paginate them. So it might not be efficient. For detailed descriptions, please refer to the Discussion submitted in IoTDB community below.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Discussion:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/apache/iotdb/discussions/3888&#34;&gt;一个有关排序查询的问题（A problem about sort query）#3888&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/apache/iotdb/discussions/3907&#34;&gt;一个有关聚合查询的问题（A problem about aggregation query）#3907&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Query SQL for the general example above:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;-- query all data in model1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;select&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;root&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;skywalking&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;model1_name&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;align&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;by&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;device&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;-- query the data in model2 with column22_value=&amp;#34;test&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;select&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;root&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;skywalking&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;model2_name&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;test&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;align&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;by&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;device&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;-- query the sum of column23 in model2 and group by column21
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;select&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;sum&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;column23&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;root&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;skywalking&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;model2_name&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;group&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;by&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;level&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;;&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;iotdb-cli is a useful tools to connect and visit IoTDB server. More information please refer &lt;a href=&#34;https://iotdb.apache.org/UserGuide/V0.12.x/CLI/Command-Line-Interface.html&#34;&gt;Command Line Interface(CLI)&lt;/a&gt;&lt;/p&gt;

      </description>
    </item>
    
  </channel>
</rss>
