2014-04-08 20 views
10

Chciałbym serializować dane z obiektu JSON i przesłać go przez sieć z kafka jako koniec. Teraz mam Avro schematu w pliku, który zdeterminowany pola wymagane do wysłania do Kafka dla systemu rejestrowania:Serializacja danych z Avro w węźle js

{"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"} 
     ] 
} 

używam „Avro-schemat” a pakiety węzła, próbowałem innych, ale żaden z czym działa dobrze, po prostu muszę serializować w avro sposób od węzła js.

Odpowiedz

2

Oto przykład tego, co robimy dla podobnego zastosowania, w którym wysyłamy rekordy Avro do innej kolejki (Amazon Kinesis), dostosowanej do twojego schematu. Używamy go z node-avro-io 0.2.0 i 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(); 

Przykłady dla węzła-Avro-IO, w momencie pisania tego tekstu, są dla szeregowania/deserializacji Avro plików w systemie plików. W tym przykładzie użyto pakietu stream-to-array jako skrótu do pobrania Buffer z pakietu node-avro-io opartego na strumieniu. Buffer może zostać wysłany do twojej kolejki jako wiadomość w twoim producencie Kafki.

Niektóre inne pakiety node.js, takie jak avronode i Collective's node-avro, są owijkami dla biblioteki C++. Nie miałem tak dużego sukcesu z tymi pakietami. Oto tl: dr instrukcji instalacji biblioteki Avro C++ przez node-avro (budowanie dla niej pakietu .deb). Może pomóc w każdym opakowaniu C++.

sudo apt-get install -y libboost-all-dev cmake checkinstall 
ssh clone [email protected]: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="[email protected]" \ 
    --addso=yes 

zbiorowego za węzła-Avro, musiałem usunąć wiersz export CXXFLAGS="-fcxx-exceptions" ze skryptu bin/install-and-run-tests na Ubuntu 14.04.

5

Z avsc:

var avro = require('avsc'); 

// Parse the schema. 
var logType = avro.parse({ 
    "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"} 
    ] 
}); 

// A sample log record. 
var obj = { 
    timestamp: 2313213, 
    source: 'src', 
    version: '1.0', 
    ipAddress: '0.0.0.0', 
    name: 'foo', 
    level: 'INFO', 
    errorCode: '', 
    message: '' 
}; 

// And its corresponding Avro encoding. 
var buf = logType.toBuffer(obj); 

można znaleźć więcej informacji na temat różnych metod kodowania dostępnych here.

+1

Brilliant. Dokładnie to, czego potrzebowałem. Dziękuję Ci! – N3da

Powiązane problemy