我正在评估Spark 1.6.0以构建和预测大型(数百万个文档,数百万个功能,数千个主题)LDA模型,这是我可以通过Yahoo!轻松完成的事情 . LDA .
从Java示例开始,我使用Distributed model / EM optimizer构建了一个100K doc / 600K feature / 250 topic / 100迭代模型 . 模型很好,所得到的主题是连贯的 . 然后,我编写了一个新的单文档预测例程(SPARK-10809;我选择了基于Spark 1.6.0的自定义发行版)的包装器,以获取新的,看不见的文档(skeleton code)的主题 . 由此产生的预测生成缓慢(我在SPARK-10809中提供了修复),但更令人担忧,语无伦次(topics/predictions) . 如果文档's predominantly about football, I'期望"football"主题(主题18)位于前10名 .
由于我使用的是基于分布式/ EM的模型(正如jasonl here所暗示的那样),因此无法判断's wrong in my prediction code - or if it'是否有什么东西 - 我决定尝试更新的本地/在线模型 . 我花了几天时间调整我的240核/ 768GB RAM 3节点集群无济于事;似乎无论我尝试什么,我都会试图以这种方式构建模型 .
我尝试了各种设置:
-
驱动程序内存(8G)
-
执行者 - 记忆(1-225G)
-
spark.driver.maxResultSize(包括禁用它)
-
spark.memory.offheap.enabled(true / false)
-
spark.broadcast.blockSize(目前在8米)
-
spark.rdd.compress(当前为true)
-
更改序列化程序(当前为Kryo)及其最大缓冲区(512m)
-
增加各种超时以允许更长的计算(executor.heartbeatInterval,rpc.ask / lookupTimeout,spark.network.timeout)spark.akka.frameSize(1024)
在不同的设置下,由于堆外分配错误(本机内存分配(mmap)无法映射X字节以提交保留内存)和java.lang.OutOfMemoryError:Java堆空间,它似乎在JVM核心转储之间振荡 . 我看到模型的引用接近我的数量级(databricks.com/blog/2015/03/25/topic-modeling-with-lda-mllib-meets-graphx.html),所以我一定做错了 .
问题:
-
我的预测程序看起来不错吗?这是一个在一个无关紧要的预测主题的错误吗?
-
我是否有机会使用Spark构建一个上述数量级的模型?雅虎可以通过适度的RAM要求来实现这一目标 .
关于我接下来可以尝试的任何指示都将非常感激!