我想序列化来自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方式序列化。
答案 0 :(得分:5)
答案 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
行。