本人對大資料方面也是剛剛研究,由于作業需要在實時查詢與統計的性能方面要深入學習。現測驗性能如下:
環境: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秒內回傳結果,請問大牛們,如何實作??
大資料初學,問題有些低級,望專業人士不要見笑。
uj5u.com熱心網友回復:
你直接讀取jdbc的資料當然慢,它首先把資料拉取到executor的記憶體里,然后再執行查詢邏輯。你說慢不慢?要提升效率當然是把JDBC的資料通過sqoop等工具匯入到HDFS中,最常用的是OCR或者PARQUET檔案格式。然后Spark讀取,再進行查詢就很快了
uj5u.com熱心網友回復:
能不能直接通過spark把oracle資料讀出來,存成parquet檔案,再用sparksql統計分析??uj5u.com熱心網友回復:
可以
df.write.parquet("hdfs://xxxxxx")
不過太蠢了,建議還是用sqoop,功能更強大
uj5u.com熱心網友回復:
你好,首先謝謝你的建議,但我又進行測驗,代碼如下。
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。
請問有沒有更好的方法,進一步提高效率?秒級的回應速度 。我用的測驗資料是百萬級別。
uj5u.com熱心網友回復:
能不能直接通過spark把oracle資料讀出來,存成parquet檔案,再用sparksql統計分析??
dd
uj5u.com熱心網友回復:
能不能直接通過spark把oracle資料讀出來,存成parquet檔案,再用sparksql統計分析??
可以
df.write.parquet("hdfs://xxxxxx")
不過太蠢了,建議還是用sqoop,功能更強大
你好,首先謝謝你的建議,但我又進行測驗,代碼如下。
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。
請問有沒有更好的方法,進一步提高效率?秒級的回應速度 。我用的測驗資料是百萬級別。
首先group by count不要作為性能評估依據。。。其次你用SparkSQL就是要用UDF/UDAF以及要跑很久的復雜查詢,否則你直接JDBC查Oracle算了。。。最后3臺虛擬機。。。給個眼神你自己體會
uj5u.com熱心網友回復:
能不能直接通過spark把oracle資料讀出來,存成parquet檔案,再用sparksql統計分析??
可以
df.write.parquet("hdfs://xxxxxx")
不過太蠢了,建議還是用sqoop,功能更強大
你好,首先謝謝你的建議,但我又進行測驗,代碼如下。
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。
請問有沒有更好的方法,進一步提高效率?秒級的回應速度 。我用的測驗資料是百萬級別。
首先group by count不要作為性能評估依據。。。其次你用SparkSQL就是要用UDF/UDAF以及要跑很久的復雜查詢,否則你直接JDBC查Oracle算了。。。最后3臺虛擬機。。。給個眼神你自己體會
你好,還要繼續請教。
現在客戶資料庫單張表內有5000萬打的資料,每條資料大約100個欄位,要求各種組合條件與分組統計的結果,要在10秒以內得出。請問,用大資料的什么方案可以完美解決此需求。現在我的問題主要是沒有思路。
uj5u.com熱心網友回復:
能不能直接通過spark把oracle資料讀出來,存成parquet檔案,再用sparksql統計分析??
可以
df.write.parquet("hdfs://xxxxxx")
不過太蠢了,建議還是用sqoop,功能更強大
你好,首先謝謝你的建議,但我又進行測驗,代碼如下。
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。
請問有沒有更好的方法,進一步提高效率?秒級的回應速度 。我用的測驗資料是百萬級別。
首先group by count不要作為性能評估依據。。。其次你用SparkSQL就是要用UDF/UDAF以及要跑很久的復雜查詢,否則你直接JDBC查Oracle算了。。。最后3臺虛擬機。。。給個眼神你自己體會
你好,還要繼續請教。
現在客戶資料庫單張表內有5000萬打的資料,每條資料大約100個欄位,要求各種組合條件與分組統計的結果,要在10秒以內得出。請問,用大資料的什么方案可以完美解決此需求。現在我的問題主要是沒有思路。
SparkSQL去做沒有問題,但是影響性能的首先肯定是集群硬體,其次是SQL的性能優化。。。3臺虛擬機10秒內完成5kw資料的聚合查詢,可能有點吃緊。另外你可以看看其他的SQL on Hadoop。impala據稱是可以做到毫秒級的回應,靠的是資料的預聚合
uj5u.com熱心網友回復:
先放到hdfs里 再測驗別的uj5u.com熱心網友回復:
先放到hdfs里 再測驗別的
已經放到HDFS系統里了。
uj5u.com熱心網友回復:
能不能直接通過spark把oracle資料讀出來,存成parquet檔案,再用sparksql統計分析??
可以
df.write.parquet("hdfs://xxxxxx")
不過太蠢了,建議還是用sqoop,功能更強大
你好,首先謝謝你的建議,但我又進行測驗,代碼如下。
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。
請問有沒有更好的方法,進一步提高效率?秒級的回應速度 。我用的測驗資料是百萬級別。
首先group by count不要作為性能評估依據。。。其次你用SparkSQL就是要用UDF/UDAF以及要跑很久的復雜查詢,否則你直接JDBC查Oracle算了。。。最后3臺虛擬機。。。給個眼神你自己體會
你好,還要繼續請教。
現在客戶資料庫單張表內有5000萬打的資料,每條資料大約100個欄位,要求各種組合條件與分組統計的結果,要在10秒以內得出。請問,用大資料的什么方案可以完美解決此需求。現在我的問題主要是沒有思路。
SparkSQL去做沒有問題,但是影響性能的首先肯定是集群硬體,其次是SQL的性能優化。。。3臺虛擬機10秒內完成5kw資料的聚合查詢,可能有點吃緊。另外你可以看看其他的SQL on Hadoop。impala據稱是可以做到毫秒級的回應,靠的是資料的預聚合
看樣我需要研究impala了。
uj5u.com熱心網友回復:
樓上都TM扯淡我來終結此貼
百萬級別根本不是spark擅長的 不到千萬的級別oracle足夠了
虛擬機搭建spark集群毫無意義,反而比單機能慢
百萬級別的資料如果oracle費力,還不如用greenplum.
5000w 資料 多維度聚合 最好的方式就是做cube.
cube結果以grouping__id作為位圖索引 存在oracle就好
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/70421.html
標籤:Spark
上一篇:sqoop1 匯入資料 保存成parquet spark dataframe無法使用
下一篇:35歲就是技術人的天花板嗎?
