天天看點

spark基礎知識

1.Spark是什麼?

UCBerkeley AMPlab所開源的類HadoopMapReduce的通用的并行計算架構。

dfsSpark基于mapreduce算法實作的分布式計算,擁有HadoopMapReduce所具有的優點;但不同于MapReduce的是Job中間輸出和結果可以儲存在記憶體中,進而不再需要讀寫HDFS,是以Spark能更好地适用于資料挖掘與機器學習等需要疊代的map reduce的算法。

2.Spark與Hadoop的對比(Spark的優勢)

1、Spark的中間資料放到記憶體中,對于疊代運算效率更高

2、Spark比Hadoop更通用

3、Spark提供了統一的程式設計接口

4、容錯性– 在分布式資料集計算時通過checkpoint來實作容錯

5、可用性– Spark通過提供豐富的Scala, Java,Python API及互動式Shell來提高可用性

3.Spark有那些元件

1、Spark Streaming:支援高吞吐量、支援容錯的實時流資料處理

2、Spark SQL, Data frames: 結構化資料查詢

3、MLLib:Spark 生态系統裡用來解決大資料機器學習問題的子產品

4、GraphX是建構于Spark上的圖計算模型

5、SparkR是一個R語言包,它提供了輕量級的方式使得可以在R語言中使用 Spark

二. DataFrame相關知識點

1.DataFrame是什麼?

DataFrame是一種以RDD為基礎的分布式資料集,類似于傳統資料庫中的二維表格。

2.DataFrame與RDD的主要差別在于?

DataFrame帶有schema元資訊,即DataFrame所表示的二維表資料集的每一列都帶有名稱和類型。這使得SparkSQL得以洞察更多的結構資訊,進而對藏于DataFrame背後的資料源以及作用于DataFrame之上的變換進行了針對性的優化,最終達到大幅提升運作時效率的目标。

反觀RDD,由于無從得知所存資料元素的具體内部結構,Spark Core隻能在stage層面進行簡單、通用的流水線優化。

3.DataFrame 特性

1、支援從KB到PB級的資料量

2、支援多種資料格式和多種存儲系統

3、通過Catalyst優化器進行先進的優化生成代碼

4、通過Spark無縫內建主流大資料工具與基礎設施

5、API支援Python、Java、Scala和R語言

三 .RDD相關知識點

1.RDD,全稱為?

Resilient Distributed Datasets,意為容錯的、并行的資料結構,可以讓使用者顯式地将資料存儲到磁盤和記憶體中,并能控制資料的分區。同時,RDD還提供了一組豐富的操作來操作這些資料。

2.RDD的特點?

它是在叢集節點上的不可變的、已分區的集合對象。

通過并行轉換的方式來建立如(map, filter, join, etc)。

失敗自動重建。

可以控制存儲級别(記憶體、磁盤等)來進行重用。

必須是可序列化的。

是靜态類型的。

3.RDD核心概念

Client:用戶端程序,負責送出作業到Master。

Master:Standalone模式中主要節點,負責接收Client送出的作業,管理Worker,并指令Worker啟動配置設定Driver的資源和啟動Executor的資源。

Worker:Standalone模式中slave節點上的守護程序,負責管理本節點的資源,定期向Master彙報心跳,接收Master的指令,啟動Driver和Executor。

Driver: 一個Spark作業運作時包括一個Driver程序,也是作業的主程序,負責作業的解析、生成Stage并排程Task到Executor上。包括DAGScheduler,TaskScheduler。

Executor:即真正執行作業的地方,一個叢集一般包含多個Executor,每個Executor接收Driver的指令Launch Task,一個Executor可以執行一到多個Task。

4.RDD常見術語

DAGScheduler: 實作将Spark作業分解成一到多個Stage,每個Stage根據RDD的Partition個數決定Task的個數,然後生成相應的Task set放到TaskScheduler中。

TaskScheduler:實作Task配置設定到Executor上執行。

Task:運作在Executor上的工作單元

Job:SparkContext送出的具體Action操作,常和Action對應

Stage:每個Job會被拆分很多組任務(task),每組任務被稱為Stage,也稱TaskSet

RDD:Resilient Distributed Datasets的簡稱,彈性分布式資料集,是Spark最核心的子產品和類

Transformation/Action:SparkAPI的兩種類型;Transformation傳回值還是一個RDD,Action傳回值不少一個RDD,而是一個Scala的集合;所有的Transformation都是采用的懶政策,如果隻是将Transformation送出是不會執行計算的,計算隻有在Action被送出時才會被觸發。

DataFrame: 帶有Schema資訊的RDD,主要是對結構化資料的高度抽象。

DataSet:結合了DataFrame和RDD兩者的優勢,既允許使用者很友善的操作領域對象,又具有SQL執行引擎的高效表現。

5.RDD提供了兩種類型的操作:

transformation和action

1,transformation是得到一個新的RDD,方式很多,比如從資料源生成一個新的RDD,從RDD生成一個新的RDD

2,action是得到一個值,或者一個結果(直接将RDD cache到記憶體中)

3,所有的transformation都是采用的懶政策,就是如果隻是将transformation送出是不會執行計算的,計算隻有在action被送出的時候才被觸發

6.RDD中關于轉換(transformation)與動作(action)的差別

transformation會生成新的RDD,而後者隻是将RDD上某項操作的結果傳回給程式,而不會生成新的RDD;無論執行了多少次transformation操作,RDD都不會真正執行運算(記錄lineage),隻有當action操作被執行時,運算才會觸發。

7.RDD 與 DSM的最大不同是?

DSM(distributed shared memory)

RDD隻能通過粗粒度轉換來建立,而DSM則允許對每個記憶體位置上資料的讀和寫。在這種定義下,DSM不僅包括了傳統的共享記憶體系統,也包括了像提供了共享 DHT(distributed hash table) 的 Piccolo 以及分布式資料庫等。

8.RDD的優勢?

1、高效的容錯機制

2、結點落後問題的緩和 (mitigate straggler) 

3、批量操作

4、優雅降級 (degrade gracefully)

9.如何擷取RDD?

1、從共享的檔案系統擷取,(如:HDFS)

2、通過已存在的RDD轉換

3、将已存在scala集合(隻要是Seq對象)并行化 ,通過調用SparkContext的parallelize方法實作

4、改變現有RDD的之久性;RDD是懶散,短暫的。

10.RDD都需要包含以下四個部分

a.源資料分割後的資料塊,源代碼中的splits變量

b.關于“血統”的資訊,源碼中的dependencies變量

c.一個計算函數(該RDD如何通過父RDD計算得到),源碼中的iterator(split)和compute函數

d.一些關于如何分塊和資料存放位置的元資訊,如源碼中的partitioner和preferredLocations0

11.RDD中将依賴的兩種類型

窄依賴(narrowdependencies)和寬依賴(widedependencies)。

窄依賴是指父RDD的每個分區都隻被子RDD的一個分區所使用。相應的,那麼寬依賴就是指父RDD的分區被多個子RDD的分區所依賴。例如,map就是一種窄依賴,而join則會導緻寬依賴

依賴關系分類的特性:

第一,窄依賴可以在某個計算節點上直接通過計算父RDD的某塊資料計算得到子RDD對應的某塊資料;

第二,資料丢失時,對于窄依賴隻需要重新計算丢失的那一塊資料來恢複;

Spark Streaming相關知識點

1.Spark Streaming的基本原理

Spark Streaming的基本原理是将輸入資料流以時間片(秒級)為機關進行拆分,然後以類似批處理的方式處理每個時間片資料

RDD 基本操作

常見的聚合操作:

count(*) 所有值不全為NULL時,加1操作

count(1) 不管有沒有值,隻要有這條記錄,值就加1

count(col) col列裡面的值為null,值不會加1,這個列裡面的值不為NULL,才加1

sum求和

sum(可轉成數字的值) 傳回bigint

avg求平均值

avg(可轉成數字的值)傳回double

distinct不同值個數

count(distinct col)

按照某些字段排序

select col1,other... from table where conditio order by col1,col2 [asc|desc]

Join表連接配接

join等值連接配接(内連接配接),隻有某個值在m和n中同時存在時。

left outer join 左外連接配接,左邊表中的值無論是否在b中存在時,都輸出;右邊表中的值,隻有在左邊表中存在時才輸出。

right outer join 和 left outer join 相反。

Transformation具體内容:

reduceByKey(func, [numTasks]) : 在一個(K,V)對的資料集上使用,傳回一個(K,V)對的資料集,key相同的值,都被使用指定的reduce函數聚合到一起。和groupbykey類似,任務的個數是可以通過第二個可選參數來配置的。

join(otherDataset, [numTasks]) :在類型為(K,V)和(K,W)類型的資料集上調用,傳回一個(K,(V,W))對,每個key中的所有元素都在一起的資料集

groupWith(otherDataset, [numTasks]) : 在類型為(K,V)和(K,W)類型的資料集上調用,傳回一個資料集,組成元素為(K, Seq[V], Seq[W]) Tuples。這個操作在其它架構,稱為CoGroup

cartesian(otherDataset) : 笛卡爾積。但在資料集T和U上調用時,傳回一個(T,U)對的資料集,所有元素互動進行笛卡爾積。

flatMap(func) :類似于map,但是每一個輸入元素,會被映射為0到多個輸出元素(是以,func函數的傳回值是一個Seq,而不是單一進制素)

Case 1将一個list乘方後輸出

val input = sc.parallelize(List(1,2,3,4))

val result = input.map(x => x*x)

println(result.collect().mkString(","))

Case 2 wordcount

val textFile = sc.textFile(args(1))

val result = textFile.flatMap(line => line.split("\\s+")).map(word => (word, 1)).reduceByKey(_ + _)

result.saveAsTextFile(args(2))

Case 3 列印rdd的元素

rdd.foreach(println) 或者 rdd.map(println).

rdd.collect().foreach(println)

rdd.take(100).foreach(println)

spark SQL

spark基礎知識

Spark Streaming優劣

優勢:

1、統一的開發接口

2、吞吐和容錯

3、多種開發範式混用,Streaming + SQL, Streaming +MLlib

4、利用Spark記憶體pipeline計算

劣勢:

微批處理模式,準實時

spark基礎知識
spark基礎知識
Storm結構:
spark基礎知識

DStream

1.将流式計算分解成一系列确定并且較小的批處理作業

2.将失敗或者執行較慢的任務在其它節點上并行執行,執行的最小單元為RDD的partition

3.較強的容錯能力

spark stream example code

spark基礎知識

四. 日志系統

1.Flume

Flume是一個分布式的日志收集系統,具有高可靠、高可用、事務管理、失敗重新開機等功能。資料處理速度快,完全可以用于生産環境。

Flume的核心是agent。

Agent是一個java程序,運作在日志收集端,通過agent接收日志,然後暫存起來,再發送到目的地。

Agent裡面包含3個核心元件:source、channel、sink。

Source元件是專用于收集日志的,可以處理各種類型各種格式的日志資料,包括avro、thrift、exec、jms、spoolingdirectory、netcat、sequencegenerator、syslog、http、legacy、自定義。source元件把資料收集來以後,臨時存放在channel中。

Channel元件是在agent中專用于臨時存儲資料的,可以存放在memory、jdbc、file、自定義。channel中的資料隻有在sink發送成功之後才會被删除。

Sink元件是用于把資料發送到目的地的元件,目的地包括hdfs、logger、avro、thrift、ipc、file、null、hbase、solr、自定義。

Apache Kafka是分布式釋出-訂閱消息系統。

它最初由LinkedIn公司開發,之後成為Apache項目的一部分。Kafka是一種快速、可擴充的、設計内在就是分布式的,分區的和可複制的送出日志服務。

Apache Kafka與傳統消息系統相比,有以下不同:

1、它被設計為一個分布式系統,易于向外擴充;

2、它同時為釋出和訂閱提供高吞吐量;

3、它支援多訂閱者,當失敗時能自動平衡消費者;

4、它将消息持久化到磁盤,是以可用于批量消費

五. 分布式搜尋

搜尋引擎是什麼?

搜尋引擎是指根據一定的政策、運用特定的計算機程式從網際網路上搜集資訊,在對資訊進行組織和處理後,為使用者提供檢索服務,将使用者檢索相關的資訊展示給使用者的系統。搜尋引擎包括全文索引、目錄索引、元搜尋引擎、垂直搜尋引擎、集合式搜尋引擎、門戶搜尋引擎與免費連結清單等。

Lucene是什麼?

Lucene一個高性能、可伸縮的資訊搜尋庫,即它不是一個完整的全文檢索引擎,而是一個全檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎。

Elasticsearch是什麼?

Elasticsearch一個高可擴充的開源的全文本搜尋和分析工具。

它允許你以近實時的方式快速存儲、搜尋、分析大容量的資料。Elasticsearch是一個基于ApacheLucene(TM)的開源搜尋引擎。無論在開源還是專有領域,Lucene可以被認為是迄今為止最先進、性能最好的、功能最全的搜尋引擎庫。

ElasticSearch 有4中方式來建構資料庫

最簡單的方法是使用indexAPI,将一個Document發送到特定的index,一般通過curltools實作。

第二第三種方法是通過bulkAPI和UDPbulkAPI。兩者的差別僅在于連接配接方式。

第四種方式是通過一個插件-river。river運作在ElasticSearch上,并且可以從外部資料庫導入資料到ES中。需要注意的是,資料建構僅在分片上進行,而不能在副本上進行。

ELK是一套常用的開源日志監控和分析系統

包括一個分布式索引與搜尋服務Elasticsearch,一個管理日志和事件的工具logstash,和一個資料可視化服務Kibana,logstash 負責日志的收集,處理和儲存,elasticsearch 負責日志檢索和分析,Kibana 負責日志的可視化。

六. 分布式資料庫

1.Hive是什麼?

Hive是基于Hadoop的一個資料倉庫工具,可以将結構化的資料檔案映射為一張資料庫表,并提供類SQL查詢功能。本質是将HQL轉換為MapReduce程式

2.Hive的設計目标?

1、Hive的設計目标是使Hadoop上的資料操作與傳統SQL相結合,讓熟悉SQL程式設計開發人員能夠輕松向Hadoop平台遷移

2、Hive提供類似SQL的查詢語言HQL,HQL在底層被轉換為相應的MapReduce操作

3、Hive在HDFS上建構資料倉庫來存儲結構化的資料,這些資料一般來源與HDFS上的原始資料,使用Hive可以對這些資料執行查詢、分析等操作。

3.Hive的資料模型

Hive資料庫

内部表

外部表

分區

Hive的視圖

Hive在建立内部表時,會将資料移動到資料倉庫指向的路徑,若建立外部表,僅記錄資料所在的路徑,不對資料位置做任何改變,在删除表的時候,内部表的中繼資料和資料會被一起删除,外部表隻會删除中繼資料,不删除資料。這樣來說,外部表要比内部表安全,資料組織液更加靈活,友善共享源資料。

4.Hive的調用方式

1、Hive Shell

2、Thrift

3、JDBC

4、ODBC

5.Hive的運作機制

1、将sql轉換成抽象文法樹

2、将抽象文法樹轉化成查詢塊

3、将查詢塊轉換成邏輯查詢計劃(操作符樹)

4、将邏輯計劃轉換成實體計劃(M\Rjobs)

6.Hive的優勢

1、并行計算

2、充分利用叢集的CPU計算資源、存儲資源

3、處理大規模資料集

4、使用SQL,學習成本低

7.Hive應用場景

1、海量資料處理

2、資料挖掘

3、資料分析

4、SQL是商務智能工具的通用語言,Hive有條件和這些BI産品進行內建

8.Hive不适用場景

1、複雜的科學計算

2、不能做到互動式的實時查詢

9.Hive和資料庫(RDBMS)的差別

1、資料存儲位置。Hive是建立在Hadoop之上的,所有的Hive的資料都是存儲在HDFS中的。而資料庫則可以将資料儲存在塊裝置或本地檔案系統中。

2、資料格式。Hive中沒有定義專門的資料格式,由使用者指定,需要指定三個屬性:列分隔符,行分隔符,以及讀取檔案資料的方法。資料庫中,存儲引擎定義了自己的資料格式。所有資料都會按照一定的組織存儲。

3、資料更新。Hive的内容是讀多寫少的,是以,不支援對資料的改寫和删除,資料都在加載的時候中确定好的。資料庫中的資料通常是需要經常進行修改。

4、執行延遲。Hive在查詢資料的時候,需要掃描整個表(或分區),是以延遲較高,隻有在處理大資料是才有優勢。資料庫在處理小資料是執行延遲較低。

5、索引。Hive沒有,資料庫有

6、執行。Hive是MapReduce,資料庫是Executor

7、可擴充性。Hive高,資料庫低

8、資料規模。Hive大,資料庫小

hive代碼簡單例子:

建立一個名為”test“的table

create table students (name string,age int,city string,class string) row format delimited fields terminated by ',';

load data local inpath "/opt/students.txt" into table students;

create EXTERNAL table IF NOT EXISTS studentX (name string,age int,city string,class string) partitioned by (grade string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

alter table studentX add partition (grade='excellent') location '/testM/excellent/';

alter table studentX add partition (grade='good') location '/testM/good/';

alter table studentX add partition (grade='moderate') location '/testM/moderate/';

#加載資料

load data inpath "/testtry/studentsm.txt" into table studentX partition (grade='excellent');

load data inpath "/testtry/students.txt" into table studentX partition (grade='good');

show partitions studentX;

select * from studentX where grade='excellent';

表删除操作:drop table students;

load data local inpath "/bin/students.txt" into table students;

###

練習:建立外部表,指定資料存放位置

create EXTERNAL table IF NOT EXISTS studentX (name string,age int,city string,class string) partitioned by (class string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

alter table test add partition (class='one') location '/testmore/one';

對表進行查詢

Select * from students;

分區表操作

hive>create table students (name string,age int,city string,class string) partitioned by (class string) row format delimited fields terminated by ',';

hive>load data local inpath "students.txt" into table students partition (class='one');

hive>show partitions students;

hive>select * from students where grade='two';

查詢操作

group by、 order by、 join 、 distribute by、 sort by、 clusrer by、 union all

hive常見操作

spark基礎知識

Hbase 的子產品:

原子性(是指不會被線程排程機制打斷的操作,這種操作一旦開始,就一直運作到結束,中間不會有任何contextswitch(切換到領一個線程)),一緻性,隔離性,持久性

spark基礎知識

Region- Region用于存放表中的行資料

Region Server

spark基礎知識
Master
spark基礎知識

Zookeeper

HDFS

列式存儲格式 Parquet

Parquet 是面向分析型業務的列式存儲格式,由 Twitter 和 Cloudera 合作開發, 2015 年 5 月從 Apache 的孵化器裡畢業成為 Apache 頂級項目,最新的版本是 1.8.0 。

列式存儲和行式存儲相比的優勢 :

可以跳過不符合條件的資料,隻讀取需要的資料,降低 IO 資料量。

壓縮編碼可以降低磁盤存儲空間。由于同一列的資料類型是一樣的,可以使用更高效的壓縮編碼(例如 Run Length Encoding 和 DeltaEncoding )進一步節約存儲空間。

隻讀取需要的列,支援向量運算,能夠擷取更好的掃描性能。

Hive操作

Hive

spark基礎知識

歡迎關注微信公衆号:大資料從業者