【问题标题】:Node.js to Flume-NGNode.js 到 Flume-NG
【发布时间】:2014-04-30 00:42:51
【问题描述】:

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

也许我遗漏了什么,我认为将数据从 Node.js 移动到 Flume 是一种更常见的需求,但似乎并非如此。

我发现许多项目似乎都在尝试这样做,但似乎都在大约 3 年前被放弃了,并且在当前版本中无法正常工作。似乎有一些可以与旧版本的flume一起使用,但是随着flume-ng的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();
});

【问题讨论】:

  • 在听从 JensG 的建议询问名单后,Randy Abernethy 回应并加紧实施 Thrift 中缺失的部分,即 Flume 所需的 TCompactProtocol。有了这个,现在可以使用与上面类似的代码,尽管 createConnection 是一个异步调用,因此客户端创建需要包装在回调中。非常感谢 Randy 让这一切成为可能。然而,此时它确实需要来自 repo 的最新 Thrift 代码。

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


【解决方案1】:

这是在FLUME-1894,文件ThriftSource.java中实现的Thrift Server的设置:

  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已经有客户端实现了,不用再造轮子了。

【讨论】:

  • 不确定 java 客户端如何帮助 Node.js,而不是作为参考实现。希望你上面的提示是我所需要的,我们将看到。当前在尝试使用为 javascript 生成的节俭存根进行连接时获得 ECONNRESET。
  • transport = thrift.TFastFramedTransport() ^ TypeError: Object # has no method 'TFastFramedTransport'
  • 看起来 Node.js 节俭代码可能只支持 TFramedTransport 和 TBinaryProtocol。
  • 不知何故我记得 Java 而不是 Node,不知道为什么。关于节点协议:没错。我自己从未使用过TFastFramedTransport,但它似乎与TFramedTransport 有线兼容。你试过那个吗?
  • 在这方面找到了 cmets,所以我会尝试一下,假设我可以找到 CompactProtocol 的解决方案。我可能必须在 CPP 中实施。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多