我正在使用 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 正常工作。


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!