Howard的學習之路


  • Home

  • Archives

  • Tags

  • About

Hualos - 在Keras中動態監視training過程

Posted on 2017-12-28 |

Hualos - 在Keras中動態監視training過程

Keras本身就有提供callbacks機制,可以讓我們在training過程中,看到一些資訊。
這邊要教如何使用Hualos,讓我們在Web上看到training時的acc、loss等變化。

使用RemoteMonitor

我們可以直接用callbacks.RemoteMonitor()將training時的acc、loss、val_acc、val_loss,POST到我們的Server上。

1
2
3
4
from keras import callbacks
remote = callbacks.RemoteMonitor(root='http://localhost:9000')

model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epoch, validation_data=(X_test, Y_test), callbacks=[remote])

當然網頁要自己寫太麻煩了,這邊使用Hualos來替我們完成。

安裝Hualos所需套件

由於Hualos需要用到以下兩個Python套件,可以透過pip直接安裝

  • Flask
  • gevent
1
$ pip install flask gevent

下載Hualos

1
$ git clone https://github.com/fchollet/hualos.git

執行Hualos

1
$ python hualos/api.py

開啟瀏覽器,進入localhost:9000

Training

使用mnist為範例,完整程式碼如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop
from keras import callbacks

batch_size = 128
num_classes = 10
epochs = 20

(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(num_classes, activation='softmax'))

model.summary()

model.compile(loss='categorical_crossentropy',
optimizer=RMSprop(),
metrics=['accuracy'])

remote = callbacks.RemoteMonitor(root='http://localhost:9000')

model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test),
callbacks=[remote])

score = model.evaluate(x_test, y_test, verbose=0)

print('Test loss:', score[0])
print('Test accuracy:', score[1])

回到網頁就能即時看到training時的acc、loss、val_acc、val_loss。

參考

https://github.com/fchollet/hualos

Hyperas - 在Keras中自動選擇超參數

Posted on 2017-12-26 |

Hyperas - 在Keras中自動選擇超參數

deep learning做到後面都剩下調參數
而參數又不是那麼容易調整,是個廢力又廢時的工作
這邊將介紹透過Hyperas這個套件,自動選擇符合model最好的參數

安裝Hyperas

使用pip進行安裝

1
$ pip install hyperas

Import Hyperas

1
2
3
from hyperopt import Trials, STATUS_OK, tpe
from hyperas import optim
from hyperas.distributions import choice, uniform

Import Keras

1
2
3
4
5
6
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import RMSprop

from keras.datasets import mnist
from keras.utils import np_utils

之後我們會依序

  1. 定義Data
  2. 定義Model
  3. Optimize model hyperparameters

定義Data

使用MNIST的data

1
2
3
4
5
6
7
8
9
10
11
12
def data():
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(60000, 784)
X_test = X_test.reshape(10000, 784)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255
nb_classes = 10
Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_classes)
return X_train, Y_train, X_test, Y_test

定義Model

這邊除了定義Model外,還需完成training及testing,所以需把data傳進來
最後回傳一個dictionary,其中包含:

  • loss: Hyperas會去選擇最小值的model
  • status: 直接回傳STATUS_OK
  • model: 可不回傳(option)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def create_model(X_train, Y_train, X_test, Y_test):
model = Sequential()
model.add(Dense(512, input_shape=(784,)))
model.add(Activation('relu'))
model.add(Dropout({{uniform(0, 1)}}))
model.add(Dense({{choice([256, 512, 1024])}}))
model.add(Activation('relu'))
model.add(Dropout({{uniform(0, 1)}}))
model.add(Dense(10))
model.add(Activation('softmax'))

rms = RMSprop()
model.compile(loss='categorical_crossentropy', optimizer=rms, metrics=['accuracy'])

model.fit(X_train, Y_train,
batch_size={{choice([64, 128])}},
nb_epoch=1,
verbose=2,
validation_data=(X_test, Y_test))
score, acc = model.evaluate(X_test, Y_test, verbose=0)
print('Test accuracy:', acc)
return {'loss': -acc, 'status': STATUS_OK, 'model': model}

原本Dropout需要傳入一個0-1的機率
但我們這邊不直接指定一個數字
而是透過uniform幫我們產生一個0-1的數字

1
model.add(Dropout({{uniform(0, 1)}}))

Dense擇是透過choice
傳入我們要哪些值

1
model.add(Dense({{choice([256, 512, 1024])}}))

最後回傳的dictionary
我們目標是選擇最高的accuracy的model
但因為Huperas他會去選擇loss這個value 最小的 的model
所以將accuracy直接變 負號
再丟給loss

1
return {'loss': -acc, 'status': STATUS_OK, 'model': model}

Optimize model hyperparameters

最後透過optim.minimize()來找出最好的model

  • model: 我們定義的model
  • data: 我們定義的data
  • algo: 使用TPE algorithm
  • max_evals: evaluation次數
1
2
3
4
5
6
7
8
9
10
11
X_train, Y_train, X_test, Y_test = data()

best_run, best_model = optim.minimize(model=create_model,
data=data,
algo=tpe.suggest,
max_evals=5,
trials=Trials())

print("Evalutation of best performing model:")
print(best_model.evaluate(X_test, Y_test))
print(best_run)

optim.minimize()會回傳

  • best_run: 最好的參數組合
  • best_model: 最好的model

最後

  1. Hyperas好像跟註解很不合,在跑程式時需把註解都刪掉,以免發生錯誤
  2. 如果是使用jupyter notebook需在optim.minimize()多加入notebook_name這個參數且設定為ipynb的檔名,假如目前為Untitled.ipynb就設定為:
1
2
3
4
5
6
best_run, best_model = optim.minimize(model=create_model,
data=data,
algo=tpe.suggest,
max_evals=5,
trials=Trials(),
notebook_name='Untitled')

參考

https://github.com/maxpumperla/hyperas

FB Messenger Bot 建置教學

Posted on 2017-12-25 |

FB Messenger Bot 建置教學

此教學為建置一個FB粉絲團自動回化的機器人之環境

Facebook Developer的APP建立

既然是要寫這項功能自然就是要開啟FB開發者的功能
到https://developers.facebook.com/

點擊右上角的 「我的應用程式」 -> 「新增應用程式」

輸入名稱及選擇類別後就可以建立應用程式了
並在Messenger選項點選 「開始使用」

建立粉絲專頁存取權杖

選擇粉絲團及產生一組權杖 (pageAccessToken)

查看應用程式密鑰

點選左上角的主控版查看應用程式密鑰 (appSecret)

建立HTTP Server

這邊使用免費的虛擬主機 https://c9.io/
辦完帳號就能建立一個新的workspaces
輸入name,且一定要選 Public 的權限
Git clone的URL輸入 https://github.com/fbsamples/messenger-platform-samples.git
最後template選擇 Node.js

建立完成後在下方Terminal依序輸入下列指令

1
2
$ cd node/
$ npm install

成功時會看到產生了 node_modules 資料夾
這時開啟 node/config/default.json 這個檔案

1
2
3
4
5
6
{
"appSecret": "",
"pageAccessToken": "",
"validationToken": "",
"serverURL": ""
}
  • appSecret: 這邊填入應用程式密鑰
  • pageAccessToken: 粉絲專頁存取權杖
  • validationToken: 自己可以任意輸入,但要需要記住,等等下面會用到
  • serverURL: 輸入https:// 專案名稱 –帳號名稱 .c9users.io

完成後存檔並在下面Terminal輸入下列指令來啟動Server

1
$ node app.js

成功時會看到 「Node app is running on port 8080」

設定Webhooks

回到FB Developer的頁面,點擊右邊的 「設定Webhooks」

在回呼網址輸入https:// 專案名稱 –帳號名稱 .c9users.io/webhook
驗證權杖這邊輸入上面json裡 validationToken 的值
下面的訂閱欄位依自己需求勾選

儲存完後就可以選訂閱的粉絲團

測試Bot

到粉絲團頁面,選擇「更多」 -> 「以粉絲專頁訪客的身分檢視」
就可以傳送訊息給粉絲團了

看到Bot成功回你輸入的訊息就代表成功囉

客制化回話

主要修改app.js這檔案

  • 收到訊息的事件在 function receivedMessage(event)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*
* Message Event
*
* This event is called when a message is sent to your page. The 'message'
* object format can vary depending on the kind of message that was received.
* Read more at https://developers.facebook.com/docs/messenger-platform/webhook-reference/message-received
*
* For this example, we're going to echo any text that we get. If we get some
* special keywords ('button', 'generic', 'receipt'), then we'll send back
* examples of those bubbles to illustrate the special message bubbles we've
* created. If we receive a message with an attachment (image, video, audio),
* then we'll simply confirm that we've received the attachment.
*
*/
function receivedMessage(event) {
...
}
  • 傳送訊息的方法在 function sendTextMessage(recipientId, messageText)
1
2
3
4
5
6
7
/*
* Send a text message using the Send API.
*
*/
function sendTextMessage(recipientId, messageText) {
...
}

基本上只要用這兩個Function就能客制化自己的機器人囉~

參考

http://animabeautifullife.blogspot.tw/2016/06/facebook-messenger-api.html

緩衝區溢位原理

Posted on 2017-12-25 |

緩衝區溢位原理

目的

指的是利用程式的漏洞,向緩衝衝區寫入使溢位的值,可用來達到以下目的:

  • 程序破壞
  • 控制程式流程
  • 取得系統的控制權

以下將透過編寫簡單的程式,並輸入過長字串讓程序當掉,以了解緩衝區溢位的原理。

環境介紹

  • OS:Windows XP_x86 (SP3)
  • IDE:VC++ 6.0

事前準備及利用緩衝區漏洞

這裡以C寫一段存在緩衝區漏洞的程式

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <string.h>

char name[] = "HAO-WEI";

int main() {
char buffer[8];
strcpy(buffer, name);
printf("%s \n", buffer);

return 0;
}

這段程式是先宣告name變數資料型態為Char的陣列,並設值為”HAO-WEI”,
並在主程式中,宣告buffer變數一樣為Char的陣列的資料型態,設定與name變數相同長度,因為HAO-WEI後面還有一個’\0′
使用strcpy函數將name的字串複製給buffer,最後再輸出。

以上是有存在緩衝區溢位的程式碼,這邊思考一下,如果name的長度比8更長,或是buffer長度比8小,讓他真的發生緩衝區溢位,那麼會發生什麼事呢?
這邊將name內容設為HAO-WEIHAO-WEI,長度為15,並編譯執行

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <string.h>

char name[] = "HAO-WEI";

int main() {
char buffer[8];
strcpy(buffer, name);
printf("%s \n", buffer);

return 0;
}

程序雖然成功的輸出HAO-WEIHAO-WEI,但隨即就當掉了。
緩衝區不就只是滿了,為什麼會發生這樣的事情呢?

分析說明

要解釋這個問題時,先講解程式在執行時Stack運作原理
程式在直行時會有一塊記憶體是存放Stack的部分
當進入副程式時,系統會給予這副程式一塊可用記憶體,稱為Stack Frame(如下圖)

其中epb跟esp都是暫存器的值

  • epb表示Stack底端
  • esp表示Stack頂端

每一個Stack Frame都有屬於自己的esp跟ebp
所以只要把epb的值+4就可以拿到這個Function的變數2的值
epb的值+8也就可以拿到變數1的值
而最上面綠色那塊則是這Function可用的其他記憶體空間
另外也會把這個Function完成後
等等要執行下一個指令的位置寫到Return Address這裡
也會把呼叫這個Function的舊ebp保存起來
以供結束此Function能夠回復上一個Function的ebp
這樣Function一直不斷呼叫,記憶體不斷的往上疊,也不會亂掉,因為每個Function只需在意他自己的ebp跟esp

這邊用OllyDbg來進行動態分析,以了解程式的組合語言以及執行時的Stack變化

進入FUNCTION前

我們先把程式停在進入Main()這個Function前
另外也需特別注意下一個指令的位置00401699
結束完Main()時會繼續往這裡走,所以需要把這個位置寫到Stack中(等等下面圖片會看到)

1
00401694        CALL BufferOv.00401005 // 表示CALL Main()

以及他的Stack狀況

可以知道目前esp為0012FF88

進入FUNCTION後

觀察一下Stack狀態
就可以發現目前的esp變為0012FF24
而ebp為0012FF80 其值為0012FFC0(上一個Function的ebp)
而0012FF84(ebp + 4) 其值為00401699(為Main()執行完要回去的位置,也稱Return Address)
而這個Main()所用記憶體也就是0012FF24 ~ 0012FF7C這些空間

執行STRCPY前

我們來看一下Main()裡面寫到的strcpy這Function的C語言以及其對應組合語言的部分

1
strcpy(buffer, name);

strcpy的API

1
char * strcpy ( char * destination, const char * source );

可以知道他把”HAO-WEI”這些字串拷貝到[ebp – 8]也就是0012FF78這個位置上

執行STRCPY後

我們來看看0012FF78這個位置的值發生什麼變化

已經被填入”HAO-WEI”的字串了,看起來沒什麼問題
那如果是填入過長字串如”HAO-WEIHAO-WEI”會怎樣呢?我們來看看

結果發現0012FF84原本放Main()執行完要去的位置被覆寫掉了,變成00004945
意謂著等等結束Main()會跳到00004945位置繼續執行指令,而這個位置如果是空的,程式自然就會當掉,發生以下情形

很明顯的圖片上出現的0x00004945就是這個意思

最後

換個角度想,如果覆寫掉的這個位置是存在的,就樣是不是就能控制程式流程,隨心所欲的跳到想要的位置呢?

Spark與Flume之環境建置

Posted on 2017-12-25 |

Spark與Flume之環境建置

這篇教學會說明如何透過Flume來蒐集某一檔案的變化
將檔案變動的部分傳給Spark進行即時性的WordCount運算

什麼是Flume?

Flume是一個從可以收集例如日誌,事件等數據資源,並將這些數量龐大的數據從各項數據資源中集中起來存儲的工具與服務,或者數集中機制。

環境布建

Spark環境可參考我之前的文章來安裝

Flume安裝

下載可以到 http://flume.apache.org/download.html

這邊我使用apache-flume-1.7.0來進行安裝

一樣安裝到HOME目錄下

1
2
3
$ cd ~
$ wget http://apache.stu.edu.tw/flume/1.7.0/apache-flume-1.7.0-bin.tar.gz
$ tar zxvf apache-flume-1.7.0-bin.tar.gz

環境變數的部分使用vim ~/.bashrc來加入Flume的環境變數

1
2
export FLUME_HOME=~/apache-flume-1.7.0-bin
export PATH=$PATH:$FLUME_HOME/bin

使用下面指令來生效

1
$ source ~/.bashrc

輸入下面指令看看是否成功

1
$ flume-ng version

Flume Assembly

要藉由Flume把檔案變動的資料傳給Spark需要Spark Project External Flume Assembly的jar

所以可以到 http://mvnrepository.com/artifact/org.apache.spark/spark-streaming-flume-assembly_2.10

這邊我選擇2.1.0並且下載到Spark目錄裡的/jars裡

1
2
$ cd ~/spark-2.1.0-bin-hadoop2.7/jars
$ wget http://central.maven.org/maven2/org/apache/spark/spark-streaming-flume-assembly_2.10/2.1.0/spark-streaming-flume-assembly_2.10-2.1.0.jar

~/spark-2.1.0-bin-hadoop2.7/jars這是我的目錄,請依自己的目錄為準

Flume Configure

這邊主要是Flume要偵測哪一檔案的變化、及與Spark溝通port的相關設定

到剛剛下載並解壓縮完的Flume目錄下的/conf

使用vim wordcount.conf新增一個檔案並加入下面設定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
a1.channels = c1
a1.sinks = k1
a1.sources = r1

a1.sinks.k1.type = avro
a1.sinks.k1.channel = c1
a1.sinks.k1.hostname = localhost
a1.sinks.k1.port = 29999

a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /home/spark/test.txt
a1.sources.r1.channels = c1

a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

/home/spark/test.txt 這是我要偵測的檔案,請依照自己的檔案為準
a1.sinks.k1.port = 29999 則是等等要與Spark建立起溝通用的port

執行

Spark

這邊使用Spakr本身就用python寫好的WordCount程式
到Spark目錄下使用下面指令來執行

1
$ bin/spark-submit --jars jars/spark-streaming-flume-assembly_2.10-2.1.0.jar examples/src/main/python/streaming/flume_wordcount.py localhost 29999

Flume

到Flume目錄下使用下面指令來執行

1
$ bin/flume-ng agent --conf conf --conf-file ~/apache-flume-1.7.0-bin/conf/wordcount.conf --name a1 -Dflume.root.logger=INFO,console

更改檔案

Spark與Flume都執行起來後,就會看到Spark每1秒接收一次資料
我們對要偵測的檔案寫入一些字進去,看看Spark是否有接收到並執行WordCount

1
$ echo 'a b b c c c' >> /home/spark/test.txt

/home/spark/test.txt 這是我要偵測的檔案,請依照自己的檔案為準

這邊要注意的一點是需先執行Spark,接著再執行Flume

參考

https://kknews.cc/zh-tw/tech/nxn2ng.html

Standalone Mode的佈建 二

Posted on 2017-12-25 |

Standalone Mode的佈建 二

上一篇會發現我需要一一到Master與各個Slave中進行開啟的動作
今天電腦數量少還沒問題,但萬一數量多就不方便了
所以這篇要教的是如何只需啟動Master就能把Standalone的環境一次佈建好
其實概念很簡單,就是Master會自己透過SSH一一到各個Slave中進行啟動的動作

環境介紹

這邊一樣,有三台電腦分別為:

Hostname Username IP
Master spark 192.168.2.101
Slave1 spark 192.168.2.102
Slave2 spark 192.168.2.103

基本上Username都要取一樣以及Spark放的路徑也要一樣
目標一樣是在Slave1跟Slave2上建立起Worker Node

環境設定

Hostname設定

在Master與所有Slave的/etc/hosts加入各Hostname與IP對應,如下

要知道是否成功,可以在Master直接ping測試,如下

1
$ ping Slave1

ping Slave1就等於ping 192.168.2.102

SSH免密碼登入設定

先安裝SSH

1
$ apt-get install openssh-server

一般要SSH連線都需要密碼,但其實可以透過建立起SSH public/private keys來進行免密碼登入
假設我想在A電腦免密碼登入B電腦,就先在A電腦產生public/private keys
並將A電腦的public key放到B電腦的~/.ssh/authorized_keys裡
A電腦就能不需要密碼直接登入B電腦了

所以我們要做的是在Master產生SSH public/private keys
並透過ssh-copy-id指令將Master的public key複製到各個Slave的

~/.ssh/authorized_keys檔案裡,做法如下

1
2
3
$ ssh-keygen -t rsa
$ ssh-copy-id -i ~/.ssh/id_rsa.pub spark@Slave1
$ ssh-copy-id -i ~/.ssh/id_rsa.pub spark@Slave2

在下ssh-keygen -t rsa指令時,它會要求一堆資訊直接按Enter到底就行了

在Master輸入完上面指令後,來測試一下是否免密碼登入

1
$ ssh spark@Slave1

配置Worker Node

來到Master下,先到Spark目錄下的/conf

複製slaves.template一份為slaves

1
$ cp slaves.template slaves

修改slaves檔案,把要當作Worker Node的Hostname加進去,如下

把這份檔案複製給各個Slave的Spark目錄下/conf

1
2
$ scp -r slaves spark@Slave1:~/spark-2.1.0-bin-hadoop2.7/conf
$ scp -r slaves spark@Slave2:~/spark-2.1.0-bin-hadoop2.7/conf

執行Standalone

最後,直接在Master的Spark目錄/sbin下

1
$ ./start-all.sh

如果要結束就輸入下面指令

1
$ ./stop-all.sh

一樣到瀏覽器Master_IP:8080就會看到Slave1與Slave2已經當作Worker Node加進來了

Standalone Mode的佈建 一

Posted on 2017-12-25 |

Standalone Mode的佈建 一

Cluster群集介紹

Spark可以建立群集來跨資源分配,基本上有三種模式可以選擇:

  • Standalone
  • Apache Mesos
  • Hadoop YARN

這邊以Standalone來介紹如何建立環境

環境介紹

這邊有三台電腦分別為:

Hostname IP
Master 192.168.2.101
Slave1 192.168.2.102
Slave2 192.168.2.103

環境設定

Master設定

到Spark目錄下的/sbin執行下面指令

1
$ ./start-master.sh --host [Master_IP]

以我的例子,Master_IP就是192.168.2.101

執行完後,Master的位置會在192.168.2.101:7077(預設port)
在瀏覽器輸入Master_IP:8080,就會看到下面畫面

Slave設定

分別在每個Slave上建立起Worker Node
所以到各個Slave輸入下列指令

1
$ ./start-slave.sh spark://[Master_IP]:7077

將Slave1、Slave2都加進來後會看到下面畫面

執行Application

Spark-Shell

一樣到Spark目錄下的/bin執行之前所使用的Spark-Shell
但比較不一樣的,這次要指定Master

1
$ spark-shell --master spark://[Master_IP]:7077

PI迭代計算

這邊我們實際玩個例子
可以來跑一下官方自帶的Example Code
以python所寫的迭代計算PI
到Spark目錄下的/examples/src/main/python
執行下面指令,來迭代10次算出PI

1
$ spark-submit --master spark://[Master_IP]:7077 pi.py 10

結束Standlaone Mode

到Spark目錄下的/sbin執行下面指令

1
$ ./stop-all.sh

參考

http://spark.apache.org/docs/latest/spark-standalone.html

Spark環境快速安裝

Posted on 2017-12-25 |

Spark環境快速安裝

先介紹一下我佈署的環境:

  • Ubuntu 16.04 LTS
  • Java 8
  • Scala 2.12.1
  • Spark 2.1.0
  • Hadoop 2.7

佈建Spark環境之前,需要先裝Java、Scala

下面會一步一步教如何安裝

教學最後我也寫了一個Script來幫助自動安裝

Java環境安裝

1
2
3
4
$ add-apt-repository ppa:webupd8team/java
$ apt-get update
$ apt-get install -y oracle-java8-installer
$ apt-get install -y oracle-java8-set-default

Scala環境安裝

因為我想裝在HOME目錄,所以cd到HOME目錄,這邊可以依照自行決定下載路徑

1
2
3
$ cd ~
$ wget http://downloads.lightbend.com/scala/2.12.1/scala-2.12.1.tgz
$ tar -xzvf scala-2.12.1.tgz

Spark + Hadoop環境安裝

基本上可以到官方網站http://spark.apache.org/downloads.html

選擇你要的版本,這邊我是選spark-2.1.0-bin-hadoop2.7來做下載

我還是將它放到HOME目錄底下

1
2
3
$ cd ~
$ wget http://d3kbcqa49mib13.cloudfront.net/spark-2.1.0-bin-hadoop2.7.tgz
$ tar -xzvf spark-2.1.0-bin-hadoop2.7.tgz

環境變數

到這裡該下載的都完成了,再來就是設定環境變數

主要是編輯~/.bashrc這個檔案,在裡面新增下列指令

這邊要注意的一點是,SPARK_HOME與SCALA_HOME這邊是我剛剛下載的路徑,所以請按照自己環境設定

而JAVA_HOME一般來講是不用動的

1
2
3
4
export SPARK_HOME=~/spark-2.1.0-bin-hadoop2.7
export SCALA_HOME=~/scala-2.12.1
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export PATH=$SCALA_HOME/bin:$SPARK_HOME/bin:$JAVA_HOME/bin:$PATH

加入上列4條環境變數後,就可執行下面指令來生效

1
$ source ~/.bashrc

執行Spark

最後一步就是執行Spark看看是否成功

到Spark目錄下的/bin執行下面指令

1
$ spark-shell

看到下面結果就表示成功囉

自動安裝

在新的環境直接跑下面指令

1
$ wget https://raw.githubusercontent.com/aswergbh888/Spark/master/Install/SparkInstaller.sh -O - | sh

Spark會安裝在HOME目錄,所以要執行spark-shell就輸入下面指令

1
$ ~/spark-2.1.0-bin-hadoop2.7/bin/spark-shell
Howard Chang

Howard Chang

God helps those who help themselves.

8 posts
4 tags
GitHub E-Mail Facebook
© 2017 Howard Chang
Powered by Hexo
Theme - NexT.Gemini