我正在使用 NGSIHDFSSink 通过 Cygnus 在 HDFS 上持久化。当收到来自 Orion 的第一个通知时,它会创建目录和包含数据的正确文件:
/user/hdfs/openiot/Lamp_001_Lamp/Lamp_001_Lamp.txt
但是,对于收到的下一个通知,它会显示以下错误:
There was some problem with the current endpoint, trying other one. Details: CygnusPersistenceError. /user/hdfs/openioLamp/Lamp_001_Lamp.txt file exists in HDFS, but could not write the data. Server response: 403 Forbidden.
这是我的接收器配置:
cygnus-ngsi.sinks.hdfs-sink.type = com.telefonica.iot.cygnus.sinks.NGSIHDFSSink
cygnus-ngsi.sinks.hdfs-sink.channel = hdfs-channel
cygnus-ngsi.sinks.hdfs-sink.enable_encoding = false
cygnus-ngsi.sinks.hdfs-sink.enable_grouping = false
cygnus-ngsi.sinks.hdfs-sink.enable_lowercase = false
cygnus-ngsi.sinks.hdfs-sink.enable_name_mappings = false
cygnus-ngsi.sinks.hdfs-sink.data_model = dm-by-entity
cygnus-ngsi.sinks.hdfs-sink.file_format = json-column
cygnus-ngsi.sinks.hdfs-sink.backend.impl = rest
cygnus-ngsi.sinks.hdfs-sink.backend.max_conns = 500
cygnus-ngsi.sinks.hdfs-sink.backend.max_conns_per_route = 100
cygnus-ngsi.sinks.hdfs-sink.hdfs_host = my_hdfs_ip
cygnus-ngsi.sinks.hdfs-sink.hdfs_port = 50070
cygnus-ngsi.sinks.hdfs-sink.hdfs_username = hdfs
cygnus-ngsi.sinks.hdfs-sink.hdfs_password =
cygnus-ngsi.sinks.hdfs-sink.oauth2_token =
cygnus-ngsi.sinks.hdfs-sink.service_as_namespace = false
cygnus-ngsi.sinks.hdfs-sink.batch_size = 100
cygnus-ngsi.sinks.hdfs-sink.batch_timeout = 30
cygnus-ngsi.sinks.hdfs-sink.batch_ttl = 10
cygnus-ngsi.sinks.hdfs-sink.batch_retry_intervals = 5000
cygnus-ngsi.sinks.hdfs-sink.hive = false
cygnus-ngsi.sinks.hdfs-sink.krb5_auth = false
有什么想法吗?
非常感谢
请您参考如下方法:
根据 HDFS sink documentation , Cygnus 使用 WebHDFS在 HDFS 中写入。
我不确定,但也许 WebHDFS 将“创建”和“写入”视为不同的权限,因此您的 WebHDFS 实例配置为仅允许前者而不允许后者。在这种情况下,WebHDFS 服务器的权限会出现问题。
我建议在没有 Cygnus 的情况下尝试 WebHDFS 本身(即使用 Postman 或 curl)以确保 WebHDFS 正常工作。