我正在评估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要求来实现这一目标 .

关于我接下来可以尝试的任何指示都将非常感激!