我使用新的partitionPath
选项定义了几个流,以便文件最终出现在Hadoop中的每日目录中:
stream create --name XXXX --definition "http --port=8300|hdfs-dataset --format=avro --idleTimeout=100000 --partitionPath=dateFormat('yyyy/MM/dd/')" --deploy
stream create --name YYYY --definition "http --port=8301|hdfs --idleTimeout=100000 --partitionPath=dateFormat('yyyy/MM/dd/')" --deploy
除了XXXX
之外,所有的流都已创建和部署:
17:42:49,102 INFO Deployer server.StreamDeploymentListener - Deploying stream Stream{name='XXXX'}
17:42:50,948 INFO Deployer server.StreamDeploymentListener - Deployment status for stream 'XXXX': DeploymentStatus{state=failed,error(s)=java.lang.IllegalArgumentException: Cannot instantiate 'IntegrationConfigurationInitializer': org.springframework.integration.jmx.config.JmxIntegrationConfigurationInitializer}
17:42:50,951 INFO Deployer server.StreamDeploymentListener - Stream Stream{name='XXXX'} deployment attempt complete
请注意,其数据会以avro格式进行处理和存储。 FWIW,其他流放入/xd/<NAME>/<rest of path>
,使用hdfs-dataset --format=avro
组合导致文件转到/xd/<NAME>/string
我没有使用partitionPath
选项重新定义它,并且部署了流。
我们这里有错误,或者我做错了什么?
答案 0 :(得分:1)
hdfs-dataset接收器用于将序列化POJO写入HDFS。我们使用Kite SDK风筝数据功能,因此请查看该项目以获取更多信息。
hdfs和hdfs-dataset的分区表达式不同。 hdfs-dataset遵循Kite SDK语法,您需要指定存储分区值的POJO字段。对于时间戳(长)字段,表达式如下所示:dateFormat('timestamp', 'YM', 'yyyyMM')
其中timestamp是字段的名称,&#39; YM&#39;是添加到分区目录的前缀,如YM201411
和&#39; yyyyMM&#39;是分区值所需的格式。如果您想要分区的年/月/日目录结构,可以使用year('timestamp')/month('timestamp')/day('timestamp')
。在Kite SDK Partitioned Datasets docs中有更多的报道。
对于您的示例,添加分区没有多大意义,因为您持久化了一个简单的String值。如果你确实添加了一个处理器来将数据转换为POJO,那么分区更有意义,我们在XD docs中有一些例子。