2014-04-08 18 views
10

में एवरो के साथ डेटा को सीरियलाइज करना मैं जेएसओएन ऑब्जेक्ट से डेटा को क्रमबद्ध करना चाहता हूं और इसे अंत में कफका के साथ नेटवर्क भेजना चाहता हूं। अब मैं एक फ़ाइल में एक एवरो स्कीमा, कि आवश्यक क्षेत्रों नियत प्रवेश प्रणाली के लिए काफ्का के लिए भेजने के लिए:नोड जेएस

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

मैं एक नोड संकुल 'एवरो-स्कीमा' का उपयोग कर रहा है, मैं दूसरों की कोशिश की लेकिन उसके बाद से कोई भी अच्छी तरह से काम कर रहे हैं, मुझे सिर्फ नोड जेएस से एवरो तरीके से क्रमबद्ध करने की आवश्यकता है।

उत्तर

2

यहां एक उदाहरण है कि हम एक समान उपयोग मामले के लिए क्या कर रहे हैं, जहां हम आपकी स्कीमा के अनुकूल अनुकूलित एक अन्य कतार (अमेज़ॅन किनेसिस) में एवरो रिकॉर्ड भेजते हैं। हम इसे node-avro-io 0.2.0 और स्ट्रीम-टू-मेरी 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(); 

नोड एवरो-कब के लिए उदाहरण, लेखन के समय, serializing/फाइल सिस्टम पर एवरो फ़ाइलों deserializing के लिए कर रहे हैं। स्ट्रीम-आधारित नोड-एवरो-आईओ पैकेज से Buffer प्राप्त करने के लिए यह उदाहरण स्ट्रीम-टू-सर पैकेज को शॉर्टकट के रूप में उपयोग करता है। Buffer आपके कफका निर्माता में संदेश के रूप में आपकी कतार में भेजा जा सकता है।

कुछ अन्य node.js पैकेज, जैसे avronode और Collective's node-avro, सी ++ लाइब्रेरी के लिए रैपर हैं। मुझे इन पैकेजों के साथ ज्यादा सफलता नहीं मिली। यहां एक टीएल है: नोड-एवरो के एवरो सी ++ लाइब्रेरी इंस्टॉलेशन निर्देशों के लिए डॉ (इसके लिए एक .deb पैकेज बनाना)। यह किसी भी सी ++ रैपर पैकेज के साथ मदद कर सकता है।

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 

कलेक्टिव के नोड एवरो के लिए, मैं Ubuntu 14.04 पर bin/install-and-run-tests स्क्रिप्ट से export CXXFLAGS="-fcxx-exceptions" लाइन को हटाने के लिए किया था।

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

आप उपलब्ध here विभिन्न एन्कोडिंग तरीकों के बारे में अधिक जानकारी पा सकते हैं।

+1

शानदार। मुझे जिस चीज की जरूरत थी। धन्यवाद! – N3da