Fiware 如何在cygnus中正确设置列模式?

Fiware 如何在cygnus中正确设置列模式?,fiware,fiware-cygnus,Fiware,Fiware Cygnus,我让cygnus在行模式下自动正常工作。但我想切换到列模式,这意味着我现在必须手动设置具有适当列类型的表(对吗?) 我认为属性的列类型应该对应于我在context broker中指定的属性(即温度:float;压力:integer;等等),对吗 但是这些类型呢: recvTime(我猜是datetime?); fiwareservicepath(字符串?); entityId(整数?); entityType(字符串?); 温度(浮子是否与温度相同?); 压力_md(它是整数还是什么?) 此外,

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

  • 我认为属性的列类型应该对应于我在context broker中指定的属性(即温度:float;压力:integer;等等),对吗

  • 但是这些类型呢:

  • recvTime(我猜是datetime?); fiwareservicepath(字符串?); entityId(整数?); entityType(字符串?); 温度(浮子是否与温度相同?); 压力_md(它是整数还是什么?)

  • 此外,我真的可以不用以下专栏:
  • _md柱; fiwareservicepath

    我能把那些拿走吗

  • 最后,在这个场景中,主键在哪里?我可以手动添加ID并将其设置为自动增量,而不与Cygnus发生任何冲突吗
  • 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
    
    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 ()
    
  • 所以我猜我应该对匹配规则做些什么。但我不知道是什么?我尝试使用中提供的链接,但它返回404
  • 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));
    
    编辑3:这里有点不对劲,我没什么可说的。看看我的表格结构:

    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
    
    7。这里有一个冲突(列计数与第6行的值计数不匹配),我无法解决。有什么建议吗?

    8。我仍然需要在其中包含tableID,但不知道如何添加?


    我应该在此强调,我选择的数据库只有MySql。我将逐一回答您的问题:

  • 是,当使用
    OrionMySQLSink
    在列模式下工作时,必须预先设置表。你可以找到这方面的解释
  • 它不是强制性的,因为Orion上下文代理中声明的类型没有任何意义;他们没有真正的语义,但他们对你,用户有语义。我的意思是,你可以说温度属性有“浮动”类型,或“摄氏度”类型,或“土豆”。这就是为什么
    OrionMySQLSink
    的列模式无法自动创建表的原因。无论如何,MySQL驱动程序会将属性值“转换”为您在表定义中声明的MySQL类型。能否编辑显示表格创建命令的问题
  • 每个值的值:
    • recvTime-->通常为DATETIME,但也可以是TEXT或VARCHAR,具体取决于您希望如何使用此值
    • fiwareservicepath-->通常为文本,但也可以是整数,具体取决于它是字符串还是数字
    • entityId-->通常为文本,但也可以是整数,具体取决于它是字符串还是数字
    • entityType-->通常为文本,但也可以是整数,具体取决于它是字符串还是数字
    • temperature_md-->通常是文本,因为这可以是Json值,不过我认为MySQL的最新版本支持Json类型
    • pressure_md-->通常为文本,因为这可以是Json值,但我认为MySQL的最新版本支持Json类型
  • 您无法删除它们,因为
    OrionMySQLSink
    希望找到这些元数据字段
  • OrionMySQLSink
    本身不添加任何主键。这是您可以通过使用auot增量键添加的内容,正如您所建议的那样
  • 不一定。事实上,尽管存在这样的错误,分组规则文件仍然可以是空的(Cygnus毕竟会运行)
  • 编辑

  • 问题在于,并非所有在Cygnus收到的通知都具有相同的属性长度。因此,在批量聚合它们时,字段和值的数量会出现问题。如果查看,您会发现在列模式下工作时,所有属性都被发送是必需的: 仅当您的订阅设计为始终发送相同的属性时,才建议使用列模式,如果自上次通知后这些属性未更新,则建议使用列模式

  • 另一个解决方案是将配置的
    批量大小
    设置为1;您的性能可能不太好,但每个通知都将独立于其他通知进行处理,因此,每个MySQL查询都会有与查询值匹配的查询字段

  • 只需使用此自动递增字段创建表,每次Cygnus插入新行时,此字段将自动更新

  • 请看我的编辑3。我更改了edit2的表结构,因为edit2也不起作用。它现在起作用了,但是你能详细说明一下“你的表现可能不太好”吗?2.你这是什么意思?3.如果我有10个实体,每个实体同时发送10个属性呢?4.它会工作得稍慢一点(这对我来说很好)还是根本不会处理一些,从而导致数据丢失(这很不好)?批处理机制提高了性能,因为对一组通知只进行了一次插入。当使用1的批处理大小时,对于发送的每个通知,都会在MySQL中进行插入。如果您在场景中生成的所有通知都可以逐个处理,那么这不一定是一个问题。你的天鹅座能做到吗?这取决于与MySQL服务器的连接质量、MySQL服务器本身、运行Cygnus的主机的CPU等。顺便说一句,Cygnus的旧版本是这样的,即1个通知:1个插入,大多数用户对性能都满意。不管怎样,您是否尝试了第一种解决方法?例如,更改订阅?这是非常容易的,配料机制将工作。很高兴听到这个!事实上,在研究了代码之后,这将是官方的