從2015年開始,國內大數據市場繼續保持高速的發展態勢,作者在與地方政府、證券金融公司的項目合作中發現,他們對大數據技術很感興趣,并希望從大數據技術、大數據采集、管理、分析以及可視化等方面得到指導和應用幫助。因此編寫了這本大數據技術的快速入門書。 本書共12章,以Hadoop和Spark框架為線索,比較地介紹了Hadoop技術、Spark技術、大數據存儲、大數據訪問、大數據采集、大數據管理、大數據分析等內容。還給出兩個案例:環保大數據和公安大數據,供讀者參考。 本書適合大數據技術初學者,政府、金融機構的大數據應用決策和技術人員,IT經理,CTO,CIO等快速學數據技術。本書也可以作為高等院校和培訓學校相關專業的培訓教材。
本書作者楊正洪是國內知名大數據專家,是華中科技大學和中國地質大學客座教授,擁有國家專利,是湖北省2013年海外引進的科技人才,受武漢市政府邀請,成立武漢市云升科技發展有限公司,在浙江和上海分別有全資子公司,在美國硅谷設有研發中心。作者在與地方政府、證券金融公司的項目合作中發現,他們對大數據技術很感興趣,并希望從大數據技術、大數據采集、管理、分析以及可視化等方面得到指導和應用幫助。因此編寫了這本大數據技術的快速入門書。本書以Hadoop和Spark框架為線索,比較地介紹了Hadoop技術、Spark技術、大數據存儲、大數據訪問、大數據采集、大數據管理、大數據分析等內容。后還給出兩個案例:環保大數據和公安大數據,供讀者參考。
本書作者楊正洪是國內知名大數據專家,畢業于美國State University of New York at Stony Brook,在IBM公司從事大數據相關研發工作12年多。從2003~2013年,楊正洪在美國加州的IBM硅谷實驗室(IBM Silicon Valley Lab)負責IBM大數據平臺的設計、研發和實施,主持了保險行業、金融行業、政府行業的大數據系統的架構設計和實施。楊正洪是華中科技大學和中國地質大學客座教授,擁有國家專利,是湖北省2013年海外引進人才。受武漢市政府邀請,楊正洪于2012年12月發起成立武漢市云升科技發展有限公司,并獲得東湖高新技術開發區辦公場所和資金支持。目前公司在浙江和上海分別有全資子公司,在美國硅谷設有研發中心。公司的核心產品是大數據管理平臺EasyDoop,并以EasyDoop為基礎研發了公安大數據產品和環保大數據產品。這些產品在公安和環保行業得到成功實施,三次被中央電視臺新聞聯播節目播報,省部長級政府領導親自考察,并給予了很高的評價。楊正洪參與了多項大數據相關標準的制定工作,曾受邀參與了公安部主導的“信息安全技術-大數據平臺安全管理產品安全技術要求”的國家標準制定。
目 錄
第1章 大數據時代 1
1.1 什么是大數據 1
1.2 大數據的四大特征 2
1.3 大數據的商用化 3
1.4 大數據分析 5
1.5 大數據與云計算的關系 5
1.6 大數據的國家戰略 6
1.6.1 政府大數據的價值 7
1.6.2 政府大數據的應用場景 8
1.7 企業如何迎接大數據 8
1.7.1 評估大數據方案的維度 9
1.7.2 業務價值維度 10
1.7.3 數據維度 11
1.7.4 現有IT環境和成本維度 12
1.7.5 數據治理維度 13
1.8 大數據產業鏈分析 14
1.8.1 技術分析 14
1.8.2 角色分析 15
1.8.3 大數據運營 17
1.9 大數據交易 18
1.10 大數據之我見 19
第2章 大數據軟件框架 20
2.1 Hadoop框架 20
2.1.1 HDFS(分布式文件系統) 21
2.1.2 MapReduce(分布式計算框架) 22
2.1.3 YARN(集群資源管理器) 25
2.1.4 Zookeeper(分布式協作服務) 28
2.1.5 Ambari(管理工具) 29
2.2 Spark(內存計算框架) 29
2.2.1 Scala 31
2.2.2 Spark SQL 32
2.2.3 Spark Streaming 33
2.3 實時流處理框架 34
2.4 框架的選擇 35
第3章 安裝與配置大數據軟件 36
3.1 Hadoop發行版 36
3.1.1 Cloudera 36
3.1.2 HortonWorks 37
3.1.3 MapR 38
3.2 安裝Hadoop前的準備工作 39
3.2.1 Linux主機配置 40
3.2.2 配置Java環境 41
3.2.3 安裝NTP和python 42
3.2.4 安裝和配置openssl 43
3.2.5 啟動和停止特定服務 44
3.2.6 配置SSH無密碼訪問 44
3.3 安裝Ambari 和 HDP 45
3.3.1 配置安裝包文件 45
3.3.2 安裝 Ambari 46
3.3.3 安裝和配置HDP 47
3.4 初識Hadoop 49
3.4.1 啟動和停止服務 50
3.4.2 使用HDFS 51
3.5 Hadoop的特性 52
第4章 大數據存儲:文件系統 53
4.1 HDFS shell命令 53
4.2 HDFS配置文件 55
4.3 HDFS API編程 57
4.3.1 讀取HDFS文件內容 57
4.3.2 寫HDFS文件內容 60
4.4 HDFS API總結 62
4.4.1 Configuration類 62
4.4.2 FileSystem抽象類 62
4.4.3 Path類 63
4.4.4 FSDataInputStream類 63
4.4.5 FSDataOutputStream類 63
4.4.6 IOUtils類 63
4.4.7 FileStatus類 64
4.4.8 FsShell類 64
4.4.9 ChecksumFileSystem抽象類 64
4.4.10 其他HDFS API實例 64
4.4.11 綜合實例 67
4.5 HDFS文件格式 69
4.5.1 SequenceFile 70
4.5.2 TextFile(文本格式) 70
4.5.3 RCFile 70
4.5.4 Avro 72
第5章 大數據存儲:數據庫 73
5.1 NoSQL 73
5.2 HBase管理 74
5.2.1 HBase表結構 75
5.2.2 HBase系統架構 78
5.2.3 啟動并操作HBase數據庫 80
5.2.4 HBase Shell工具 82
5.3 HBase編程 86
5.3.1 增刪改查API 86
5.3.2 過濾器 90
5.3.3 計數器 93
5.3.4 原子操作 94
5.3.5 管理API 94
5.4 其他NoSQL數據庫 95
第6章 大數據訪問:SQL引擎層 97
6.1 Phoenix 97
6.1.1 安裝和配置Phoenix 98
6.1.2 在eclipse上開發phoenix程序 104
6.1.3 Phoenix SQL工具 108
6.1.4 Phoenix SQL 語法 109
6.2 Hive 111
6.2.1 Hive架構 111
6.2.2 安裝Hive 112
6.2.3 Hive和MySQL的配置 114
6.2.4 Hive CLI 115
6.2.5 Hive數據類型 115
6.2.6 HiveQL DDL 119
6.2.7 HiveQL DML 121
6.2.8 Hive編程 123
6.2.9 HBase集成 125
6.2.10 XML和JSON數據 127
6.2.11 使用Tez 128
6.3 Pig 130
6.3.1 Pig語法 131
6.3.2 Pig和Hive的使用場景比較 134
6.4 ElasticSearch(全文搜索引擎) 136
6.4.1 全文索引的基礎知識 136
6.4.2 安裝和配置ES 138
6.4.3 ES API 140
第7章 大數據采集和導入 143
7.1 Flume 145
7.1.1 Flume架構 145
7.1.2 Flume事件 146
7.1.3 Flume源 147
7.1.4 Flume攔截器(Interceptor) 148
7.1.5 Flume通道選擇器(Channel Selector) 149
7.1.6 Flume通道 150
7.1.7 Flume接收器 151
7.1.8 負載均衡和單點失敗 153
7.1.9 Flume監控管理 153
7.1.10 Flume實例 154
7.2 Kafka 155
7.2.1 Kafka架構 156
7.2.2 Kafka與JMS的異同 158
7.2.3 Kafka性能考慮 158
7.2.4 消息傳送機制 159
7.2.5 Kafka和Flume的比較 159
7.3 Sqoop 160
7.3.1 從數據庫導入HDFS 160
7.3.2 增量導入 163
7.3.3 將數據從Oracle導入Hive 163
7.3.4 將數據從Oracle導入HBase 164
7.3.5 導入所有表 165
7.3.6 從HDFS導出數據 165
7.3.7 數據驗證 165
7.3.8 其他Sqoop功能 165
7.4 Storm 167
7.4.1 Storm基本概念 168
7.4.2 spout 169
7.4.3 bolt 171
7.4.4 拓撲 173
7.4.5 Storm總結 175
7.5 Splunk 175
第8章 大數據管理平臺 177
8.1 大數據建設總體架構 177
8.2 大數據管理平臺的必要性 178
8.3 大數據管理平臺的功能 179
8.3.1 推進數據資源整合共享 179
8.3.2 增強數據管理水平 180
8.3.3 支撐創新大數據分析 180
8.4 數據管理平臺(DMP) 180
8.5 EasyDoop案例分析 182
8.5.1 大數據建模平臺 183
8.5.2 大數據交換和共享平臺 184
8.5.3 大數據云平臺 185
8.5.4 大數據服務平臺 186
8.5.5 EasyDoop平臺技術原理分析 188
第9章 Spark技術 192
9.1 Spark框架 192
9.1.1 安裝Spark 193
9.1.2 配置Spark 194
9.2 Spark Shell 195
9.3 Spark編程 198
9.3.1 編寫Spark API程序 198
9.3.2 使用sbt編譯并打成jar包 199
9.3.3 運行程序 200
9.4 RDD 200
9.4.1 RDD算子和RDD依賴關系 201
9.4.2 RDD轉換操作 203
9.4.3 RDD行動(Action)操作 204
9.4.4 RDD控制操作 205
9.4.5 RDD實例 205
9.5 Spark SQL 208
9.5.1 DataFrame 209
9.5.2 RDD轉化為DataFrame 213
9.5.3 JDBC數據源 215
9.5.4 Hive數據源 216
9.6 Spark Streaming 217
9.6.1 DStream編程模型 218
9.6.2 DStream操作 221
9.6.3 性能考慮 223
9.6.4 容錯能力 224
9.7 GraphX圖計算框架 224
9.7.1 屬性圖 226
9.7.2 圖操作符 228
9.7.3 屬性操作 231
9.7.4 結構操作 231
9.7.5 關聯(join)操作 233
9.7.6 聚合操作 234
9.7.7 計算度信息 235
9.7.8 緩存操作 236
9.7.9 圖算法 236
第10章 大數據分析 238
10.1 數據科學 239
10.1.1 探索性數據分析 240
10.1.2 描述統計 241
10.1.3 數據可視化 241
10.2 預測分析 244
10.2.1 預測分析實例 244
10.2.2 回歸(Regression)分析預測法 246
10.3 機器學習 247
10.3.1 機器學習的市場動態 248
10.3.2 機器學習分類 249
10.3.3 機器學習算法 251
10.4 Spark MLib 252
10.4.1 MLib架構 253
10.4.2 MLib算法庫 253
10.4.3 決策樹 257
10.5 深入了解算法 261
10.5.1 分類算法 262
10.5.2 預測算法 263
10.5.3 聚類分析 263
10.5.4 關聯分析 264
10.5.5 異常值分析算法 266
10.5.6 協同過濾(推薦引擎)算法 267
10.6 Mahout簡介 267
第11章 案例分析:環保大數據 268
11.1 環保大數據管理平臺 268
11.2 環保大數據應用平臺 269
11.2.1 環境自動監測監控服務 270
11.2.2 綜合查詢服務 272
11.2.3 統計分析服務 272
11.2.4 GIS服務 274
11.2.5 視頻服務 274
11.2.6 預警服務 275
11.2.7 應急服務 276
11.2.8 電子政務服務 277
11.2.9 智能化運營管理系統 279
11.2.10 環保移動應用系統 279
11.2.11 空氣質量系統 280
11.3 環保大數據分析系統 280
第12章 案例分析:公安大數據 281
12.1 總體架構設計 281
12.2 建設內容 282
12.3 建設步驟 284
附錄 1 數據量的單位級別 285
附錄 2 Linux Shell常見命令 286
附錄 3 Ganglia(分布式監控系統) 289
附錄 4 auth-ssh腳本 290
附錄 5 作者簡介 292
第 9 章 Spark技術
Apache Spark 是一個新興的大數據處理通用引擎,提供了分布式的內存抽象。Spark較大的特點就是快(Lightning-Fast),可比 Hadoop MapReduce 的處理速度快 100 倍。此外,Spark 提供了簡單易用的 API,幾行代碼就能實現 WordCount。本章介紹Spark 的框架,Spark Shell 、RDD、Spark SQL、Spark Streaming 等的基本使用。
9.1 Spark框架
Spark作為新一代大數據快速處理平臺,集成了大數據相關的各種能力。Hadoop的中間數據需要存儲在硬盤上,這產生了較高的延遲。而Spark基于內存計算,解決了這個延遲的速度問題。Spark本身可以直接讀寫Hadoop上任何格式數據,這使得批處理更加快速。
圖9-1是以Spark為核心的大數據處理框架。最底層為大數據存儲系統,如:HDFS、HBase等。在存儲系統上面是Spark集群模式(也可以認為是資源管理層),這包括Spark自帶的獨立部署模式、YARN和Mesos集群資源管理模式,也可以是Amazon EC2。Spark內核之上是為應用提供各類服務的組件。Spark內核API支持Java、Python、Scala等編程語言。Spark Streaming提供高性、高吞吐量的實時流式處理服務,能夠滿足實時系統要求;MLib提供機器學習服務,Spark SQL提供了性能比Hive快了很多倍的SQL查詢服務,GraphX提供圖計算服務。
圖9-1 Spark 框架
從上圖看出,Spark有效集成了Hadoop組件,可以基于Hadoop YARN作為資源管理框架,并從HDFS和HBase數據源上讀取數據。YARN是Spark目前主要使用的資源管理器。Hadoop能做的,Spark基本都能做,而且做的比Hadoop好。Spark依然是Hadoop生態圈的一員,它替換的主要是MR的計算模型而已。資源調度依賴于YARN,存儲則依賴于HDFS。
Spark的大數據處理平臺是建立在統一抽象的RDD之上。RDD是彈性分布式數據集(Resilient Distributed Dataset)的英文簡稱,它是一種特殊數據集合,支持多種來源,有容錯機制,可以被緩存,支持并行操作。Spark的一切都是基于RDD的。RDD就是Spark輸入的數據。
Spark應用程序在集群上以獨立進程集合的形式運行。如圖9-2所示,主程序(叫做Driver程序)中的SparkContext對象協調Spark應用程序。SparkContext對象首先連接到多種集群管理器(如:YARN),然后在集群節點上獲得Executor。SparkContext把應用代碼發給Executor,Executor負責應用程序的計算和數據存儲。
圖9-2 集群模式
每個應用程序都擁有自己的Executor。Executor為應用程序提供了一個隔離的運行環境,以Task的形式執行作業。對于Spark Shell來說,這個Driver就是與用戶交互的進程。
9.1.1 安裝Spark
近期的Spark版本是1.6.1。它可以運行在Windows或Linux機器上。運行 Spark 需要 Java JDK 1.7,CentOS 6.x 系統默認只安裝了 Java JRE,還需要安裝 Java JDK,并確保配置好 JAVA_HOME、PATH和CLASSPATH變量。此外,Spark 會用到 HDFS 與 YARN,因此讀者要先安裝好 Hadoop。我們可以從Spark官方網站spark.apache.org/downloads.html上下載Spark,如圖9-3所示。
圖9-3 下載安裝包
有幾種Package type,分別為:
l Source code:Spark 源碼,需要編譯才能使用。
l Pre-build with user-provided Hadoop:“Hadoop free”版,可應用到任意 Hadoop 版本。
l Pre-build for Hadoop 2.6 and later:基于 Hadoop 2.6 的預編譯版,需要與本機安裝的 Hadoop 版本對應。可選的還有 Hadoop 2.4 and later、Hadoop 2.3、Hadoop 1.x,以及 CDH 4。
本書選擇的是 Pre-build with user-provided Hadoop,簡單配置后可應用到任意 Hadoop 版本。下載后,執行如下命令進行安裝:
sudo tar -zxf spark-1.6.1-bin-without-hadoop.tgz -C /usr/local/
cd /usr/local
sudo mv ./spark-1.6.1-bin-without-hadoop/ ./spark
sudo chown -R hadoop:hadoop ./spark
9.1.2 配置Spark
安裝后,進入conf目錄,以spark-env.sh.template文件為模塊創建spark-env.sh文件,然后修改其配置信息,命令如下:
cd /usr/local/spark
cp ./conf/spark-env.sh.template ./conf/spark-env.sh
編輯 ./conf/spark-env.sh(vim ./conf/spark-env.sh),在文件的加上如下一行:
export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath
保存后,Spark 就可以啟動和運行了。在 ./examples/src/main 目錄下有一些 Spark 的示例程序,有 Scala、Java、Python、R 等語言的版本。我們可以先運行一個示例程序 SparkPi(即計算 π 的近似值),執行如下命令:
cd /usr/local/spark
./bin/run-example SparkPi
執行時會輸出非常多的運行信息,輸出結果不容易找到,可以通過 grep 命令進行過濾(命令中的 2>&1 可以將所有的信息都輸出到 stdout 中):
./bin/run-example SparkPi 2>&1 | grep "Pi is roughly"
過濾后的運行結果為 π 的 5 位小數近似值 。
9.2 Spark Shell
以前的統計和機器學習依賴于數據抽樣。從統計的角度來看,抽樣如果足夠隨機,其實可以很精準地反應全集的結果,但事實上往往很難做到隨機,所以通常做出來也會不準。現在大數據解決了這個問題,它不是通過優化抽樣的隨機來解決,而是通過全量數據來解決。要解決全量的數據就需要有強大的處理能力,Spark首先具備強大的處理能力,其次Spark Shell帶來了即席查詢。做算法的工程師,以前經常是在小數據集上跑個單機,然后看效果不錯,一到全量上,就可能和單機效果很不一樣。有了Spark后就不一樣了,尤其是有了Spark Shell。可以邊寫代碼,邊運行,邊看結果。Spark提供了很多的算法,最常用的是貝葉斯、word2vec、線性回歸等。作為算法工程師,或者大數據分析師,一定要學會用Spark Shell。
Spark Shell 提供了簡單的方式來學習 Spark API,也提供了交互的方式來分析數據。Spark Shell 支持 Scala 和 Python,本書選擇使用 Scala 來進行介紹。Scala集成了面向對象和函數語言的特性,并運行于Java 虛擬機之上,兼容現有的 Java 程序。Scala 是 Spark 的主要編程語言,如果僅僅是寫 Spark 應用,并非一定要用 Scala,用Java和Python都是可以的。使用 Scala 的優勢是開發效率更高,代碼更精簡,并且可以通過 Spark Shell 進行交互式實時查詢,方便排查問題。執行如下命令啟動 Spark Shell:
./bin/spark-shell
啟動成功后會有“scala >”的命令提示符。這表明已經成功啟動了Spark Shell。在 Spark Shell 啟動時,輸出日志的有這么幾條信息:
16/04/16 17:25:47 INFO repl.SparkILoop: Created spark context..
Spark context available as sc.
這些信息表明 SparkContext已經初始化好了,可通過對應的sc變量直接進行訪問。Spark 的主要抽象是分布式的數據集合RDD,它可被分發到集群各個節點上,進行并行操作。一個RDD可以通過 Hadoop InputFormats 創建(如 HDFS),或者從其他 RDDs轉化而來。下面我們從 ./README 文件新建一個 RDD,代碼如下:
scala>val textFile = sc.textFile("file:///usr/local/spark/README.md"
上述的sc是Spark創建的SparkContext,我們使用SparkContext對象加載本地文件README.md來創建RDD。輸出結果如下:
textFile: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[1] at textFile at :27
上述返回結果為一個MapPartitionsRDD文件。需要說明的是,加載HDFS文件和本地文件都是使用textFile ,區別在于前綴“hdfs://”為HDFS文件,而“file:// ”為本地文件。上述代碼中通過“file://”前綴指定讀取本地文件,直接返回MapPartitionsRDD。Spark Shell默認方式是讀取HDFS中的文件。從HDFS讀取的文件先轉換為HadoopRDD,然后隱式轉換成MapPartitionsRDD。
上面的例子使用Spark中的文本文件README.md創建一個RDD textFile,文件中包含了若干文本行。將該文本文件讀入RDD textFile時,其中的文本行將被分區,以便能夠分發到集群中并行化操作。我們可以想象,RDD有多個分區,每個分區上有多行的文本內容。RDDs 支持兩種類型的操作:
l actions:在數據集上運行計算后返回結果值。
l transformations:轉換。從現有RDD創建一個新的RDD。
下面我們演示count()和first()操作:
scala>textFile.count() // RDD 中的 item 數量,對于文本文件,就是總行數
輸出結果為:
res0: Long = 95
scala>textFile.first() // RDD 中的及時個 item,對于文本文件,就是及時行內容
輸出結果為:
res1: String = # Apache Spark
上面這兩個例子都是action的例子。接著演示 transformation,通過 filter transformation來篩選出包含 Spark 的行,返回一個新的RDD,代碼如下:
scala>val linesWithSpark = textFile.filter(line => line.contains("Spark"
scala>linesWithSpark.count() // 統計行數
上面的linesWithSpark RDD有多個分區,每個分區上只有包含了Spark的若干文本行。輸出結果為:
res4: Long = 17
上述結果表明一共有17行內容包含“Spark”,這與通過 Linux 命令 cat ./README.md | grep "Spark" -c 得到的結果一致,說明是正確的。action 和 transformation 可以用鏈式操作的方式結合使用,使代碼更為簡潔:
scala>textFile.filter(line => line.contains("Spark")).count() // 統計包含 Spark 的行數
RDD的actions和transformations可用在更復雜的計算中。例如,通過如下代碼可以找到包含單詞最多的那一行內容共有幾個單詞:
scala>textFile.map(line => line.split(" ").size).reduce((a, b) => if (a > b) a else b
輸出結果為:
res5: Int = 14
上述代碼將每一行文本內容使用split進行分詞,并統計分詞后的單詞數。將每一行內容map為一個整數,這將創建一個新的 RDD,并在這個 RDD 中執行reduce操作,找到較大的數。map()、reduce()中的參數是Scala的函數字面量(function literals),并且可以使用Scala/Java的庫。例如,通過使用 Math.max() 函數(需要導入Java的Math庫),可以使上述代碼更容易理解:
scala>import java.lang.Math
scala>textFile.map(line => line.split(" ").size).reduce((a, b) => Math.max(a, b
詞頻統計(WordCount)是Hadoop MapReduce的入門程序,Spark可以更容易地實現。首先結合flatMap、map和reduceKey來計算文件中每個單詞的詞頻:
scala>val wordCounts = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a b)
輸出結果為(string,int)類型的鍵值對ShuffledRDD。這是因為reduceByKey操作需要進行Shuffle操作,返回的是一個Shuffle形式的ShuffleRDD:
wordCounts: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[4] at reduceByKey at :29
然后使用collect聚合單詞計算結果:
scala>wordCounts.collect
輸出結果為:
res7: Array[(String, Int)] = Array((package,1), (For,2), (Programs,1), (processing,1), (Because,1), (The,1)...
Spark 支持將數據緩存在集群的內存緩存中,當數據需要反復訪問時這個特征非常有用。調用 cache(),就可以將數據集進行緩存:
scala>textFilter.cache
9.3 Spark編程
無論Windows或Linux操作系統,都是基于Eclipse或Idea構建開發環境,通過Java、Scala或Python語言進行開發。根據開發語言的不同,我們需要預先準備好JDK、Scala或Python環境,然后在Eclipse中下載安裝Scala或Python插件。
下面我們通過一個簡單的應用程序 SimpleApp 來演示如何通過 Spark API 編寫一個獨立應用程序。不同于使用Spark Shell自動初始化的SparkContext,獨立應用程序需要自己初始化一個SparkContext,將一個包含應用程序信息的SparkConf對象傳遞給SparkContext構造函數。對于獨立應用程序,使用 Scala 編寫的程序需要使用 sbt 進行編譯打包,相應地,Java 程序使用 Maven 編譯打包,而 Python 程序通過 spark-submit 直接提交。
在終端中執行如下命令,創建一個文件夾 sparkapp 作為應用程序根目錄:
cd ~ # 進入用戶主文件夾
mkdir ./sparkapp # 創建應用程序根目錄
mkdir -p ./sparkapp/src/main/scala # 創建所需的文件夾結構
9.3.1 編寫Spark API程序
在./sparkapp/src/main/scala下建立一個名為SimpleApp.scala 的文件(vim ./sparkapp/src/main/scala/SimpleApp.scala),添加代碼如下:
/ SimpleApp.scala /
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
object SimpleApp {
//使用關鍵字def聲明函數,必須為函數指定參數類型
def main(args: Array[String]) {
val logFile = "file:///usr/local/spark/README.md" // 一個本地文件
//創建SparkConf對象,該對象包含應用程序的信息
val conf = new SparkConf().setAppName("Simple Application"
//創建SparkContext對象,該對象可以訪問Spark集群
val sc = new SparkContext(conf
val logData = sc.textFile(logFile, 2).cache
//line=>line.contains(..)是匿名函數的定義,line是參數
val numAs = logData.filter(line => line.contains("a")).count
val numBs = logData.filter(line => line.contains("b")).count
println("Lines with a: %s, Lines with b: %s".format(numAs, numBs
}
}
上述程序計算 /usr/local/spark/README 文件中包含 “a” 的行數和包含 “b” 的行數。不同于 Spark Shell,獨立應用程序需要通過“val sc = new SparkContext(conf)”初始化 SparkContext,SparkContext 的參數 SparkConf 包含了應用程序的信息。
9.3.2 使用sbt編譯并打成jar包
該程序依賴 Spark API,因此我們需要通過sbt(或mvn)進行編譯打包。我們以sbt為例,創建一個包含應用程序代碼的jar包。在 ./sparkapp 中新建文件 simple.sbt(vim ./sparkapp/simple.sbt),添加如下內容,聲明該獨立應用程序的信息以及與 Spark 的依賴關系:
name := "Simple Project"
version := "1.0"
scalaVersion := "2.10.5"
libraryDependencies = "org.apache.spark" %% "spark-core" % "1.6.1"
文件 simple.sbt 需要指明Spark和Scala的版本。上述版本信息可以從Spark Shell獲得。我們啟動Spark Shell的過程中,當輸出到 Spark 的符號圖形時,可以看到相關的版本信息。
Spark中沒有自帶sbt,需要手動安裝sbt,我們選擇安裝在/usr/local/sbt中:
sudo mkdir /usr/local/sbt
sudo chown -R hadoop /usr/local/sbt # 此處的hadoop為你的用戶名
cd /usr/local/sbt
下載sbt后,拷貝至 /usr/local/sbt 中。接著在 /usr/local/sbt 中創建 sbt 腳本(vim ./sbt),添加如下內容:
#!/bin/bash
SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX: CMSClassUnloadingEnabled -XX:MaxPermSize=256M"
java $SBT_OPTS -jar `dirname
非常好,我很喜歡
好
價格很優惠,書更是好書,買書來當當是不二選擇。
剛到手,還沒來得及看,應該還可以吧!