初識spark

大數(shù)據(jù)及分析環(huán)境

bigdata主要體現(xiàn)在:量,速度,多樣性
數(shù)據(jù)量,數(shù)據(jù)流速度(實時,批量,串流),數(shù)據(jù)多樣性(結(jié)構(gòu)化,半結(jié)構(gòu)化(彈性內(nèi)容),非結(jié)構(gòu)化(寫parser處理))

lambda architecture(數(shù)據(jù)系統(tǒng)架構(gòu))

lambda architecture
lambda architecture

DIKW金字塔:
data,information,knowledge,wisdom

Excel,csv(rowbased),parquet(columnbased),avro(序列化,減少傳輸時的空間)
單機(mysql),分布式,hdfs,s3
HDD,SSD,Memory

batch:hadoop,spark,SQL Database
streaming:Storm,Kafka,Spark Streaming
rdbms,nosql

大數(shù)據(jù)分析環(huán)境
大數(shù)據(jù)分析環(huán)境

Spark簡介

spark(計算框架)速度大幅超越hadoop(mapreduce)
spark streaming,sql,mllib,graphx
Resilient Distributed Datasets(RDD):
彈性分布式數(shù)據(jù)集
spark最基礎(chǔ)的抽象結(jié)構(gòu)。可容錯且并行運行。兩種類型:
平行集合:scala集合,可并行運行
hadoop數(shù)據(jù)集:并行運行在hdfs或者其他hadoop支持的存儲系統(tǒng)上
RDD兩種操作行為:
Transformations,Actions

兩種操作

很多個Transformation對應(yīng)一個Action,RDD持久化存儲在內(nèi)存或硬盤中

RDD生命周期

窄依賴,寬依賴


spark元件



Spark Driver(執(zhí)行應(yīng)用程序,建立SparkContext并且安排任務(wù)、與ClusterManager溝通)、Executors(執(zhí)行Driver安排的工作,將執(zhí)行的結(jié)果存儲在內(nèi)存中,與存儲系統(tǒng)進行交互)、Cluster Manager(資源分配管理)

運行任務(wù)流程



Spark元件運作方式:

Spark1.X vs Spark2.x
以前用SparkContext作為進入點(使用時需要有一堆SqlContext,HiveContext……),現(xiàn)在都改為SparkSession。可以直接讀取各種數(shù)據(jù)源,可以直接合Hive Metadata溝通,同時也包含設(shè)定和資源管理的功能。
實現(xiàn)SQL的功能:
select count(*) from store_sales where ss_item_sk = 1000
spark1.x
傳統(tǒng)做法:

這種做法含有大量的虛擬函數(shù),數(shù)據(jù)緩存在內(nèi)存中,沒有循環(huán)展開,SIMD或Pipeline
手寫做法:


這種做法沒有虛擬函數(shù),數(shù)據(jù)在CPU寄存器中,編譯器循環(huán)展開,SIMD,Pipeline,使得簡單的循環(huán)非常高效,得以透過底層的硬件進行優(yōu)化。
spark2.x經(jīng)過優(yōu)化能自動用簡單的方法處理:

pyspark


語法:

textFile = spark.read.text("README.md")
wordCount = textFile.flatmap(lambda x:x.split(''))\
.map(lambda x:(x,1))\
.reduceByKey(lambda x,y:x+y)\
.collect()

可以自由游走于RDD和Pandas Dataframe之間

sparkSQL

sql:select,from,join,group,order,where

select a.id,b.name,b.age,sum(c.onlinetime) as onlinetime
from userid a
join userinfo b
on a.userid = b.userid
join(
    select userid,logintime - logouttime as onlinetime
    from log
    where df between '2016-01-01' and '2017-09-01'
)c
on a.userid = c.userid
group by a.id,b.name,b.age
order by onlinetime DESC
limit 100
pyspark混合sql
context = HiveContext(sc)
results = context.sql(
"SELECT * FROM people")
names = results.map(lambda p:p.name)

數(shù)據(jù)來源可以包括S3,HDFS,Cassandra,數(shù)據(jù)格式可以是json,text,parquet,都可以轉(zhuǎn)成DataFrame操作

context.jsonFile("s3n://...")
  .registerTempTable("json")
results=context.sql(
  """SELECT * 
    FROM people
    JOIN json ...""")

sparksql與hive高度整合,可以從hive的metastore中讀取數(shù)據(jù)表格。可以通過JDBC或ODBC連接spark sql,享受spark的運算能力。


catalyst(催化劑)

pyspark的sparksql語法:

spark.read.csv()……
讀取json數(shù)據(jù)的時候不需要再寫parser
df = spark.read.json()
df.show() 得到dataframe
df.select("name").show()
df.write.csv()……
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容