在节点js中使用Avro序列化数据

时间:2014-04-08 11:25:58

标签: json node.js serialization avro

我想序列化来自JSON对象的数据,并通过网络将其发送到kafka作为结束。现在我在一个文件中有一个avro模式,它确定了为日志系统发送到kafka所需的字段:

{"namespace": "com.company.wr.messages",
   "type": "record",
   "name": "Log",
   "fields": [
       {"name": "timestamp", "type": "long"},
       {"name": "source", "type": "string"},
       {"name": "version", "type": "string"},
       {"name": "ipAddress", "type": "string"},
       {"name": "name", "type": "string"},
       {"name": "level", "type": "string"},
       {"name": "errorCode", "type": "string"},
       {"name": "message", "type": "string"}
       ]
}

我正在使用节点包&avro-schema',我尝试了其他人,但当时没有一个工作正常,我只需要从节点js以avro方式序列化。

2 个答案:

答案 0 :(得分:5)

使用avsc

Tools > Extensions and Updates

您可以找到有关各种编码方法的更多信息here

答案 1 :(得分:2)

以下是我们针对类似用例所做的示例,其中我们将Avro记录发送到适合您的架构的另一个队列(Amazon Kinesis)。我们将它与node-avro-io 0.2.0和stream-to-arry 2.0.2一起使用。

var avro = require('node-avro-io');
var toArray = require('stream-to-array');
var schema = {
    "namespace": "com.company.wr.messages",
    "type": "record",
    "name": "Log",
    "fields": [
        {"name": "timestamp", "type": "long"},
        {"name": "source", "type": "string"},
        {"name": "version", "type": "string"},
        {"name": "ipAddress", "type": "string"},
        {"name": "name", "type": "string"},
        {"name": "level", "type": "string"},
        {"name": "errorCode", "type": "string"},
        {"name": "message", "type": "string"}
    ]
};
var writer = new avro.DataFile.Writer(schema, "snappy");
toArray(writer, function(err, arr) {
    var dataBuffer = Buffer.concat(arr);
    // Send dataBuffer to Kafka here
});
var record = {
    "timestamp": 123,
    "source": "example.com",
    "version": "HTTP 1.1",
    "ipAddress": "123.123.123.123",
    "name": "Jim",
    "level": "INFO",
    "errorCode": "200",
    "message": "foo"
};
writer.append(record).end();

在撰写本文时,node-avro-io的示例用于序列化/反序列化文件系统上的Avro文件。此示例使用stream-to-array包作为从基于流的node-avro-io包中获取Buffer的快捷方式。 Buffer可以作为Kafka制作人的消息发送到您的队列。

其他一些node.js包(例如avronode和Collective's node-avro)是C ++库的包装器。我对这些包没有那么多的成功。这是node-avro的Avro C ++库安装说明(为它构建一个.deb包)的tl:dr。它可以帮助任何C ++包装器包。

sudo apt-get install -y libboost-all-dev cmake checkinstall
ssh clone git@github.com:apache/avro.git
cd avro
git checkout release-1.7.7
cd lang/c++
cmake -G "Unix Makefiles"
sudo checkinstall -y \
    --install=no \
    --pkgname="avro-cpp" \
    --pkgrelease="1.7.7" \
    --maintainer="me@example.com" \
    --addso=yes

对于Collective的node-avro,我不得不从Ubuntu 14.04上的export CXXFLAGS="-fcxx-exceptions"脚本中删除bin/install-and-run-tests行。