我有一个分散在多个节点上的Cassandra数据库。当使用Pig查询它时,Pig'创建的mapreduce作业在hadoop节点上崩溃',但有以下异常:
2013-03-18 00:57:19,374 WARN org.apache.hadoop.mapred.Child: Error running child java.lang.RuntimeException: org.apache.thrift.TException: Message length exceeded: 674 at org.apache.cassandra.hadoop.ColumnFamilyRecordReader$StaticRowIterator.maybeInit(ColumnFamilyRecordReader.java:384) at org.apache.cassandra.hadoop.ColumnFamilyRecordReader$StaticRowIterator.computeNext(ColumnFamilyRecordReader.java:390) at org.apache.cassandra.hadoop.ColumnFamilyRecordReader$StaticRowIterator.computeNext(ColumnFamilyRecordReader.java:313) at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143) at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138) at org.apache.cassandra.hadoop.ColumnFamilyRecordReader.getProgress(ColumnFamilyRecordReader.java:103) at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigRecordReader.getProgress(PigRecordReader.java:169) at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.getProgress(MapTask.java:514) at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.nextKeyValue(MapTask.java:539) at org.apache.hadoop.mapreduce.MapContext.nextKeyValue(MapContext.java:67) at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:143) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370) at org.apache.hadoop.mapred.Child$4.run(Child.java:255) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:396) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121) at org.apache.hadoop.mapred.Child.main(Child.java:249) Caused by: org.apache.thrift.TException: Message length exceeded: 674, readLength: 192 at org.apache.thrift.protocol.TBinaryProtocol.checkReadLength(TBinaryProtocol.java:393) at org.apache.thrift.protocol.TBinaryProtocol.readBinary(TBinaryProtocol.java:363) at org.apache.cassandra.thrift.Column.read(Column.java:535) at org.apache.cassandra.thrift.ColumnOrSuperColumn.read(ColumnOrSuperColumn.java:507) at org.apache.cassandra.thrift.KeySlice.read(KeySlice.java:408) at org.apache.cassandra.thrift.Cassandra$get_range_slices_result.read(Cassandra.java:12905) at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78) at org.apache.cassandra.thrift.Cassandra$Client.recv_get_range_slices(Cassandra.java:734) at org.apache.cassandra.thrift.Cassandra$Client.get_range_slices(Cassandra.java:718) at org.apache.cassandra.hadoop.ColumnFamilyRecordReader$StaticRowIterator.maybeInit(ColumnFamilyRecordReader.java:346) ... 17 more
突出的是org.apache.thrift.TException: Message length exceeded: 674
。每次启动Pig查询时,异常中吐出的消息长度都会有所不同。从在hadoop节点上初始化任务的那一刻起,触发异常需要不到一秒的时间。
Cassandra填充了大约1GB的数据。用于导致此异常的Pig查询如下:
rows = LOAD 'cassandra://[keyspace here]/[cf here]' USING org.apache.cassandra.hadoop.pig.CassandraStorage() AS([column definitions here]); testvals = foreach rows generate mycolumn.$1; names = limit testvals 57343; dump names;
为什么要问57343限制? 57343下的任何数字都可以让Pig作业成功完成,任何> = 57343的数字都会导致它崩溃。与Cassandra一起提供的Pig示例也出现在同一个异常中。 此外,在Cassandra中使用较小的数据集可以让Pig成功完成工作。
我在Thrift抱怨消息长度时发现了一些类似的错误,但通常是在超过cassandra.yaml中指定的最大消息长度时。在这种情况下,cassandra.yaml中的消息长度设置为64MB以测试它是否有帮助,但仍然发生相同的异常。此外,该异常指出消息的长度太长,即使在异常中声明消息本身在这种情况下仅为674字节!
我尝试了什么:
thrift_max_message_length_in_mb
和
cassandra.yaml thrift_framed_transport_size_in_mb
值
设定:
TL; DR
Pig + Cassandra在较大的数据集(org.apache.thrift.TException: Message length exceeded: 674
)上崩溃。较小的数据集或较大数据集的较小子集工作正常。
修改 Cassandra日志显示没有错误。它根据工作要求提供切片,当Cassandra这样做时,工作就会消失。
答案 0 :(得分:0)
如果此列系列使用的是宽行或有很多列,那么您可能想尝试传递widerows选项。
set cassandra.input.widerows true;
data = load 'cassandra://[keyspace here]/[cf here]/?widerows=true'
using org.apache.cassandra.hadoop.pig.CassandraStorage();