apache spark如何运作?

时间:2016-11-09 11:58:36

标签: java apache-spark apache-spark-sql bigdata

我正在使用java API测试这个框架,特别是SQL模块。在java中作为独立运行它,我有更好的结果(甚至在同一台机器上运行),然后是纯sql(在pgadmin上运行)。

在同一个bd(postgres 9.4和9.5)中执行完全相同的查询,spark几乎快5倍,下面是我的代码:

private static final JavaSparkContext sc =
            new JavaSparkContext(new SparkConf()
                    .setAppName("SparkJdbc").setMaster("local[*]"));

    public static void main(String[] args) {

        StringBuilder sql = new StringBuilder();
        sql.append(" my query ");

        long time = System.currentTimeMillis();
        DbConnection dbConnection = new DbConnection("org.postgresql.Driver", "jdbc:postgresql://localhost:5432/mydb", "user", "pass");
        JdbcRDD<Object[]> jdbcRDD = new JdbcRDD<>(sc.sc(), dbConnection, sql.toString(),
                              1, 1000000000, 20, new MapResult(), ClassManifestFactory$.MODULE$.fromClass(Object[].class));

        JavaRDD<Object[]> javaRDD = JavaRDD.fromRDD(jdbcRDD, ClassManifestFactory$.MODULE$.fromClass(Object[].class));

//        javaRDD.map((final Object[] record) -> {
//            StringBuilder line = new StringBuilder();
//            for (Object o : record) {
//                line.append(o != null ? o.toString() : "").append(",");
//            }
//            return line.toString();
//        }).collect().forEach(rec -> System.out.println(rec));

        System.out.println("Total: " + javaRDD.count());
        System.out.println("Total time: " + (System.currentTimeMillis() - time));

    } 

即使我取消注释代码以将结果打印到控制台,它仍然运行得更快。

我想知道如何更快,如果源(bd)是相同的,任何人都可以解释它吗?也许使用并行查询?

编辑:有关于postgres进程的相关信息,在待机状态下,postgres使用12进程并通过pgadmin运行查询,数字不会改变,超过spark,最多20个,这意味着火花可能会使用一些并行机制来完成这项工作。

0 个答案:

没有答案