SPARK难道比ORACLE性能还差?百万级数据测试性能

vagrantisme 2016-11-29 10:14:45
本人对大数据方面也是刚刚研究,由于工作需要在实时查询与统计的性能方面要深入学习。现测试性能如下:

环境:VirtualBox host-only
ubuntu版本: Linux master 4.4.0-47-generic #68-Ubuntu SMP Wed Oct 26 19:39:52 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

XXX.XXX.XXX.101  master
XXX.XXX.XXX.102  Slave1
XXX.XXX.XXX.103  Slave2
XXX.XXX.XXX.104  Client1
XXX.XXX.XXX.1    HOST   数据库安装于宿主机器内

在master中start-all 成功启动后。slave1与Slave2 Work启动成功。
在Client机器中启动 spark-shell --master spark://master:7077 --jars ../lib/ojdbc6.jar 启动成功 执行下面的指令

val url = "jdbc:oracle:thin:@XXX.XXX.XXX.1:1521:orcl" val tableName = "mytables" val prop = new java.util.Properties prop.setProperty("user","test") prop.setProperty("password","test")
prop.setProperty("driver","oracle.jdbc.driver.OracleDriver")
val predicates = Array( "2013-01-01" -> "2014-01-01", "2014-01-01" -> "2015-01-01", "2015-01-01" -> "2016-01-01",
"2016-01-01" -> "2017-01-01" ).map { case (start, end) => s" indbtime>= to_date('$start','yyyy-mm-dd') " + s" AND indbtime<= to_date( '$end','yyyy-mm-dd')" }
val jdbcDF = sqlContext.read.jdbc(url,tableName,predicates,prop)


scala> jdbcDF.count()
16/11/29 17:19:49 INFO DAGScheduler: Job 0 finished: count at <console>:30, took 41.144126 s
res4: Long = 1441039


结论:
1441039的数据耗时要41秒,而在数据库里直接用select count(*) from tables ,不到一秒就返回结果。
我知道集群的spark应该会比单机的oracle功能更强大,请高手指点,哪儿出的问题?

对数据库表里上亿条的数据各种组合条件与统计字段交叉,要求10秒内返回结果,请问大牛们,如何实现??
大数据初学,问题有些低级,望专业人士不要见笑。
...全文
2257 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
a95473004 2016-12-28
  • 打赏
  • 举报
回复
楼上都TM扯淡 我来终结此贴 百万级别根本不是spark擅长的 不到千万的级别oracle足够了 虚拟机搭建spark集群毫无意义,反而比单机能慢 百万级别的数据如果oracle费力,还不如用greenplum. 5000w 数据 多维度聚合 最好的方式就是做cube. cube结果以grouping__id作为位图索引 存在oracle就好
LinkSe7en 2016-12-06
  • 打赏
  • 举报
回复
引用 7 楼 vagrantisme 的回复:
[quote=引用 6 楼 link0007 的回复:] [quote=引用 4 楼 vagrantisme 的回复:] [quote=引用 3 楼 link0007 的回复:] [quote=引用 2 楼 vagrantisme 的回复:] 能不能直接通过spark把oracle数据读出来,存成parquet文件,再用sparksql统计分析??
可以 df.write.parquet("hdfs://xxxxxx") 不过太蠢了,建议还是用sqoop,功能更强大[/quote] 你好,首先谢谢你的建议,但我又进行测试,代码如下。
		System.out.println("0>>>>>>>>>>>>>>>" + Util.toStr(null));
		Dataset<Row> jdbcDF = spark.read().format("jdbc")
				.option("url", "jdbc:oracle:thin:@192.168.56.1:1521:orcl")
				.option("dbtable", "testTable")
				.option("user", "test")
				.option("password", "test")
				.option("driver", "oracle.jdbc.driver.OracleDriver")
				.load();
		jdbcDF.select("testcol", "testcol1").orderBy("testcol").write().parquet("hdfs://master:9000/test.parquet");
		System.out.println("1>>>>>>>>>>>>>>>" + Util.toStr(null));
		Dataset<Row> parquetFileDF = spark.read().parquet("hdfs://master:9000/test.parquet");
		System.out.println("2>>>>>>>>>>>>>>>" + Util.toStr(null));
		parquetFileDF.createOrReplaceTempView("parquetFile");
		String sql = "SELECT testcol,count(*) c FROM parquetFile group by testcol order by c desc";
		System.out.println("sql:"+ sql);
		Dataset<Row> namesDF = spark.sql(sql);
		System.out.println("3>>>>>>>>>>>>>>>" + Util.toStr(null));
		System.out.println("4>>>>>>>>>>>>>>>" + Util.toStr(null));
		namesDF.show();
		System.out.println("5>>>>>>>>>>>>>>>" + Util.toStr(null));
结果发现,把parquet读出到运算得出结果大约7秒左右,比oracle运行速度稍慢一点点。 我的spark用的是三台linux虚拟机,一台master,两台worker。 请问有没有更好的方法,进一步提高效率?秒级的响应速度 。我用的测试数据是百万级别。[/quote] 首先group by count不要作为性能评估依据。。。其次你用SparkSQL就是要用UDF/UDAF以及要跑很久的复杂查询,否则你直接JDBC查Oracle算了。。。最后3台虚拟机。。。给个眼神你自己体会[/quote] 你好,还要继续请教。 现在客户数据库单张表内有5000万打的数据,每条数据大约100个字段,要求各种组合条件与分组统计的结果,要在10秒以内得出。请问,用大数据的什么方案可以完美解决此需求。现在我的问题主要是没有思路。[/quote] SparkSQL去做没有问题,但是影响性能的首先肯定是集群硬件,其次是SQL的性能优化。。。3台虚拟机10秒内完成5kw数据的聚合查询,可能有点吃紧。另外你可以看看其他的SQL on Hadoop。impala据称是可以做到毫秒级的响应,靠的是数据的预聚合
vagrantisme 2016-12-06
  • 打赏
  • 举报
回复
引用 6 楼 link0007 的回复:
[quote=引用 4 楼 vagrantisme 的回复:] [quote=引用 3 楼 link0007 的回复:] [quote=引用 2 楼 vagrantisme 的回复:] 能不能直接通过spark把oracle数据读出来,存成parquet文件,再用sparksql统计分析??
可以 df.write.parquet("hdfs://xxxxxx") 不过太蠢了,建议还是用sqoop,功能更强大[/quote] 你好,首先谢谢你的建议,但我又进行测试,代码如下。
		System.out.println("0>>>>>>>>>>>>>>>" + Util.toStr(null));
		Dataset<Row> jdbcDF = spark.read().format("jdbc")
				.option("url", "jdbc:oracle:thin:@192.168.56.1:1521:orcl")
				.option("dbtable", "testTable")
				.option("user", "test")
				.option("password", "test")
				.option("driver", "oracle.jdbc.driver.OracleDriver")
				.load();
		jdbcDF.select("testcol", "testcol1").orderBy("testcol").write().parquet("hdfs://master:9000/test.parquet");
		System.out.println("1>>>>>>>>>>>>>>>" + Util.toStr(null));
		Dataset<Row> parquetFileDF = spark.read().parquet("hdfs://master:9000/test.parquet");
		System.out.println("2>>>>>>>>>>>>>>>" + Util.toStr(null));
		parquetFileDF.createOrReplaceTempView("parquetFile");
		String sql = "SELECT testcol,count(*) c FROM parquetFile group by testcol order by c desc";
		System.out.println("sql:"+ sql);
		Dataset<Row> namesDF = spark.sql(sql);
		System.out.println("3>>>>>>>>>>>>>>>" + Util.toStr(null));
		System.out.println("4>>>>>>>>>>>>>>>" + Util.toStr(null));
		namesDF.show();
		System.out.println("5>>>>>>>>>>>>>>>" + Util.toStr(null));
结果发现,把parquet读出到运算得出结果大约7秒左右,比oracle运行速度稍慢一点点。 我的spark用的是三台linux虚拟机,一台master,两台worker。 请问有没有更好的方法,进一步提高效率?秒级的响应速度 。我用的测试数据是百万级别。[/quote] 首先group by count不要作为性能评估依据。。。其次你用SparkSQL就是要用UDF/UDAF以及要跑很久的复杂查询,否则你直接JDBC查Oracle算了。。。最后3台虚拟机。。。给个眼神你自己体会[/quote] 你好,还要继续请教。 现在客户数据库单张表内有5000万打的数据,每条数据大约100个字段,要求各种组合条件与分组统计的结果,要在10秒以内得出。请问,用大数据的什么方案可以完美解决此需求。现在我的问题主要是没有思路。
vagrantisme 2016-12-06
  • 打赏
  • 举报
回复
引用 8 楼 link0007 的回复:
[quote=引用 7 楼 vagrantisme 的回复:] [quote=引用 6 楼 link0007 的回复:] [quote=引用 4 楼 vagrantisme 的回复:] [quote=引用 3 楼 link0007 的回复:] [quote=引用 2 楼 vagrantisme 的回复:] 能不能直接通过spark把oracle数据读出来,存成parquet文件,再用sparksql统计分析??
可以 df.write.parquet("hdfs://xxxxxx") 不过太蠢了,建议还是用sqoop,功能更强大[/quote] 你好,首先谢谢你的建议,但我又进行测试,代码如下。
		System.out.println("0>>>>>>>>>>>>>>>" + Util.toStr(null));
		Dataset<Row> jdbcDF = spark.read().format("jdbc")
				.option("url", "jdbc:oracle:thin:@192.168.56.1:1521:orcl")
				.option("dbtable", "testTable")
				.option("user", "test")
				.option("password", "test")
				.option("driver", "oracle.jdbc.driver.OracleDriver")
				.load();
		jdbcDF.select("testcol", "testcol1").orderBy("testcol").write().parquet("hdfs://master:9000/test.parquet");
		System.out.println("1>>>>>>>>>>>>>>>" + Util.toStr(null));
		Dataset<Row> parquetFileDF = spark.read().parquet("hdfs://master:9000/test.parquet");
		System.out.println("2>>>>>>>>>>>>>>>" + Util.toStr(null));
		parquetFileDF.createOrReplaceTempView("parquetFile");
		String sql = "SELECT testcol,count(*) c FROM parquetFile group by testcol order by c desc";
		System.out.println("sql:"+ sql);
		Dataset<Row> namesDF = spark.sql(sql);
		System.out.println("3>>>>>>>>>>>>>>>" + Util.toStr(null));
		System.out.println("4>>>>>>>>>>>>>>>" + Util.toStr(null));
		namesDF.show();
		System.out.println("5>>>>>>>>>>>>>>>" + Util.toStr(null));
结果发现,把parquet读出到运算得出结果大约7秒左右,比oracle运行速度稍慢一点点。 我的spark用的是三台linux虚拟机,一台master,两台worker。 请问有没有更好的方法,进一步提高效率?秒级的响应速度 。我用的测试数据是百万级别。[/quote] 首先group by count不要作为性能评估依据。。。其次你用SparkSQL就是要用UDF/UDAF以及要跑很久的复杂查询,否则你直接JDBC查Oracle算了。。。最后3台虚拟机。。。给个眼神你自己体会[/quote] 你好,还要继续请教。 现在客户数据库单张表内有5000万打的数据,每条数据大约100个字段,要求各种组合条件与分组统计的结果,要在10秒以内得出。请问,用大数据的什么方案可以完美解决此需求。现在我的问题主要是没有思路。[/quote] SparkSQL去做没有问题,但是影响性能的首先肯定是集群硬件,其次是SQL的性能优化。。。3台虚拟机10秒内完成5kw数据的聚合查询,可能有点吃紧。另外你可以看看其他的SQL on Hadoop。impala据称是可以做到毫秒级的响应,靠的是数据的预聚合[/quote] 看样我需要研究impala了。
vagrantisme 2016-12-06
  • 打赏
  • 举报
回复
引用 9 楼 xx1710 的回复:
先放到hdfs里 再测试别的
已经放到HDFS系统里了。
  • 打赏
  • 举报
回复
先放到hdfs里 再测试别的
LinkSe7en 2016-12-05
  • 打赏
  • 举报
回复
引用 4 楼 vagrantisme 的回复:
[quote=引用 3 楼 link0007 的回复:] [quote=引用 2 楼 vagrantisme 的回复:] 能不能直接通过spark把oracle数据读出来,存成parquet文件,再用sparksql统计分析??
可以 df.write.parquet("hdfs://xxxxxx") 不过太蠢了,建议还是用sqoop,功能更强大[/quote] 你好,首先谢谢你的建议,但我又进行测试,代码如下。
		System.out.println("0>>>>>>>>>>>>>>>" + Util.toStr(null));
		Dataset<Row> jdbcDF = spark.read().format("jdbc")
				.option("url", "jdbc:oracle:thin:@192.168.56.1:1521:orcl")
				.option("dbtable", "testTable")
				.option("user", "test")
				.option("password", "test")
				.option("driver", "oracle.jdbc.driver.OracleDriver")
				.load();
		jdbcDF.select("testcol", "testcol1").orderBy("testcol").write().parquet("hdfs://master:9000/test.parquet");
		System.out.println("1>>>>>>>>>>>>>>>" + Util.toStr(null));
		Dataset<Row> parquetFileDF = spark.read().parquet("hdfs://master:9000/test.parquet");
		System.out.println("2>>>>>>>>>>>>>>>" + Util.toStr(null));
		parquetFileDF.createOrReplaceTempView("parquetFile");
		String sql = "SELECT testcol,count(*) c FROM parquetFile group by testcol order by c desc";
		System.out.println("sql:"+ sql);
		Dataset<Row> namesDF = spark.sql(sql);
		System.out.println("3>>>>>>>>>>>>>>>" + Util.toStr(null));
		System.out.println("4>>>>>>>>>>>>>>>" + Util.toStr(null));
		namesDF.show();
		System.out.println("5>>>>>>>>>>>>>>>" + Util.toStr(null));
结果发现,把parquet读出到运算得出结果大约7秒左右,比oracle运行速度稍慢一点点。 我的spark用的是三台linux虚拟机,一台master,两台worker。 请问有没有更好的方法,进一步提高效率?秒级的响应速度 。我用的测试数据是百万级别。[/quote] 首先group by count不要作为性能评估依据。。。其次你用SparkSQL就是要用UDF/UDAF以及要跑很久的复杂查询,否则你直接JDBC查Oracle算了。。。最后3台虚拟机。。。给个眼神你自己体会
vagrantisme 2016-12-05
  • 打赏
  • 举报
回复
引用 2 楼 vagrantisme 的回复:
能不能直接通过spark把oracle数据读出来,存成parquet文件,再用sparksql统计分析??
dd
vagrantisme 2016-12-05
  • 打赏
  • 举报
回复
引用 3 楼 link0007 的回复:
[quote=引用 2 楼 vagrantisme 的回复:] 能不能直接通过spark把oracle数据读出来,存成parquet文件,再用sparksql统计分析??
可以 df.write.parquet("hdfs://xxxxxx") 不过太蠢了,建议还是用sqoop,功能更强大[/quote] 你好,首先谢谢你的建议,但我又进行测试,代码如下。
		System.out.println("0>>>>>>>>>>>>>>>" + Util.toStr(null));
		Dataset<Row> jdbcDF = spark.read().format("jdbc")
				.option("url", "jdbc:oracle:thin:@192.168.56.1:1521:orcl")
				.option("dbtable", "testTable")
				.option("user", "test")
				.option("password", "test")
				.option("driver", "oracle.jdbc.driver.OracleDriver")
				.load();
		jdbcDF.select("testcol", "testcol1").orderBy("testcol").write().parquet("hdfs://master:9000/test.parquet");
		System.out.println("1>>>>>>>>>>>>>>>" + Util.toStr(null));
		Dataset<Row> parquetFileDF = spark.read().parquet("hdfs://master:9000/test.parquet");
		System.out.println("2>>>>>>>>>>>>>>>" + Util.toStr(null));
		parquetFileDF.createOrReplaceTempView("parquetFile");
		String sql = "SELECT testcol,count(*) c FROM parquetFile group by testcol order by c desc";
		System.out.println("sql:"+ sql);
		Dataset<Row> namesDF = spark.sql(sql);
		System.out.println("3>>>>>>>>>>>>>>>" + Util.toStr(null));
		System.out.println("4>>>>>>>>>>>>>>>" + Util.toStr(null));
		namesDF.show();
		System.out.println("5>>>>>>>>>>>>>>>" + Util.toStr(null));
结果发现,把parquet读出到运算得出结果大约7秒左右,比oracle运行速度稍慢一点点。 我的spark用的是三台linux虚拟机,一台master,两台worker。 请问有没有更好的方法,进一步提高效率?秒级的响应速度 。我用的测试数据是百万级别。
LinkSe7en 2016-12-01
  • 打赏
  • 举报
回复
引用 2 楼 vagrantisme 的回复:
能不能直接通过spark把oracle数据读出来,存成parquet文件,再用sparksql统计分析??
可以 df.write.parquet("hdfs://xxxxxx") 不过太蠢了,建议还是用sqoop,功能更强大
vagrantisme 2016-11-30
  • 打赏
  • 举报
回复
能不能直接通过spark把oracle数据读出来,存成parquet文件,再用sparksql统计分析??
LinkSe7en 2016-11-30
  • 打赏
  • 举报
回复
你直接读取jdbc的数据当然慢,它首先把数据拉取到executor的内存里,然后再执行查询逻辑。你说慢不慢? 要提升效率当然是把JDBC的数据通过sqoop等工具导入到HDFS中,最常用的是OCR或者PARQUET文件格式。然后Spark读取,再进行查询就很快了

1,258

社区成员

发帖
与我相关
我的任务
社区描述
Spark由Scala写成,是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于MapReduce算法实现的分布式计算。
社区管理员
  • Spark
  • shiter
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧