web-dev-qa-db-ja.com

Spark Javaエラー:サイズがInteger.MAX_VALUEを超えています

いくつかの単純な機械学習タスクにsparkを使用しようとしています。pysparkとspark 1.2.0を使用して単純なロジスティック回帰問題を実行しました。1.2を使用しています。トレーニングのために100万件のレコードを取得し、レコードの機能をハッシュしました。ハッシュ機能の数を1024に設定するとプログラムは正常に動作しますが、ハッシュ機能の数を16384に設定すると、プログラムは次のように数回失敗しますエラー:

Py4JJavaError: An error occurred while calling o84.trainLogisticRegressionModelWithSGD.
: org.Apache.spark.SparkException: Job aborted due to stage failure: Task 1 in stage 4.0 failed 4 times, most recent failure: Lost task 1.3 in stage 4.0 (TID 9, workernode0.sparkexperience4a7.d5.internal.cloudapp.net): Java.lang.RuntimeException: Java.lang.IllegalArgumentException: Size exceeds Integer.MAX_VALUE
    at Sun.nio.ch.FileChannelImpl.map(FileChannelImpl.Java:828)
    at org.Apache.spark.storage.DiskStore.getBytes(DiskStore.scala:123)
    at org.Apache.spark.storage.DiskStore.getBytes(DiskStore.scala:132)
    at org.Apache.spark.storage.BlockManager.doGetLocal(BlockManager.scala:517)
    at org.Apache.spark.storage.BlockManager.getBlockData(BlockManager.scala:307)
    at org.Apache.spark.network.netty.NettyBlockRpcServer$$anonfun$2.apply(NettyBlockRpcServer.scala:57)
    at org.Apache.spark.network.netty.NettyBlockRpcServer$$anonfun$2.apply(NettyBlockRpcServer.scala:57)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
    at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
    at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
    at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:108)
    at org.Apache.spark.network.netty.NettyBlockRpcServer.receive(NettyBlockRpcServer.scala:57)
    at org.Apache.spark.network.server.TransportRequestHandler.processRpcRequest(TransportRequestHandler.Java:124)
    at org.Apache.spark.network.server.TransportRequestHandler.handle(TransportRequestHandler.Java:97)
    at org.Apache.spark.network.server.TransportChannelHandler.channelRead0(TransportChannelHandler.Java:91)
    at org.Apache.spark.network.server.TransportChannelHandler.channelRead0(TransportChannelHandler.Java:44)
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.Java:105)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.Java:333)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.Java:319)
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.Java:103)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.Java:333)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.Java:319)
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.Java:163)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.Java:333)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.Java:319)
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.Java:787)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.Java:130)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.Java:511)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.Java:468)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.Java:382)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.Java:354)
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.Java:116)
    at Java.lang.Thread.run(Thread.Java:745)

    at org.Apache.spark.network.client.TransportResponseHandler.handle(TransportResponseHandler.Java:156)
    at org.Apache.spark.network.server.TransportChannelHandler.channelRead0(TransportChannelHandler.Java:93)
    at org.Apache.spark.network.server.TransportChannelHandler.channelRead0(TransportChannelHandler.Java:44)
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.Java:105)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.Java:333)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.Java:319)
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.Java:103)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.Java:333)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.Java:319)
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.Java:163)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.Java:333)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.Java:319)
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.Java:787)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.Java:130)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.Java:511)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.Java:468)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.Java:382)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.Java:354)
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.Java:116)
    at Java.lang.Thread.run(Thread.Java:745)

Driver stacktrace:
    at org.Apache.spark.scheduler.DAGScheduler.org$Apache$spark$scheduler$DAGScheduler$$failJobAndIndependentStages(DAGScheduler.scala:1214)
    at org.Apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1203)
    at org.Apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1202)
    at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
    at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:47)
    at org.Apache.spark.scheduler.DAGScheduler.abortStage(DAGScheduler.scala:1202)
    at org.Apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:696)
    at org.Apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:696)
    at scala.Option.foreach(Option.scala:236)
    at org.Apache.spark.scheduler.DAGScheduler.handleTaskSetFailed(DAGScheduler.scala:696)
    at org.Apache.spark.scheduler.DAGSchedulerEventProcessActor$$anonfun$receive$2.applyOrElse(DAGScheduler.scala:1420)
    at akka.actor.Actor$class.aroundReceive(Actor.scala:465)
    at org.Apache.spark.scheduler.DAGSchedulerEventProcessActor.aroundReceive(DAGScheduler.scala:1375)
    at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516)
    at akka.actor.ActorCell.invoke(ActorCell.scala:487)
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:238)
    at akka.dispatch.Mailbox.run(Mailbox.scala:220)
    at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:393)
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.Java:260)
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.Java:1339)
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.Java:1979)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.Java:107)

このエラーは、LabeledPointにデータを転送した後でLogisticRegressionWithSGDをトレーニングすると発生します。

誰かこれについて考えがありますか?

私のコードは次のとおりです(このためにIPython Notebookを使用しています)。

from pyspark.mllib.regression import LabeledPoint
from pyspark.mllib.classification import LogisticRegressionWithSGD
from numpy import array
from sklearn.feature_extraction import FeatureHasher
from pyspark import SparkContext
sf = SparkConf().setAppName("test").set("spark.executor.memory", "50g").set("spark.cores.max", 30)
sc = SparkContext(conf=sf)
training_file = sc.textFile("train_small.txt")
def hash_feature(line):
    values = [0, dict()]
    for index, x in enumerate(line.strip("\n").split('\t')):
        if index == 0:
            values[0] = float(x)
        else:
            values[1][str(index)+"_"+x] = 1
    return values
n_feature = 2**14
hasher = FeatureHasher(n_features=n_feature)
training_file_hashed = training_file.map(lambda line: [hash_feature(line)[0], hasher.transform([hash_feature(line)[1]])])
def build_lable_points(line):
    values = [0.0] * n_feature
    for index, value in Zip(line[1].indices, line[1].data):
        values[index] = value
    return LabeledPoint(line[0], values)
parsed_training_data = training_file_hashed.map(lambda line: build_lable_points(line))
model = LogisticRegressionWithSGD.train(parsed_training_data)

最後の行を実行するとエラーが発生します。

16
peng

_Integer.MAX_INT_の制限は、格納されるファイルのサイズです。 120万行は大したことではありません。あなたの問題が「火花の限界」であるかどうかはわかりません。より可能性が高いのは、あなたの作業の一部が、特定のエグゼキューターで処理するには大きすぎる何かを作成していることです。

私はありませんPythonコーダーですが、「レコードの機能をハッシュ化」すると、サンプルの非常にまばらなレコードのセットを取得し、非スパース配列を作成する可能性があります。これにより、 16384の機能で大量のメモリを意味します。特にZip(line[1].indices, line[1].data)を実行すると、メモリ不足が発生しない唯一の理由は、その構成負荷(50G)があるようです。

役立つかもしれないもう1つのことは、パーティションを増やすことです。したがって、行で使用するメモリを減らすことができない場合は、少なくとも、特定のタスクで行を少なくすることを試みることができます。作成される一時ファイルはこれに依存する可能性が高いため、ファイル制限に達する可能性は低くなります。


そして、完全にエラーとは無関係ですが、あなたがしようとしていることに関連しています:

16384は確かに多数の機能です。それぞれがブール機能である楽観的なケースでは、合計2 ^ 16384の順列があり、これは膨大な数です(ここで試してください。 https://defuse.ca/big-number-calculator.htm )。

アルゴリズムが120万個のサンプルだけで決定境界を学習できない可能性は非常に高く、そのような特徴空間にくぼみを作るには、少なくとも数兆兆の例が必要になるでしょう。機械学習には制限があるため、ランダムよりも優れた精度が得られなくても驚かないでください。

私は間違いなく最初にある種の次元削減を試すことをお勧めします!!

12
Daniel Langdon

ある時点で、機能を保存しようとし、1.2M * 16384がInteger.MAX_INTより大きいため、Sparkでサポートされている機能の最大サイズを超えて保存しようとしています。

あなたはおそらくApache Sparkの限界に直面しています。

1
Baptiste Wicht

パーティションの数を増やすと アクティブタスクはSpark UI で負の数になります)、これはおそらくパーティションの数が多すぎることを意味します。

0
gsamaras