如何在天鹅座中正确设置列模式?

时间:2015-12-11 13:11:03

标签: fiware fiware-cygnus

  1. 我有天鹅座在行模式下自动工作正常。但我想切换到列模式,这意味着我现在必须手动设置具有适当列类型的表(对吗?)。

  2. 我认为属性的列类型应该与我在上下文代理中指定的属性相对应(即Temperature:float; pressure:integer;依此类推),我是否正确?

  3. 但是这些类型呢:

  4. recvTime(我猜日期时间?); fiwareservicepath(string?); entityId(整数?); entityType(string?); temperature_md(浮动与温度相同还是什么?); pressure_md(它是与压力相同的整数还是什么?);

    1. 此外,我真的可以不使用以下列:
    2. _md列; fiwareservicepath

      我可以删除吗?

      1. 最后这个场景中的主键在哪里?我可以手动添加ID并将其设置为自动增量而不会遇到与Cygnus的任何冲突吗?
      2. EDIT1:我尝试按照我在步骤3中推测的那样输入类型,并在日志中获得以下输出:

        11 Dec 2015 15:22:12,783 INFO  [conf-file-poller-0] (org.apache.flume.instrumentation.MonitoredCounterGroup.stop:167)  - Shutdown Metric for type: CHANNEL, name: mysql-channel. channel.event.take.attempt == 1
        11 Dec 2015 15:22:12,784 INFO  [conf-file-poller-0] (org.apache.flume.instrumentation.MonitoredCounterGroup.stop:167)  - Shutdown Metric for type: CHANNEL, name: mysql-channel. channel.event.take.success == 0
        11 Dec 2015 15:22:12,785 INFO  [conf-file-poller-0] (org.apache.flume.node.Application.startAllComponents:138)  - Starting new configuration:{ sourceRunners:{http-source=EventDrivenSourceRunner: { source:org.apache.flume.source.http.HTTPSource{name:http-source,state:START} }} sinkRunners:{mysql-sink=SinkRunner: { policy:org.apache.flume.sink.DefaultSinkProcessor@2e5babc counterGroup:{ name:null counters:{runner.interruptions=1, runner.backoffs.consecutive=1, runner.backoffs=1} } }} channels:{mysql-channel=org.apache.flume.channel.MemoryChannel{name: mysql-channel}} }
        11 Dec 2015 15:22:12,787 INFO  [conf-file-poller-0] (org.apache.flume.node.Application.startAllComponents:145)  - Starting Channel mysql-channel
        11 Dec 2015 15:22:12,789 INFO  [lifecycleSupervisor-1-4] (org.apache.flume.instrumentation.MonitoredCounterGroup.start:94)  - Component type: CHANNEL, name: mysql-channel started
        11 Dec 2015 15:22:12,792 INFO  [conf-file-poller-0] (org.apache.flume.node.Application.startAllComponents:173)  - Starting Sink mysql-sink
        11 Dec 2015 15:22:12,793 INFO  [lifecycleSupervisor-1-2] (com.telefonica.iot.cygnus.sinks.OrionMySQLSink.start:152)  - [mysql-sink] Startup completed
        11 Dec 2015 15:22:12,794 INFO  [conf-file-poller-0] (org.apache.flume.node.Application.startAllComponents:184)  - Starting Source http-source
        11 Dec 2015 15:22:12,800 INFO  [lifecycleSupervisor-1-1] (com.telefonica.iot.cygnus.interceptors.GroupingInterceptor.initialize:92)  - Grouping rules read: 
        11 Dec 2015 15:22:12,802 ERROR [lifecycleSupervisor-1-1] (com.telefonica.iot.cygnus.interceptors.GroupingInterceptor.parseGroupingRules:165)  - Error while parsing the Json-based grouping rules file. Details=null
        11 Dec 2015 15:22:12,803 WARN  [lifecycleSupervisor-1-1] (com.telefonica.iot.cygnus.interceptors.GroupingInterceptor.initialize:98)  - Grouping rules syntax has errors
        11 Dec 2015 15:22:12,804 INFO  [lifecycleSupervisor-1-1] (org.mortbay.log.Slf4jLog.info:67)  - jetty-6.1.26
        11 Dec 2015 15:22:12,809 INFO  [lifecycleSupervisor-1-1] (org.mortbay.log.Slf4jLog.info:67)  - Started SocketConnector@0.0.0.0:5050
        11 Dec 2015 15:22:12,810 INFO  [lifecycleSupervisor-1-1] (org.apache.flume.instrumentation.MonitoredCounterGroup.start:94)  - Component type: SOURCE, name: http-source started
        11 Dec 2015 15:22:46,806 INFO  [SinkRunner-PollingRunner-DefaultSinkProcessor] (com.telefonica.iot.cygnus.sinks.OrionSink.process:246)  - Batch accumulation time reached, the batch will be processed as it is
        
        1. 所以我猜我应该对匹配规则做些什么。但我不知道是什么?我尝试使用grouping_rules.conf中提供的链接,但它返回404。
        2. EDIT2:这是我正在使用的创建表脚本:

          CREATE TABLE sensor_room1_room (
          sensor_room1_roomID INT NOT NULL AUTO_INCREMENT, 
          recvTime varchar(40), 
          fiwareservicepath varchar(40), 
          entityId int (10), 
          entityType varchar (40), 
          pressure int (3), 
          pressure_md int(3), 
          temperature float (5), 
          temperature_md float(5), 
          PRIMARY KEY (sensor_room1_roomID));
          

          EDIT3 :这里有些问题,我没有什么可继续的。看看我的表结构:

          mysql> describe sensor;
          +-------------------+------------+------+-----+---------+-------+
          | Field             | Type       | Null | Key | Default | Extra |
          +-------------------+------------+------+-----+---------+-------+
          | recvTime          | mediumtext | YES  |     | NULL    |       |
          | fiwareservicepath | text       | YES  |     | NULL    |       |
          | entityId          | text       | YES  |     | NULL    |       |
          | entityType        | text       | YES  |     | NULL    |       |
          | pressure          | text       | YES  |     | NULL    |       |
          | pressure_md       | text       | YES  |     | NULL    |       |
          | temperature       | text       | YES  |     | NULL    |       |
          | temperature_md    | text       | YES  |     | NULL    |       |
          +-------------------+------------+------+-----+---------+-------+
          8 rows in set (0.00 sec)
          

          我正在通过这个NGSI命令:

          (curl localhost:1026/v1/updateContext -s -S --header 'Content-Type: application/json' \
              --header 'Accept: application/json' -d @- | python -mjson.tool) <<EOF
          {
              "contextElements": [
                  {
                      "type": "Room",
                      "isPattern": "false",
                      "id": "Room1",
                      "attributes": [
                          {
                              "name": "temperature",
                              "type": "float",
                              "value": "321"
                          },
                          {
                              "name": "pressure",
                              "type": "integer",
                              "value": "123"
                          }
                      ]
                  }
              ],
              "updateAction": "APPEND"
          } 
          EOF
          

          我在日志中收到此错误:

          14 Dec 2015 14:42:46,248 INFO  [1161924167@qtp-1635328039-1] (com.telefonica.iot.cygnus.handlers.OrionRestHandler.getEvents:255)  - Event put in the channel (id=110985483, ttl=10)
          14 Dec 2015 14:43:09,258 INFO  [SinkRunner-PollingRunner-DefaultSinkProcessor] (com.telefonica.iot.cygnus.sinks.OrionSink.process:246)  - Batch accumulation time reached, the batch will be processed as it is
          14 Dec 2015 14:43:09,266 INFO  [SinkRunner-PollingRunner-DefaultSinkProcessor] (com.telefonica.iot.cygnus.sinks.OrionMySQLSink.persistAggregation:429)  - [mysql-sink] Persisting data at OrionMySQLSink. Database (trace_data), Table (sensor), Fields ((recvTime,fiwareservicepath,entityId,entityType,temperature,temperature_md)), Values (('2015-12-14T13:42:46.206Z','sensor','Room1','Room','321','[]'),('2015-12-14T13:42:46.170Z','sensor','Room1','Room','321','[]'),('2015-12-14T13:42:46.220Z','sensor','Room1','Room','321','[]'),('2015-12-14T13:42:46.223Z','sensor','Room1','Room','321','[]'),('2015-12-14T13:42:46.225Z','sensor','Room1','Room','321','[]'),('2015-12-14T13:42:46.228Z','sensor','Room1','Room','123','[]','321','[]'),('2015-12-14T13:42:46.248Z','sensor','Room1','Room','123','[]','321','[]'))
          14 Dec 2015 14:43:09,300 WARN  [SinkRunner-PollingRunner-DefaultSinkProcessor] (com.telefonica.iot.cygnus.sinks.OrionSink.process:318)  - Bad context data (Column count doesn't match value count at row 6)
          14 Dec 2015 14:43:09,300 INFO  [SinkRunner-PollingRunner-DefaultSinkProcessor] (com.telefonica.iot.cygnus.sinks.OrionSink.process:323)  - Finishing transaction (1450100555-186-0000000001,1450100555-186-0000000000,1450100555-186-0000000002,1450100555-186-0000000003,1450100555-186-0000000005,1450100555-186-0000000004,1450100555-186-0000000006)
          14 Dec 2015 14:43:39,305 INFO  [SinkRunner-PollingRunner-DefaultSinkProcessor] (com.telefonica.iot.cygnus.sinks.OrionSink.process:246)  - Batch accumulation time reached, the batch will be processed as it is
          14 Dec 2015 14:43:39,305 INFO  [SinkRunner-PollingRunner-DefaultSinkProcessor] (com.telefonica.iot.cygnus.sinks.OrionSink.process:295)  - Finishing transaction ()
          

          7。这里有冲突(列数与第6行的值计数不匹配)我无法解决。有什么建议吗?

          8。我仍然需要在那里包含tableID,但不知道怎么做?

          我应该强调,我选择的数据库只是MySql。

1 个答案:

答案 0 :(得分:2)

我将通过子弹回答您的问题:

  1. 是的,在使用OrionMySQLSink的列模式下工作时,必须提前配置表。您可以在here找到解释。
  2. 这不是强制性的,因为Orion Context Broker所述的类型并不具有任何意义;它们没有真正的语义,但它们对您,用户来说具有语义。我的意思是,你可以说温度属性有一个&#34;浮动&#34;类型,或&#34;摄氏度&#34;类型,或&#34;马铃薯&#34;。这就是OrionMySQLSink的列模式无法自动创建表的原因。无论如何,属性值将被&#34;铸造&#34;由MySQL驱动程序到您在表定义中声明的MySQL类型。你能编辑一下显示你的表创建命令的问题吗?
  3. 每值的价值:
    • recvTime - &gt;通常为DATETIME,但也可以是TEXT或VARCHAR,具体取决于您希望如何使用此值。
    • fiwareservicepath - &gt;通常是TEXT,但也可以是INTEGER,具体取决于它是字符串还是数字。
    • entityId - &gt;通常是TEXT,但也可以是INTEGER,具体取决于它是字符串还是数字。
    • entityType - &gt;通常是TEXT,但也可以是INTEGER,具体取决于它是字符串还是数字。
    • temperature_md - &gt;通常是TEXT,因为这可以是Json值,但我认为最新版本的MySQL支持JSON类型。
    • pressure_md - &gt;通常是TEXT,因为这可以是Json值,但我认为最新版本的MySQL支持JSON类型。
  4. 您无法删除它们,因为OrionMySQLSink期望找到这些元数据字段。
  5. OrionMySQLSink不会自行添加任何主键。您建议使用auot-increment键添加的内容。
  6. 不一定。事实上,尽管存在这样的错误,分组规则文件仍然是空的(Cygnus毕竟会运行)。
  7. 修改

    1. 问题在于,您在Cygnus收到的所有通知都没有相同的属性长度。因此,当批量聚合它们时,存在字段和值的数量的问题。如果查看official documentation,您会发现在列模式下工作时需要发送所有属性:
        

      仅当您的订阅设计为始终发送相同的属性时才建议使用列模式,如果自上次通知后未更新,则建议使用该事件。

    2. 另一种解决方案可能是移动到配置的batch_size为1;您的性能可能不太好,但每个通知都将独立于其他通知进行处理,因此,每个MySQL查询都将具有与查询值匹配的查询字段。

      1. 只需使用此自动增量字段创建表格,每次Cygnus插入新行时,此字段将自动更新。