Spark花费了太多时间,为某些任务创造了数千个工作岗位

时间:2016-02-12 06:42:47

标签: apache-spark cassandra apache-spark-sql

机器配置:

  • RAM:16 gb
  • 处理器:4核(Xeon E3 3.3 GHz)

问题:

  • 耗时:超过18分钟

案例场景:

  •   

    Spark模式:本地

  • 数据库:使用Cassandra 2.1.12

我正在将3个表提取到数据帧中,这些数据帧少于10行。是的,不到10(十)。 将其提取到数据帧后,我多次执行连接,计数,显示和收集操作。当我执行我的程序时,Spark正在创建40404个作业4次。它表示计数需要执行这些工作。我在节目中使用4-5次计数。等待超过18分钟(约18.5至20)后,它给出了预期的输出。

  • 为什么Spark创造了大量工作?
  • 很明显(' ok')花费这么多时间(18分钟)执行这么多工作(约40404 * 4)?

提前致谢。

示例代码1:

holder.scrollContainer.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                int scroll1st = 0;
                int scroll2nd = 0;

                if(event.getAction() == MotionEvent.ACTION_DOWN){
                    scroll1st = holder.scrollContainer.getScrollX();
                    Log.d("SCROLL", "Scroll down callded: amt is: " + holder.scrollContainer.getScrollX() );
                    mDataSet.get(position).isFirstSwipe = false;
                } else if (event.getAction() == MotionEvent.ACTION_UP){
                    scroll2nd = holder.scrollContainer.getScrollX();
                    Log.d("SCROLL", "Scroll up callded: amt is: " + holder.scrollContainer.getScrollX() );
                }

                Log.d("SCROLL", "max scroll amount: " + holder.scrollContainer.getMaxScrollAmount());

                if(event.getAction() == MotionEvent.ACTION_UP){

                    if(scroll2nd > scroll1st && (scroll2nd - scroll1st ) > 50 ){
                        holder.scrollContainer.postDelayed(new Runnable() {
                            public void run() {
                                holder.scrollContainer.fullScroll(HorizontalScrollView.FOCUS_RIGHT);
                            }
                        }, 100L);
                        mDataSet.get(position).isFirstSwipe = true;
                    } else if (scroll1st > scroll2nd && (scroll1st - scroll2nd ) > 50){
                        holder.scrollContainer.postDelayed(new Runnable() {
                            public void run() {
                                holder.scrollContainer.fullScroll(HorizontalScrollView.FOCUS_LEFT);
                            }
                        }, 100L);
                        mDataSet.get(position).isFirstSwipe = true;
                    }
    }
                v.onTouchEvent(event);
                return true;
            }
        });

示例代码2:

def getGroups(id: Array[String], level: Int): DataFrame = {
    var lvl = level
    if (level >= 0) {
      for (iterated_id <- id) {
        val single_level_group = supportive_df.filter("id = '" + iterated_id + "' and level = " + level).select("family_id")
        //single_level_group.show()
        intermediate_df = intermediate_df.unionAll(single_level_group)
        //println("for loop portion...")
      }
      final_df = final_df.unionAll(intermediate_df)
      lvl -= 1
      val user_id_param = intermediate_df.collect().map { row => row.getString(0) }
      intermediate_df = empty_df
      //println("new method...if portion...")
      getGroups(user_id_param, lvl)
    } else {
      //println("new method...")
      final_df.distinct()
    }
  }

这两个是我的编程中的主要代码块,执行时间过长。它通常需要很长时间才能显示或计数操作。

2 个答案:

答案 0 :(得分:1)

好的,让我们记住一些基础知识!

Spark lazy showcount是操作。

一个动作会触发你需要加载的转换。如果你正在汇集来自Cassandra(或任何其他来源)的数据,这会花费很多,因为你似乎没有缓解你的转变!

因此,在DataFrame或RDD上进行密集计算时需要考虑缓存,这将使您的操作更快地执行!

关于你有多少任务(作业)的原因当然是通过spark并行机制来解释你执行动作的次数是你正在执行的转换/动作的次数,而不是提到循环!

尽管如此,仍然根据所提供的信息和问题中的代码片段的质量,这就是我的回答。

我希望这有帮助!

答案 1 :(得分:1)

  • 首先,您可以在GUI中检查程序的哪个阶段需要很长时间。
  • 其次是您多次使用distinct(),因此在使用distinct()时,您必须查看有多少分区在不同之后。我认为这就是为什么火花创造了数千个工作岗位的原因。
  • 如果这是您可以在coalesce()之后使用distinct()的原因。