我有一个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以下的任何数字表示清管器作业成功完成,大于等于57343的任何数字表示清管器作业崩溃。cassandra附带的pig示例也存在相同的异常。另外,在cassandra中使用较小的数据集可以让pig成功地完成任务。
我在thrift抱怨消息长度时发现了一些类似的错误,但通常情况下,这是超过cassandra.yaml中指定的最大消息长度时的错误。在本例中,cassandra.yaml中的消息长度设置为64mb,以测试是否有帮助,但仍然发生了相同的异常。此外,异常声明消息的长度太长,即使在异常中声明消息本身在这种情况下只有674字节!
我尝试的是:
增加 thrift_max_message_length_in_mb
以及 thrift_framed_transport_size_in_mb
cassandra.yaml中的值
重建储蓄罐
删除cassandra键空间,然后重新填充它
设置:
hadoop 1.0.4版
Cassandra1.2.2
清管器0.11.0
热释光;pig博士和cassandra博士在更大的数据集上崩溃了( org.apache.thrift.TException: Message length exceeded: 674
). 较小的数据集或较大数据集的较小子集可以正常工作。
编辑Cassandra日志显示没有错误。它按照作业的要求提供切片,当cassandra执行此操作时,作业将终止。
1条答案
按热度按时间pengsaosao1#
如果此列族使用宽行或有许多列,则可能需要尝试传递widerows选项。