Flume 事件 headers 中的预期时间戳,但它为空
Expected timestamp in the Flume event headers, but it was null
我正在使用以下配置详细信息使用 Flume 将 Twitter 提要推送到 HDFS,但在 Flume 事件 headers 中得到预期时间戳,但它是空的
twitter.conf
TwitterAgent.sources = Twitter
TwitterAgent.channels = MemChannel
TwitterAgent.sinks = HDFS
TwitterAgent.sources.Twitter.type = org.apache.flume.source.twitter.TwitterSource
TwitterAgent.sources.Twitter.channels = MemChannel
TwitterAgent.sources.Twitter.consumerKey = xxxxxxxxxxxxxxxxxxxxx
TwitterAgent.sources.Twitter.consumerSecret = xxxxxxxxxxxxxxxxxxxxxxxx
TwitterAgent.sources.Twitter.accessToken = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TwitterAgent.sources.Twitter.accessTokenSecret = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TwitterAgent.sources.Twitter.keywords = bigdata, hadoop, hive, hbase
TwitterAgent.sinks.HDFS.channel = MemChannel
TwitterAgent.sinks.HDFS.type = hdfs
TwitterAgent.sinks.HDFS.hdfs.path = /user/farooque/bigdata/tweets/%Y/%m/%d/%H/
TwitterAgent.sinks.HDFS.hdfs.fileType = DataStream
TwitterAgent.sinks.HDFS.hdfs.writeFormat = Text
TwitterAgent.sinks.HDFS.hdfs.batchSize = 10
TwitterAgent.sinks.HDFS.hdfs.rollSize = 0
TwitterAgent.sinks.HDFS.hdfs.rollCount = 10000
TwitterAgent.channels.MemChannel.type = memory
TwitterAgent.channels.MemChannel.capacity = 10000
TwitterAgent.channels.MemChannel.transactionCapacity = 100
运行 命令
$ flume-ng agent --conf-file twitter.conf --name TwitterAgent
其中 twitter.conf
是我的配置文件名
但出现错误:
java.lang.NullPointerException: Expected timestamp in the Flume event headers, but it was null
at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:204)
at org.apache.flume.formatter.output.BucketPath.replaceShorthand(BucketPath.java:200)
at org.apache.flume.formatter.output.BucketPath.escapeString(BucketPath.java:396)
at org.apache.flume.sink.hdfs.HDFSEventSink.process(HDFSEventSink.java:388)
at org.apache.flume.sink.DefaultSinkProcessor.process(DefaultSinkProcessor.java:68)
at org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:147)
at java.lang.Thread.run(Thread.java:745)
15/06/04 18:26:01 ERROR flume.SinkRunner: Unable to deliver event. Exception follows.
需要进一步的帮助??
在 twitter.conf 中添加了一个配置 属性 as
TwitterAgent.sinks.HDFS.hdfs.useLocalTimeStamp = true
问题已解决。
使用选项 "TwitterAgent.sinks.HDFS.hdfs.useLocalTimeStamp = true",它将使用目的地(即 HDFS 接收器)的时间戳。相反,如果您想使用实际事件的时间戳,那么我们必须使用拦截器。在配置或属性文件中使用以下行。
TwitterAgent.sources.Twitter.interceptors = interceptor1
TwitterAgent.sources.Twitter.interceptors.interceptor1.type = timestamp
您正在使用 org.apache.flume.source.twitter.TwitterSource
,这是 Apache 提供的 Twitter 源代码。 Flume 事件中没有内置 timestamp
。所以你在这里有两个选择:
1) 在您的配置文件中使用 com.cloudera.flume.source.TwitterSource。
2) 或者您可以在配置文件中添加 TwitterAgent.sinks.HDFS.hdfs.useLocalTimeStamp = true
属性。
请注意,您遇到此问题是因为您在 HDFS 路径中指定了时间戳参数 /user/farooque/bigdata/tweets/%Y/%m/%d/%H/
。如果您不指定这些,那么 Apache 和 Cloudera 提供的源都可以正常工作。
我正在使用以下配置详细信息使用 Flume 将 Twitter 提要推送到 HDFS,但在 Flume 事件 headers 中得到预期时间戳,但它是空的
twitter.conf
TwitterAgent.sources = Twitter
TwitterAgent.channels = MemChannel
TwitterAgent.sinks = HDFS
TwitterAgent.sources.Twitter.type = org.apache.flume.source.twitter.TwitterSource
TwitterAgent.sources.Twitter.channels = MemChannel
TwitterAgent.sources.Twitter.consumerKey = xxxxxxxxxxxxxxxxxxxxx
TwitterAgent.sources.Twitter.consumerSecret = xxxxxxxxxxxxxxxxxxxxxxxx
TwitterAgent.sources.Twitter.accessToken = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TwitterAgent.sources.Twitter.accessTokenSecret = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TwitterAgent.sources.Twitter.keywords = bigdata, hadoop, hive, hbase
TwitterAgent.sinks.HDFS.channel = MemChannel
TwitterAgent.sinks.HDFS.type = hdfs
TwitterAgent.sinks.HDFS.hdfs.path = /user/farooque/bigdata/tweets/%Y/%m/%d/%H/
TwitterAgent.sinks.HDFS.hdfs.fileType = DataStream
TwitterAgent.sinks.HDFS.hdfs.writeFormat = Text
TwitterAgent.sinks.HDFS.hdfs.batchSize = 10
TwitterAgent.sinks.HDFS.hdfs.rollSize = 0
TwitterAgent.sinks.HDFS.hdfs.rollCount = 10000
TwitterAgent.channels.MemChannel.type = memory
TwitterAgent.channels.MemChannel.capacity = 10000
TwitterAgent.channels.MemChannel.transactionCapacity = 100
运行 命令
$ flume-ng agent --conf-file twitter.conf --name TwitterAgent
其中 twitter.conf
是我的配置文件名
但出现错误:
java.lang.NullPointerException: Expected timestamp in the Flume event headers, but it was null
at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:204)
at org.apache.flume.formatter.output.BucketPath.replaceShorthand(BucketPath.java:200)
at org.apache.flume.formatter.output.BucketPath.escapeString(BucketPath.java:396)
at org.apache.flume.sink.hdfs.HDFSEventSink.process(HDFSEventSink.java:388)
at org.apache.flume.sink.DefaultSinkProcessor.process(DefaultSinkProcessor.java:68)
at org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:147)
at java.lang.Thread.run(Thread.java:745)
15/06/04 18:26:01 ERROR flume.SinkRunner: Unable to deliver event. Exception follows.
需要进一步的帮助??
在 twitter.conf 中添加了一个配置 属性 as
TwitterAgent.sinks.HDFS.hdfs.useLocalTimeStamp = true
问题已解决。
使用选项 "TwitterAgent.sinks.HDFS.hdfs.useLocalTimeStamp = true",它将使用目的地(即 HDFS 接收器)的时间戳。相反,如果您想使用实际事件的时间戳,那么我们必须使用拦截器。在配置或属性文件中使用以下行。
TwitterAgent.sources.Twitter.interceptors = interceptor1
TwitterAgent.sources.Twitter.interceptors.interceptor1.type = timestamp
您正在使用 org.apache.flume.source.twitter.TwitterSource
,这是 Apache 提供的 Twitter 源代码。 Flume 事件中没有内置 timestamp
。所以你在这里有两个选择:
1) 在您的配置文件中使用 com.cloudera.flume.source.TwitterSource。
2) 或者您可以在配置文件中添加 TwitterAgent.sinks.HDFS.hdfs.useLocalTimeStamp = true
属性。
请注意,您遇到此问题是因为您在 HDFS 路径中指定了时间戳参数 /user/farooque/bigdata/tweets/%Y/%m/%d/%H/
。如果您不指定这些,那么 Apache 和 Cloudera 提供的源都可以正常工作。