我的代码算法如下
Step1.获取一个hbase实体数据到hBaseRDD
JavaPairRDDhBaseRDD = jsc.newAPIHadoopRDD(hbase_conf, TableInputFormat.class, ImmutableBytesWritable.class, Result.class);
第2步.将hBaseRDD转换为rowPairRDD
// in the rowPairRDD the key is hbase's row key, The Row is the hbase's Row data JavaPairRDDrowPairRDD = hBaseRDD .mapToPair(***); dataRDD.repartition(500); dataRDD.cache();
Step3.将rowPairRDD转换为schemaRDD
JavaSchemaRDD schemaRDD = sqlContext.applySchema(rowPairRDD.values(), schema); schemaRDD.registerTempTable("testentity"); sqlContext.sqlContext().cacheTable("testentity");
Step4.使用spark sql做第一个简单的sql查询.
JavaSQLContext sqlContext = new org.apache.spark.sql.api.java.JavaSQLContext(jsc); JavaSchemaRDD retRDD=sqlContext.sql("SELECT column1, column2 FROM testentity WHERE column3 = 'value1' ") Listrows = retRDD.collect();
Step5.使用spark sql做第二个简单的sql查询.
JavaSchemaRDD retRDD=sqlContext.sql("SELECT column1, column2 FROM testentity WHERE column3 = 'value2' ") Listrows = retRDD.collect();
第六步.用spark sql做第三个简单的sql查询.
JavaSchemaRDD retRDD=sqlContext.sql("SELECT column1, column2 FROM testentity WHERE column3 = 'value3' "); Listrows = retRDD.collect();
测试结果如下:
测试案例1:
当我插入300,000条记录时,hbase实体,然后运行代码.
第一个查询需要60407毫秒
第二个查询需要838毫秒
3td查询需要792毫秒
如果我使用hbase Api进行类似的查询,它只需要2000毫秒.显然,最后2个spark sql查询比hbase api查询快得多.
我相信第一个spark sql查询花了很多时间从hbase加载数据.
因此,第一个查询比最后两个查询慢得多.我认为结果是预期的
测试案例2:
当我插入400,000条记录时.hbase实体,然后运行代码.
第一个查询需要87213毫秒
第二个查询需要83238毫秒
3td查询需要82092毫秒
如果我使用hbase Api进行类似的查询,它只需要3500毫秒.显然,3个spark sql查询比hbase api查询要慢得多.
而最后2个spark sql querys也很慢而且性能类似于第一个查询,为什么呢?我该如何调整性能?