大數(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))
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
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)存或硬盤中
窄依賴,寬依賴
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()……