[大資料]spark入門 in python(一)HelloWorld
之前由於工作的需要玩了快一年的hadoop,做了一些資料分析的基礎工作。
自然,hadoop用做離線分析還是完全滿足需求的,無論是自己寫mapreduce程式碼開發
又或者使用hive來便利分析,但是面對實時計算,就需要跟高一層級的框架了,storm,spark
就是對應的技術了,於是自己開始學習spark,作為半路出家的選手自然選用了python作為開發語言
下面就是自己的spark學習筆記了,主要參考書籍:Spark快速大資料分析
spark支援多種開發語言,scala,java,python等
scala,java都不熟,於是乎採用了python,一種:一種方法解決所有問題的語言。
一句話總結:spark是一個基於記憶體的大資料計算框架,
上層包括了:Spark SQL類似HiveQL, Spark Streaming 實時資料流計算,MLlib 機器學習演算法包,GraphX 圖演算法包
底層 SparkCore 實現了基本功能:任務排程,記憶體管理,錯誤恢復,儲存互動等,SparkCore還包含了對RDD(彈性分散式資料集)的API定義
RDD是Spark對計算任務封裝,現在不懂也沒關係,後面會隨著例項進一步理解RDD
一、Spark安裝:
單機版本spark安裝相當簡單,從官網下載一個原始碼包,解壓即可。http://spark.apache.org/downloads.html
解壓,把bin目錄加入環境變數,pyspark即可啟動python shell
單機模式啟動pyspark後
一個簡單的demo:
>>>lines = sc.textFile("1.txt") //建立一個RDD,“1.txt為本地存在的檔案
>>> lines
MapPartitionsRDD[4] at textFile at NativeMethodAccessorImpl.java:-2
>>> lines.count()
7
通過lines物件,可以呼叫基本的函式,統計單詞數等
例子中sc是什麼呢?SparkContext。
每一個spark應用都有一個驅動器程式()來發起叢集上的各種並行操作,pyspark即驅動器程式,
驅動器程式通過一個SparkContext物件來訪問Spark,sc代表對計算叢集的一個連線。
驅動器程式一般要管理多個執行器節點,將計算任務分發給不同的節點計算。
下面繼續完成大資料下的Helloword:word count 程式:
>>> words = lines.flatMap(lambda line: line.split(' '))
>>> words
PythonRDD[8] at RDD at PythonRDD.scala:43
>>> wc = words.map(lambda x:(x,1))
>>> wc
PythonRDD[9] at RDD at PythonRDD.scala:43
>>> from operator import add
>>> counts = wc.reduceByKey(add)
>>> counts
PythonRDD[14] at RDD at PythonRDD.scala:43
>>> counts.saveAsTextFile("wc")
示例中可以看出 lines,words,wc,counts都是RDD物件例項每一步操作在Spark都是RDD的一個抽象
獨立應用,不通過shell怎麼寫獨立的指令碼呢,
直接編寫校本檔案,然後通過spark-submit提交即可
eg:worldcount程式的py指令碼如下:
########first.py############
from pyspark import SparkConf, SparkContext
from operator import add
conf = SparkConf().setMaster("local").setAppName("My App")
sc = SparkContext(conf=conf)
lines = sc.textFile("/Users/xiabin/1.txt")
words = lines.flatMap(lambda line: line.split(' '))
wc = words.map(lambda x:(x,1))
counts = wc.reduceByKey(add)
counts.saveAsTextFile("wcres")
測試中還發現,spark-submit可以智慧的識別應用的一些py模組,比如import一個myconf.py檔案
或者一個包都可以無需新增任何程式碼執行(只單機實驗)。
第一次接觸下來對比寫hadoop的mapreduce程式碼,spark的封裝呼叫相對來說簡單了不少。