现在想实现这样一个逻辑:单机上,生成一个随机数,对mysql做查询,如果查询到了,则进一步到spark集群上查询更多信息。目前程序写出来了,可以提交到集群运行,但是想想好像不对:提交到集群后,岂不是各个节点会分布式地生成各自的随机数、然后各节点各自查询mysql?我想实现的逻辑该怎么做呢?

解决方案 »

  1.   

    你搞清楚什么代码在Driver上执行,什么在Executor上执行就明白了。
      

  2.   


    +1,目前似乎明白点了。但是如果整个过程做成循环的话,它也会在driver和集群上之间来回转换吧?
      

  3.   


    +1,目前似乎明白点了。但是如果整个过程做成循环的话,它也会在driver和集群上之间来回转换吧?
    你的Spark程序就是Driver,你各种rdd算子和spark sql就是executor执行的东西。
    例如:List<String> list = XXXDao.getXXX(); // driver执行
    JavaRDD<String> rdd = sparkContext.parallelize(list); // driver发送数据到executor,构建rdd
    rdd.map(str -> str.trim()); // executor执行又例如 :
    for(String sql : list) {   // 例如这个list里是若干个sql
        sqlContext.sql(sql); // 循环控制在driver执行,而sql的执行是在executor上;driver提交了这样的作业,会同步等待executor执行完毕并反馈。
    }
    多线程:
    for(final String sql : list) {
        new Thread() {
        public void run() {
           sqlContext.sql(sql); // 只要集群资源充裕,多个sql作业会并发执行
    }
    }.start(); // sqlContext是线程安全的。
    }