Spark - 简单的GraphX程序需要很长时间才能完成

时间:2017-08-24 16:09:09

标签: apache-spark emr spark-graphx

我有一个9节点m3.xlarge(8 cpu / 15 gig)EMR集群,其中1个节点是主节点,其他8个节点是从节点。我正在尝试运行一个简单的程序来检查GraphX连接的组件。这是我的代码:

def main(args : Array[String]): Unit = {

    val sparkConfig = new SparkConf()
      .set("hive.exec.dynamic.partition", "true")
      .set("hive.exec.dynamic.partition.mode", "nonstrict")
      .set("hive.s3.max-client-retries", "50")
      .set("hive.s3.max-error-retries", "50")
      .set("hive.s3.max-connections", "100")
      .set("hive.s3.connect-timeout", "5m")
      .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
      .set("spark.kryo.registrationRequired", "true")
      .set("spark.kryo.classesToRegister", "org.apache.spark.graphx.impl.VertexAttributeBlock")
      .set("spark.broadcast.compress", "true")
      .set("spark.default.parallelism", "24")

     val spark = SparkSession.builder()
        .appName("Spark Hive Example")
        .enableHiveSupport()
        .config(sparkConfig)
        .getOrCreate()

    // Set Kryo for serializing
    GraphXUtils.registerKryoClasses(sparkConfig)
    val res = spark.sql("SELECT col1, col2, col3 FROM table1 limit 10000")
    val edgesRDD = res.rdd.map(row => Edge(row.getString(0).hashCode, row.getString(1).hashCode, row(2).asInstanceOf[String]))

    val res_two = spark.sql("SELECT col1 FROM table2 where col1 is not NULL and col1 != '' limit 100000")
    val vertexRDD: RDD[(VertexId, String)] = res_two.rdd.map(row => (row.getString(0).hashCode, row(0).asInstanceOf[String]))

    val graph = Graph(vertexRDD, edgesRDD)
    graph.cache()

    val connectedComponents = graph.connectedComponents().vertices

我使用以下方式在EMR集群上提交jar:

spark-submit --conf spark.hadoop.fs.s3a.access.key=xxx --conf spark.hadoop.fs.s3a.secret.key=xxx --conf spark.yarn.submit.waitAppCompletion=false --class com.mypkg.SampleGraphX --master yarn --deploy-mode cluster --num-executors 12 --executor-cores 6 --executor-memory 10g --conf "spark.driver.extraJavaOptions=-Djavax.net.ssl.sessionCacheSize=1000 -Djavax.net.ssl.sessionCacheTimeout=60" --conf "spark.executor.extraJavaOptions=Djavax.net.ssl.sessionCacheSize=1000 -Djavax.net.ssl.sessionCacheTimeout=60" GraphxTest1.jar

table1和table2都有数百万个条目,但我限制了我的代码,只能从中读取10000和100000个条目。两者都是位于S3的外部表。这项工作已经运行了近2天。为什么需要这么长时间?我的代码有问题吗?或者我需要更改一些配置吗?

另外,当我查看UI时,我看到即使我的群集有64个vCore(每个节点8个核心),每个节点只使用1个核心。 在下图中,仅使用了总共​​64个核中的3个核。我已经看到这个最多有6个核心(当6个节点处于活动状态时)。为什么不使用所有内核?

我是Spark和GraphX的新手,所以我不确定我做错了什么。 enter image description here

1 个答案:

答案 0 :(得分:0)

您不是在查看Spark UI,这是调度程序UI。您应该在列表中找到您的应用程序,并访问链接到您的应用程序的URL。 当您访问Spark UI时,可以更容易地判断发生了什么(存储中的内存不足,没有足够的分区,陷入读取数据,陷入迭代......)