Spark 处理大量数据 发生OOM

T天T 2017-04-14 04:08:42
原来试着用一下Spark处理文本数据,文本数据大概有十万个文件,大概20个G。代码如下,主要是简单的对每个文件进行处理,然后再保存到另外的文件中。
  val corpus: RDD[(String,String )] = sparkContext.wholeTextFiles(originalPath) //
val startTime = System.currentTimeMillis()
val userCorpus = corpus.map(
x => (
x._1.substring(x._1.lastIndexOf("/")+1),
x._2.split("\n"). //将整个文档分成行
map(_.split("\\s")).flatMap(_.filter(_.length > 2).filter( x => !x.contains("@") && !x.contains("http"))). //对分成的每一行进行分词,去除长度小于3的单词,去除含有'@'的词语,去除 http 的url 后,进行flatMap
map(_.split("\\s|\\^|#|\\.|\"|\\,|!|\\)|\\(|\\?|\\:|\\'|/")). //对之前的分词在进行过滤,去掉标点符号
flatMap(_.filter(_.length > 2).filter(_.forall(java.lang.Character.isLetter))).mkString(" ")
))
userCorpus.saveAsHadoopFile(goalPath,classOf[String],classOf[String],classOf[RDDMultipleTextOutputFormat])


然后打包运行,运行命令为:./spark-submit --master spark://192.168.1.107:7077 --executor-memory 20G --class scala.Main /home/spark_process_jar/tr_dataProcess.jar

spark集群配置如下 :


然后出现了异常:


按照有的说法说:
Caused by: java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:640)
上面这段错误提示的本质是Linux操作系统无法创建更多进程,导致出错,并不是系统的内存不足。因此要解决这个问题需要修改Linux允许创建更多的进程,就需要修改Linux最大进程数。


但是还是没有用。问题是不是在处理数据的时候连续map,产生很多新的对象,所以导致OOM,怎么解决呢?谢谢了。
...全文
1684 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
tchqiq 2017-04-25
  • 打赏
  • 举报
回复
引用 3 楼 u014357091 的回复:
针对于1楼的回答,不仅仅是系统设置方面有问题,代码优化才是主要问题吧。 对于2楼的回答,我试过了,拆分成很多个rdd,每个rdd都cache,还是一样的OOM。
好吧~找到了一个答案:http://blog.csdn.net/bluishglc/article/details/50705052 你先看看管不管用吧
T天T 2017-04-20
  • 打赏
  • 举报
回复
针对于1楼的回答,不仅仅是系统设置方面有问题,代码优化才是主要问题吧。 对于2楼的回答,我试过了,拆分成很多个rdd,每个rdd都cache,还是一样的OOM。
tchqiq 2017-04-17
  • 打赏
  • 举报
回复
这种写法没有充分利用分布式计算吧.你这一个map里把所有要处理的流程的处理了...等于单机程序. 要我就这么写:

val corpus: RDD[(String,String )] = sparkContext.wholeTextFiles(originalPath) //
    val startTime = System.currentTimeMillis()
     val userCorpus = corpus.map(
       x => (
         x._1.substring(x._1.lastIndexOf("/")+1),
         x._2.split("\n"). //将整个文档分成行
         ). flatMap(_.split("\\s")).filter().....
你多拆几个rdd出来写行不行?
LinkSe7en 2017-04-14
  • 打赏
  • 举报
回复
http://sesame.iteye.com/blog/622670

1,261

社区成员

发帖
与我相关
我的任务
社区描述
Spark由Scala写成,是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于MapReduce算法实现的分布式计算。
社区管理员
  • Spark
  • shiter
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧