2014-04-08 19 views
10

Vorrei serializzare i dati da un oggetto JSON e inviarlo tramite la rete con kafka come fine. Ora ho uno schema Avro in un file, che determinati i campi necessari per inviare a Kafka per il sistema di registrazione:Serializzare i dati con Avro nel nodo 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"} 
     ] 
} 

Sto usando un nodo pacchetti 'avro-schema', ho provato altri ma nessuno di poi stanno funzionando bene, ho solo bisogno di serializzare in modo avro dal nodo js.

risposta

2

Ecco un esempio di ciò che stiamo facendo per un caso di utilizzo simile in cui inviamo i record Avro in un'altra coda (Amazon Kinesis), adattata al tuo schema. Lo stiamo usando con node-avro-io 0.2.0 e 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(); 

Gli esempi per il nodo-avro-io, al momento della scrittura, sono per la serializzazione/deserializzazione file Avro sul filesystem. Questo esempio utilizza il pacchetto stream-to-array come collegamento per ottenere un Buffer dal pacchetto node-avro-io basato sul flusso. Buffer può essere inviato alla tua coda come messaggio nel tuo produttore Kafka.

Alcuni altri pacchetti node.js, come l'avronode e Collective's node-avro, sono wrapper per la libreria C++. Non ho avuto tanto successo con questi pacchetti. Ecco un tl: dr per le istruzioni di installazione della libreria Avro C++ di node-avro (creazione di un pacchetto .deb per esso). Può essere d'aiuto con qualsiasi pacchetto di wrapper 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 

Per il nodo-avro Collective, ho dovuto rimuovere la riga export CXXFLAGS="-fcxx-exceptions" dallo script bin/install-and-run-tests su Ubuntu 14.04.

5

Con 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); 

È possibile trovare maggiori informazioni sui vari metodi di codifica disponibili here.

+1

Brillante. Proprio quello di cui avevo bisogno. Grazie! – N3da

Problemi correlati