新聞中心
Introduction

成都創(chuàng)新互聯(lián)公司長(zhǎng)期為數(shù)千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為習(xí)水企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作,習(xí)水網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
隨著大數(shù)據(jù)和云計(jì)算的興起,分布式計(jì)算框架成為數(shù)據(jù)處理的主流。Apache Spark是一個(gè)用于大規(guī)模數(shù)據(jù)處理的強(qiáng)大分布式計(jì)算框架。它可以在分布式集群上快速地處理數(shù)據(jù),并提供操作Hadoop Distributed File System(HDFS)和其他數(shù)據(jù)源的功能。在這篇文章中,我們將討論在Spark中使用數(shù)據(jù)庫讀取技巧的指南。我們將深入了解Spark如何處理數(shù)據(jù)庫中的數(shù)據(jù),優(yōu)化代碼性能以及使用Spark SQL等工具來提高數(shù)據(jù)處理過程的效率。
Spark中的數(shù)據(jù)庫讀取技巧
Spark提供了各種方法來讀取和處理數(shù)據(jù)庫中的數(shù)據(jù)。下面是一些我們需要了解的技巧。
1. JDBC連接
Spark可以使用Java Database Connectivity(JDBC)來連接關(guān)系型數(shù)據(jù)庫。JDBC是一種Java API,用于與關(guān)系型數(shù)據(jù)庫建立連接。Spark可以通過JDBC讀取數(shù)據(jù)并進(jìn)行轉(zhuǎn)換。下面是一個(gè)基本的連接示例:
“`
val jdbcDF = spark.read
.format(“jdbc”)
.option(“url”, “jdbc:postgresql://localhost:5432/mydatabase”)
.option(“dbtable”, “mytable”)
.option(“user”, “myuser”)
.option(“password”, “mypassword”)
.load()
“`
在這種情況下,我們使用“postgres”數(shù)據(jù)庫的JDBC驅(qū)動(dòng)程序連接到本地端口5432上的“mydatabase”數(shù)據(jù)庫。然后,我們將“mytable”表加載到數(shù)據(jù)框架中。我們還需要提供用戶名和密碼來連接到數(shù)據(jù)庫。
2. 數(shù)據(jù)分區(qū)
為了獲得更好的性能,我們應(yīng)該將數(shù)據(jù)分割為多個(gè)分區(qū),然后在集群上并行處理。可通過以下代碼指定分區(qū)數(shù):
“`
val jdbcDF = spark.read
.format(“jdbc”)
.option(“url”, “jdbc:postgresql://localhost:5432/mydatabase”)
.option(“dbtable”, “mytable”)
.option(“user”, “myuser”)
.option(“password”, “mypassword”)
.option(“partitionColumn”, “id”)
.option(“l(fā)owerBound”, “1”)
.option(“upperBound”, “100000”)
.option(“numPartitions”, “16”)
.load()
“`
在這個(gè)例子中,我們?cè)凇癷d”列中使用分區(qū),它的最小值為1,更大值為100000,總共有16個(gè)分區(qū)。
3. 自定義查詢
從數(shù)據(jù)庫中選擇大量數(shù)據(jù)可能會(huì)導(dǎo)致Spark出現(xiàn)內(nèi)存問題。如果我們只需要部分列或部分行數(shù)據(jù),則可以使用自定義查詢。我們可以通過以下代碼將自定義查詢添加到我們的Spark應(yīng)用程序中:
“`
val query = “(SELECT name, age FROM mytable WHERE age > 20) as myquery”
val jdbcDF = spark.read
.format(“jdbc”)
.option(“url”, “jdbc:postgresql://localhost:5432/mydatabase”)
.option(“dbtable”, query)
.option(“user”, “myuser”)
.option(“password”, “mypassword”)
.load()
“`
請(qǐng)注意,我們現(xiàn)在查詢的不是完整的表,而是只查詢名字和年齡大于20歲的行。
4. 使用Spark SQL
Spark SQL提供了一個(gè)快速和方便的方式來處理和查詢數(shù)據(jù)庫數(shù)據(jù)。可以通過以下代碼使用Spark SQL讀取并查詢數(shù)據(jù)庫數(shù)據(jù):
“`
val jdbcDF = spark.read
.format(“jdbc”)
.option(“url”, “jdbc:postgresql://localhost:5432/mydatabase”)
.option(“dbtable”, “mytable”)
.option(“user”, “myuser”)
.option(“password”, “mypassword”)
.load()
jdbcDF.createOrReplaceTempView(“mytable”)
val result = spark.sql(“SELECT * FROM mytable WHERE age > 20”)
“`
在這個(gè)例子中,我們將數(shù)據(jù)庫數(shù)據(jù)加載到數(shù)據(jù)框架中,并使用createOrReplaceTempView()將它們轉(zhuǎn)換為Spark SQL表格。然后,我們可以使用SQL語句來查詢這些數(shù)據(jù)。
優(yōu)化技巧
在處理大量數(shù)據(jù)庫數(shù)據(jù)時(shí),性能是一個(gè)關(guān)鍵問題。以下是一些優(yōu)化技巧,以提高處理速度和效率。
1. 分區(qū)和緩存
Spark將我們的數(shù)據(jù)分成分區(qū),以便可以在集群上并行運(yùn)行操作。如果我們查詢的數(shù)據(jù)集很大,我們應(yīng)該將數(shù)據(jù)緩存到內(nèi)存中,以避免重復(fù)加載和處理??梢允褂靡韵麓a將DataFrame緩存到內(nèi)存中:
“`
jdbcDF.persist(StorageLevel.MEMORY_ON)
“`
2. 數(shù)據(jù)類型
Spark需要知道每個(gè)數(shù)據(jù)列的類型。如果Spark不知道一個(gè)列是什么類型,它將使用字符串類型,并且內(nèi)存使用率會(huì)增加。可以使用以下代碼來指定每個(gè)列的數(shù)據(jù)類型:
“`
val schema = StructType(Array(
StructField(“id”, IntegerType, true),
StructField(“name”, StringType, true),
StructField(“age”, IntegerType, true))
)
val jdbcDF = spark.read
.format(“jdbc”)
.option(“url”, “jdbc:postgresql://localhost:5432/mydatabase”)
.option(“dbtable”, “mytable”)
.option(“user”, “myuser”)
.option(“password”, “mypassword”)
.schema(schema)
.load()
“`
在這個(gè)例子中,我們使用schema()方法指定每個(gè)列的數(shù)據(jù)類型。
3. 緩存和Table
Spark SQL中的緩存和表也可以提高性能。類似于數(shù)據(jù)框架的緩存,我們可以使用以下代碼將結(jié)果緩存到內(nèi)存中:
“`
result.cache()
“`
我們還可以使用以下代碼將結(jié)果保存到Spark SQL表中:
“`
result.write.format(“parquet”).saveAsTable(“myresult”)
“`
這將使我們能夠在我們的應(yīng)用程序中隨時(shí)查詢數(shù)據(jù),并避免重復(fù)計(jì)算。
結(jié)論
Spark是一個(gè)強(qiáng)大的分布式計(jì)算框架,可以處理大量數(shù)據(jù)源。在本文中,我們已討論如何使用JDBC連接數(shù)據(jù)庫、數(shù)據(jù)分區(qū)、自定義查詢和Spark SQL等技術(shù),優(yōu)化性能以及使用Spark SQL進(jìn)行查詢。通過這些技術(shù)和優(yōu)化,我們可以更快地處理數(shù)據(jù)庫數(shù)據(jù),并在大規(guī)模使用中提高我們的性能和效率。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!
spark1.2.1實(shí)現(xiàn)讀取hbase的數(shù)據(jù)后怎么實(shí)現(xiàn)實(shí)時(shí)查詢
調(diào)用parallelize函數(shù)直接從中獲取數(shù)據(jù),并存入RDD中;Java版本如下:
JavaRDD myRDD = sc.parallelize(Arrays.asList(1,2,3));
Scala版本如下:
val myRDD= sc.parallelize(List(1,2,3))
Hadoop與分布式數(shù)據(jù)處理 Spark VS Hadoop有哪些異同點(diǎn)
Hadoop
分布式批處理計(jì)算,強(qiáng)調(diào)批處理,常用于數(shù)據(jù)挖掘、分析
Spark
是一個(gè)基于內(nèi)存計(jì)算的開源的集群計(jì)算系統(tǒng),目的是讓數(shù)據(jù)分析更加快速, Spark 是一種與 Hadoop 相似的開源集群計(jì)算環(huán)境,但是兩者之間還存在一些不同之處,這些有用的不同之處使 Spark 在某些工作負(fù)載方面表現(xiàn)得更加優(yōu)越,換句話說,Spark 啟用了內(nèi)存分布數(shù)據(jù)集,除了能夠提供交互式查詢外,它還可以優(yōu)化迭代工作負(fù)載。
Spark 是在 Scala 語言中實(shí)現(xiàn)的,它將 Scala 用作其應(yīng)用程序框架。與 Hadoop 不同,Spark 和 Scala 能夠緊密集成,其中的 Scala 可以像操作本地對(duì)象一樣輕松地操作分布式數(shù)據(jù)集。
盡管創(chuàng)建 Spark 是為了支持分布式數(shù)據(jù)集上的迭代作業(yè),但是實(shí)際上它是對(duì) Hadoop 的補(bǔ)充,可以在 Hadoop 文件系統(tǒng)中并行運(yùn)行。通過名為Mesos的第三方集群框架可以支持此行為。Spark 由加州大學(xué)伯克利分校 AMP 實(shí)驗(yàn)室 (Algorithms,Machines,and People Lab) 開發(fā),可用來構(gòu)建大型的、低延遲的數(shù)據(jù)分析應(yīng)用程序。
雖然 Spark 與 Hadoop 有相似之處,但它提供了具有圓數(shù)笑有用差異的一個(gè)新的集群計(jì)算框架。首先,Spark 是為集群計(jì)算中的特定類型的工作負(fù)載而設(shè)計(jì),即那些在并行操作之間重用工作數(shù)據(jù)集(比如機(jī)器學(xué)習(xí)算法)橘含的工作負(fù)載。為了優(yōu)化這些類型的工作負(fù)載,Spark 引進(jìn)了內(nèi)存集群計(jì)算的概念,可在畢喚內(nèi)存集群計(jì)算中將數(shù)據(jù)集緩存在內(nèi)存中,以縮短訪問延遲.
1、解決問題的層面不一樣
首先,Hadoop和Apache Spark兩者都是大數(shù)據(jù)框架,但是各自存在的目的不盡相同。Hadoop實(shí)質(zhì)信含上更多是一個(gè)分布式數(shù)據(jù)基礎(chǔ)設(shè)施: 它將巨大的數(shù)據(jù)集分派到一個(gè)由普通計(jì)算機(jī)組成的集群中的多個(gè)節(jié)點(diǎn)進(jìn)行存儲(chǔ),意味著您不需要購買和維護(hù)昂貴的服務(wù)器硬件。
同時(shí),Hadoop還會(huì)索引和跟蹤這些數(shù)據(jù),讓大數(shù)據(jù)處理和分析效率達(dá)到前所未有的高度。Spark,則是那么一個(gè)專門用來對(duì)那些分布式存儲(chǔ)的大數(shù)據(jù)進(jìn)行處理的工具,它并不會(huì)進(jìn)行分布式數(shù)據(jù)的存儲(chǔ)。
2、兩者可合可分
Hadoop除了提供為大家所共識(shí)的HDFS分布式數(shù)據(jù)存儲(chǔ)功能之外,還提供了叫做MapReduce的數(shù)據(jù)處理功能。所以這里我們完全可以拋開Spark,使用Hadoop自身的MapReduce來完成數(shù)據(jù)的處理。
相反,Spark也不是非要依附在Hadoop身上才能生存。但如上所述,畢竟它沒有提供文件管理系統(tǒng),所以,它必須和桐洞其他的分布式文件系統(tǒng)進(jìn)行集成才能運(yùn)作。這里我們可以選擇Hadoop的HDFS,也可以選擇其他的基于云的數(shù)據(jù)系統(tǒng)平臺(tái)。但Spark默認(rèn)來說還是被用在Hadoop上面的,畢竟,大家都認(rèn)為它們的結(jié)合是更好的。
以下是從網(wǎng)上摘錄的對(duì)MapReduce的最簡(jiǎn)潔明了的解析:
我們要數(shù)圖書館中的所有書。你數(shù)1號(hào)書架,我數(shù)2號(hào)書架。這就是“Map”。我們?nèi)嗽蕉?,?shù)書就更快。
現(xiàn)在我們到一起,把所有人的統(tǒng)計(jì)數(shù)加在一起。這就是“Reduce”。
3、Spark數(shù)據(jù)處理速度秒殺MapReduce
Spark因?yàn)槠涮幚頂?shù)據(jù)的方式不一樣,會(huì)比MapReduce快上很多。MapReduce是分步對(duì)數(shù)據(jù)進(jìn)行處理的: ”從集群中讀取數(shù)據(jù),進(jìn)行一次處理,將結(jié)果寫到集群,從集群中讀取更新后的數(shù)據(jù),進(jìn)行下一次的處理,將結(jié)果寫到集群,等等…“ Booz Allen Hamilton的數(shù)據(jù)科學(xué)家Kirk Borne如此解析。
反觀Spark,它會(huì)在內(nèi)存中以接近“實(shí)時(shí)”的時(shí)間完成所有的數(shù)據(jù)分析:“從集群中讀取數(shù)據(jù),完成所有必須的分析處理,將結(jié)果寫回集群,完成,” Born說道。Spark的批處理速度比MapReduce快近10倍,內(nèi)存中的數(shù)據(jù)分析速度則快近100倍。
如果需要處理的數(shù)據(jù)和結(jié)果需求大部分情況下是靜態(tài)的,且你也有耐心等待批處理的完成的話,MapReduce的處理方式也是完全可以接受的。
但如果你需要對(duì)流數(shù)據(jù)進(jìn)行分析,比如那些來自于工廠的傳感器收集回來的數(shù)據(jù),又或者說你的應(yīng)用是需要多重?cái)?shù)據(jù)處理的,那么你也許更應(yīng)滑輪笑該使用Spark進(jìn)行處理。
大部分機(jī)器學(xué)習(xí)算法都是需要多重?cái)?shù)據(jù)處理的。此外,通常會(huì)用到Spark的應(yīng)用場(chǎng)景有以下方面:實(shí)時(shí)的市場(chǎng)活動(dòng),在線產(chǎn)品推薦,網(wǎng)絡(luò)安全分析,機(jī)器日記監(jiān)控等。
4、災(zāi)難恢復(fù)
兩者的災(zāi)難恢復(fù)方式迥異,但是都很不錯(cuò)。因?yàn)镠adoop將每次處理后的數(shù)據(jù)都寫入到磁盤上,所以其天生就能很有彈性的對(duì)系統(tǒng)錯(cuò)誤進(jìn)行處理。
Spark的數(shù)據(jù)對(duì)象存儲(chǔ)在分布于數(shù)據(jù)集群中的叫做彈性分布式數(shù)據(jù)集(RDD: Resilient Distributed Dataset)中。這些數(shù)據(jù)對(duì)象既可以放在內(nèi)存,也可以放在磁盤,所以RDD同樣也可以提供完成的災(zāi)難恢復(fù)功能。
關(guān)于spark怎么分布式讀取數(shù)據(jù)庫的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港云服務(wù)器機(jī)房,創(chuàng)新互聯(lián)(www.cdcxhl.com)專業(yè)云服務(wù)器廠商,回大陸優(yōu)化帶寬,安全/穩(wěn)定/低延遲.創(chuàng)新互聯(lián)助力企業(yè)出海業(yè)務(wù),提供一站式解決方案。香港服務(wù)器-免備案低延遲-雙向CN2+BGP極速互訪!
文章名稱:Spark分布式技巧:數(shù)據(jù)庫讀取指南(spark怎么分布式讀取數(shù)據(jù)庫)
文章源于:http://www.dlmjj.cn/article/cdggdhj.html


咨詢
建站咨詢
