通过Avro反序列化C#中的Flume事件

通过Avro反序列化C#中的Flume事件,c#,flume,avro,C#,Flume,Avro,我已经建立了一个Flume服务,它可以监视Netcat或跟踪日志,并将Exec作为源,诸如此类。Im使用内存作为通道,Avro作为接收器(文件中指定了节俭,但在Flume 1.3或1.4中似乎不起作用) 我已经设置了一个C#socket服务器来接收消息,我得到了一个字节流。如果我使用Encoding.UTF8.GetString(buffer)读取它们,那么我可以看到如下内容: "\0\0\0\0\0\0\0\0\00�����Tt������5\ne\0�����Tt������5\ne\0\

我已经建立了一个Flume服务,它可以监视Netcat或跟踪日志,并将Exec作为源,诸如此类。Im使用内存作为通道,Avro作为接收器(文件中指定了节俭,但在Flume 1.3或1.4中似乎不起作用)

我已经设置了一个C#socket服务器来接收消息,我得到了一个字节流。如果我使用Encoding.UTF8.GetString(buffer)读取它们,那么我可以看到如下内容:

"\0\0\0\0\0\0\0\0\00�����Tt������5\ne\0�����Tt������5\ne\0\0appendBatch\0\0�\0�127.0.0.1 - - [12/Nov/2013:22:42:50 +0000] \"GET /docs/appdev/index.html HTTP/1.1\" 200 7645\0�127.0.0.1 - - [12/Nov/2013:22:44:07 +0000] \"GET /docs/appdev/introduction.html HTTP/1.1\" 200 8619\0�127.0.0.1 - - [12/Nov/2013:22:44:09 +0000] \"GET /docs/appdev/installation.html HTTP/1.1\" 200 9045\0�127.0.0.1 - - [12/Nov/2013:22:44:12 +0000] \"GET /docs/appdev/deployment.html HTTP/1.1\" 200 18800\0�127.0.0.1 - - [12/Nov/2013:22:49:07 +0000] \"GET /docs/appdev/source.html HTTP/1.1\" 200 24554\0�127.0.0.1 - - [12/Nov/2013:22:50:38 +0000] \"GET /docs/appdev/processes.html HTTP/1.1\" 200 30743\0�127.0.0.1 - - [12/Nov/2013:22:51:39 +0000] \"GET /docs/appdev/sample/ HTTP/1.1\" 200 1852\0�0:0:0:0:0:0:0:1 - - [12/Nov/2013:22:51:48 +0000] \"GET /sample HTTP/1.1\" 404 963\0�0:0:0:0:0:0:0:1 - - [12/Nov/2013:22:51:48 +0000] \"GET /favicon.ico HTTP/1.1\" 200 21630\0�0:0:0:0:0:0:0:1 - - [12/Nov/2013:23:02:13 +0000] \"GET /sample HTTP/1.1\" 404 963\0"
很明显,我正在理解数据,但我希望正确地反序列化它,而不是进行某种正则表达式提取。我可以看到有一个官方的avroc#库,还有一个微软的Hadoop库,它有反序列化库。我创建了一个要反序列化的本地对象:

[DataContract]
public class AvroEvent
{
    [DataMember]
    public byte[] Body { get; set; }
}
然后尝试使用以下命令反序列化:

  client = serverSocket.EndAccept(result);
  var myNetworkStream = new NetworkStream(client);
  myNetworkStream.Read(buffer, 0, size);
  var avro = new AvroSerializer(typeof(AvroEvent));
  var deser = avro.Deserialize(myNetworkStream);
然后我得到这个错误:

  System.InvalidOperationException was unhandled
  HResult=-2146233079
  Message=Unexpected number of bytes.
  Source=Microsoft.Hadoop.Avro
我几乎可以肯定这一切都是以错误的方式进行的,我相信人们会告诉我不要使用C#,但我在谷歌上几乎已经没有资源了,所以如果其他人真的这样做并为我指明了正确的方向,我将非常感激

托比

Flume用于交流事件。如果选择了Avro,则Flume依赖于哪个is(如新增内容中所述),因为它仅用于序列化框架

从技术上讲,
反序列化()
方法期望流具有以下数据(以位为单位):

11[可变长度之字形编码的字节数组大小][实际字节]
(*)

您收到的错误可能是因为收到的数据具有不同的格式



*起始
1
是必需的,因为库的版本将每个类型封装在null(0)和类型(1)的并集中,因此第一个
1
用于记录AvroEvent,第二个
1
用于字段
正文
。此行为在最新版本中是可配置的。

您能否澄清对
myNetworkStream.Read
的调用在做什么?目前,您似乎试图在反序列化之前丢弃
size
字节。如果这是你的意图,我会添加一条评论。哦,不确定,我对此感到茫然,我需要一个字节流从套接字提供给Avro反序列化程序。我会再试一次,但一旦我对流进行了排序,可能会出现一些Avro/C问题。或者不是…我真正的需要是将实时日志数据发送到.net客户端,在那里我将最高效地管理如何处理这些数据-结果是答案是“logstash”,而不是Flume。。。。