Node.js到Flume-NG

时间:2014-04-30 00:42:51

标签: node.js thrift flume avro flume-ng

是否有一个功能项目可以将Node.js中的数据移动到Flume-NG中,而不需要中间文件。

也许我错过了一些东西,我会想到将Node.js中的数据移动到Flume中是一种更常见的需求,但似乎情况并非如此。

我发现了一些似乎已经尝试过的项目但是大约3年前似乎已经放弃了所有项目并且当前版本无法正常运行。似乎有一些适用于较旧版本的水槽,但API随着水槽而发生了很大变化,它们已不再适用。

我已经找到了Node.js的avro和thrift模块,而thrift现在支持node.js,似乎表明这应该是直接的,但是这不起作用,可能没有足够的信息关于哪个传输/协议到使用Flume-NG,或者我只是不太了解它。

在我重新发明轮子之前,有人能指出我正确的方向吗?

这是我当前的节点代码。它会生成一个ECONNREFUSED。

#!/usr/local/bin/node

var thrift = require('thrift');
//var ThriftTransports = require('thrift/transport');
//var ThriftProtocols = require('thrift/protocol');

var Flume = require('./gen-nodejs/ThriftSourceProtocol');
var ttypes = require('./gen-nodejs/flume_types');

transport = thrift.TBufferedTransport();
protocol = thrift.TBinaryProtocol();
//transport = ThriftTransports.TBufferedTransport();
//protocol = ThriftProtocols.TBinaryProtocol();
var connection = thrift.createConnection("127.0.0.1", 51515,{
        transport: transport,
        protocol: protocol
});

connection.on('error', function(err) {
  console.error(err);
});

var client = thrift.createClient(Flume, connection);


var myEvent = new ttypes.ThriftFlumeEvent();
myEvent.headers = {};
myEvent.body = "body";

client.append(myEvent, function(err,data) {
  if (err) {
    // handle err
  } else {
    // data == [ttypes.ColumnOrSuperColumn, ...]
  }
  connection.end();
});

1 个答案:

答案 0 :(得分:1)

这是在FLUME-1894ThriftSource.java文件中实施的Thrift服务器的设置:

  args.protocolFactory(new TCompactProtocol.Factory());
  args.inputTransportFactory(new TFastFramedTransport.Factory());
  args.outputTransportFactory(new TFastFramedTransport.Factory());
  args.processor(new ThriftSourceProtocol.Processor<ThriftSourceHandler>(new ThriftSourceHandler()));

要使其正常工作,您需要在客户端使用兼容堆栈:

  • 紧凑协议
  • 快框运输

ThriftRpcClient.java中已有客户端实施,因此您无需再次发明轮子。