negativearraysizeexception

最近roaringbitmap存储在sequencefile中,由于bitmap对象过大,触发了hadoop-common中的一个bug。问题的原因和解决方法写在这里。

1.问题:

读取单个位图的sequenceFile文件(序列文件的值为Bitmap对象)时出错:Ja . lang . negative earraysizeexception。

$ HF-du-h/data/data center/bitmap/label/init/part-r-00000/data

688.5M 2.0G/数据/数据中心/位图/标签/init/part-r-00000/数据

读取大位图的序列文件时出错:

Ja . lang . negative earraysizeexception at org . Apache . Hadoop . io . bytes writable . set capacity(bytes writable . Ja:144)at org . Apache . Hadoop . io . bytes writable . set size(bytes writable . Ja:123)at org . Apache . Hadoop . io . bytes writable . read fields(bytes writable . Ja:179)at org . Apache . Hadoop . io . serializer . writable serialization$writable deserializer . deserialize(writable serialization .Scala . collection . mutable . array buffer处的$ plus $ plus $ eq(grow able . Scala:48)Scala . collection . mutable . array buffer处的$ plus $ eq(array buffer . Scala:103)Scala . collection . mutable . array buffer处的$ plus $ plus $ eq(array buffer . Scala:47)Scala . collection . trersableonce处的$ class . to(trersableonce . Scala:273)Scala . collection . abstract iterator . to(iterator . Scala:1

2.原因

在hadoop-common包的BytesWritable类中发现bug。

通过在此处设置新的字节可写容量,存在int溢出:

public void setSize(int size){ if(size & gt;get capacity()){ set capacity(size * 3/2);} this.size = size} 700 Mb * 3 & gt2Gb = int溢出!

因此,您不能将超过700 Mb的内容反序列化(但可以写入和序列化)为BytesWritable。

如果您想使用BytesWritable,可以先将容量设置得足够高,这样您就可以使用2GB,而不仅仅是700MB:

random value . set capacity(numbytestowre);random value . setsize(numbytestowre);//现在不会调整大小这个错误最近已经在Hadoop中修复,所以在新版本中,即使没有它也应该可以工作:

public void setSize(int size){ if(size & gt;getCapacity()) { //通过强制转换为long类型来避免过早溢出int。long newSize = Math.min(整数。MAX_VALUE,(3L *大小)/2L);set capacity((int)new size);} this.size = size解决方案:Hadoop-common直到2.8才修复这个问题,而spark1.6依赖于Hadoop-common 2.2版。

解决方法,修改代码,就是指定先加载用户的类路径,再加载spark中的类。官网写的很清楚,但是我没看官网。请再次查看官网的配置。顺着这个思路,我们可以看到spark是如何设置纱线的参数的。

spark . driver . userclasspahtfirst

错误的

(实验性的)在驱动程序中加载类时,是否给用户添加的jar优先于Spark自己的jar。这个特性可以用来缓解Spark的依赖性和用户依赖性之间的冲突。它目前是一个实验性的功能。这仅用于集群模式。

指定:

-conf spark . driver . userclasspathfirst = true \\

-conf spark . executor . userclasspathfirst = true \\

-jars/usr/local/Hadoop/share/Hadoop/common/Hadoop-common-2 . 6 . 0-CD H5 . 5 . 2 . jar、/home/mcloud/platform 3/data-API _ 2.10-1 . 0 . 8 . jar、/home/m cloud/platform 3/jae wah-1 . 0 . 2 . jar、/home/m cloud/platform 3/bitmap-ext _ 2.10-1 . 0 . 3 . jar、/home/m cloud

/home/xx/data center/job center-job _ 2.10-1.0 . jar \\

指定这三个参数可以解决这个问题。我们找了很多方法,还是没有先看spark的官方文档。这是一个简单的问题,却又如此复杂。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

发表回复

登录后才能评论