我的代码算法如下
Step1。获取一个 hbase 实体数据到 hBaseRDD
JavaPairRDD<ImmutableBytesWritable, Result> hBaseRDD =
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
JavaPairRDD<String, Row> rowPairRDD = hBaseRDD
.mapToPair(***);
dataRDD.repartition(500);
dataRDD.cache();
步骤 3。将 rowPairRDD 转换为 schemaRDD
JavaSchemaRDD schemaRDD = sqlContext.applySchema(rowPairRDD.values(), schema);
schemaRDD.registerTempTable("testentity");
sqlContext.sqlContext().cacheTable("testentity");
第四步。使用 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' ")
List<org.apache.spark.sql.api.java.Row> rows = retRDD.collect();
步骤 5。使用 spark sql 做第二个简单的 sql 查询。
JavaSchemaRDD retRDD=sqlContext.sql("SELECT column1, column2 FROM testentity
WHERE column3 = 'value2' ")
List<org.apache.spark.sql.api.java.Row> rows = retRDD.collect();
第六步。使用 spark sql 做第三个简单的 sql 查询。
JavaSchemaRDD retRDD=sqlContext.sql("SELECT column1, column2 FROM testentity WHERE column3 = 'value3' ");
List<org.apache.spark.sql.api.java.Row> rows = 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查询也很慢,性能和第一个查询差不多,为什么?如何调整性能?