Pentaho 框架尺寸 (17727647) 大于最大长度 (16384000)!
Posted
技术标签:
【中文标题】Pentaho 框架尺寸 (17727647) 大于最大长度 (16384000)!【英文标题】:Pentaho Frame size (17727647) larger than max length (16384000)! 【发布时间】:2014-10-09 19:22:48 【问题描述】:在 pentaho 中,当我运行一个大约 50,000 行的 cassandra 输入步骤时,我得到了这个异常:
有没有办法在 pentaho 中控制查询结果的大小?还是有办法流式传输查询结果而不是批量获取?
2014/10/09 15:14:09 - Cassandra Input.0 - ERROR (version 5.1.0.0, build 1 from 2014-06-19_19-02-57 by buildguy) : Unexpected error
2014/10/09 15:14:09 - Cassandra Input.0 - ERROR (version 5.1.0.0, build 1 from 2014-06-19_19-02-57 by buildguy) : org.pentaho.di.core.exception.KettleException:
2014/10/09 15:14:09 - Cassandra Input.0 - Frame size (17727647) larger than max length (16384000)!
2014/10/09 15:14:09 - Cassandra Input.0 - Frame size (17727647) larger than max length (16384000)!
2014/10/09 15:14:09 - Cassandra Input.0 -
2014/10/09 15:14:09 - Cassandra Input.0 - at org.pentaho.di.trans.steps.cassandrainput.CassandraInput.initQuery(CassandraInput.java:355)
2014/10/09 15:14:09 - Cassandra Input.0 - at org.pentaho.di.trans.steps.cassandrainput.CassandraInput.processRow(CassandraInput.java:234)
2014/10/09 15:14:09 - Cassandra Input.0 - at org.pentaho.di.trans.step.RunThread.run(RunThread.java:62)
2014/10/09 15:14:09 - Cassandra Input.0 - at java.lang.Thread.run(Unknown Source)
2014/10/09 15:14:09 - Cassandra Input.0 - Caused by: org.apache.thrift.transport.TTransportException: Frame size (17727647) larger than max length (16384000)!
2014/10/09 15:14:09 - Cassandra Input.0 - at org.apache.thrift.transport.TFramedTransport.readFrame(TFramedTransport.java:137)
2014/10/09 15:14:09 - Cassandra Input.0 - at org.apache.thrift.transport.TFramedTransport.read(TFramedTransport.java:101)
2014/10/09 15:14:09 - Cassandra Input.0 - at org.apache.thrift.transport.TTransport.readAll(TTransport.java:84)
2014/10/09 15:14:09 - Cassandra Input.0 - at org.apache.thrift.protocol.TBinaryProtocol.readAll(TBinaryProtocol.java:362)
2014/10/09 15:14:09 - Cassandra Input.0 - at org.apache.thrift.protocol.TBinaryProtocol.readI32(TBinaryProtocol.java:284)
2014/10/09 15:14:09 - Cassandra Input.0 - at org.apache.thrift.protocol.TBinaryProtocol.readMessageBegin(TBinaryProtocol.java:191)
2014/10/09 15:14:09 - Cassandra Input.0 - at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:69)
2014/10/09 15:14:09 - Cassandra Input.0 - at org.apache.cassandra.thrift.Cassandra$Client.recv_execute_cql_query(Cassandra.java:1656)
2014/10/09 15:14:09 - Cassandra Input.0 - at org.apache.cassandra.thrift.Cassandra$Client.execute_cql_query(Cassandra.java:1642)
2014/10/09 15:14:09 - Cassandra Input.0 - at org.pentaho.cassandra.legacy.LegacyCQLRowHandler.newRowQuery(LegacyCQLRowHandler.java:289)
2014/10/09 15:14:09 - Cassandra Input.0 - at org.pentaho.di.trans.steps.cassandrainput.CassandraInput.initQuery(CassandraInput.java:333)
2014/10/09 15:14:09 - Cassandra Input.0 - ... 3 more
2014/10/09 15:14:09 - Cassandra Input.0 - Finished processing (I=0, O=0, R=0, W=0, U=0, E=1)
2014/10/09 15:14:09 - all customer data - Transformation detected one or more steps with errors.
2014/10/09 15:14:09 - all customer data - Transformation is killing the other steps!
【问题讨论】:
我也在使用 cassandra 但从未遇到过此类错误,请尝试根据您的操作系统增加 cassandra.yaml 中的 read_request_timeout_in_ms 和 pentaho.bat 或 .sh 中的 Xmx1024m 并检查您是否面临此类错误. 您的查询有多大?您发出的查询是否返回大约 60,000 行或更多行(包含 5 列)? 我返回超过 200000 行并且有 7 列。 您使用的是哪个版本的 pentaho? 您使用的是免费版还是需要付费的完整版? 【参考方案1】:org.apache.thrift.transport.TTransportException:
Frame size (17727647) larger than max length (16384000)!
对帧(thrift 消息)的大小进行了限制,以避免性能下降。您可以通过修改一些设置来调整它。这里需要注意的重要一点是您需要设置设置机器人客户端大小和服务器端。
服务器端在cassandra.yaml
# Frame size for thrift (maximum field length).
# default is 15mb, you'll have to increase this to at-least 18.
thrift_framed_transport_size_in_mb: 18
# The max length of a thrift message, including all fields and
# internal thrift overhead.
# default is 16, try to keep it to thrift_framed_transport_size_in_mb + 1
thrift_max_message_length_in_mb: 19
设置客户端限制取决于您使用的驱动程序。
【讨论】:
我已经在 cassandra 服务器上这样做了。我正在使用 pentaho BI,我似乎找不到改变 pentaho 大小的方法。 我也面临同样的问题@user3712422你解决了这个问题吗【参考方案2】:我通过使用 PDI 5.2 解决了这些问题,它在 Cassandra 输入步骤中具有称为 max_length 的属性,将此属性设置为更高的值(如 1GB)可以解决这些问题。
【讨论】:
【参考方案3】:可以在服务器端尝试以下方法:
TNonblockingServerSocket tnbSocketTransport = new TNonblockingServerSocket(listenPort);
TNonblockingServer.Args tnbArgs = new TNonblockingServer.Args(tnbSocketTransport);
// maxLength 配置为 1GB,而默认大小为 16MB
tnbArgs.transportFactory(new TFramedTransport.Factory(1024 * 1024 * 1024));
tnbArgs.protocolFactory(new TCompactProtocol.Factory());
TProcessor processor = new UcsInterfaceThrift.Processor<UcsInterfaceHandler>(ucsInterfaceHandler);
tnbArgs.processor(processor);
TServer server = new TNonblockingServer(tnbArgs);
server.serve();
【讨论】:
【参考方案4】:它确实对我有用..
Cassandra 版本:[cqlsh 5.0.1 |卡桑德拉 2.2.1 | CQL 规范 3.3.0 | 原生协议 v4]
Pentaho PDI 版本:pdi-ce-5.4.0.1-130
更改了 cassandra.yaml 中的设置:
# Whether to start the thrift rpc server.
start_rpc: true
# Frame size for thrift (maximum message length).
thrift_framed_transport_size_in_mb: 35
Cassandra 输出步骤设置更改为:
Port: 9160
"Use CQL Version 3": checked
【讨论】:
以上是关于Pentaho 框架尺寸 (17727647) 大于最大长度 (16384000)!的主要内容,如果未能解决你的问题,请参考以下文章