在Ubuntu 16.04中安裝Hadoop

前言

因為工作上的需要,需要建置HBase當做資料儲存的空間,而這個同樣也是一個No-SQL資料庫。至於什麼是No-SQL DB,則不在此文章的範圍內,可以自行去查詢了解。

在本篇文章中,會教導該如何在Ubuntu 16.04中,將Hadoop與HBase架設起來。

前置環境

下面則是列出所需要的環境。

  • 一台乾淨且裝有Ubuntu 16.04的主機

安裝Hadoop

在本章節中,教導使用者們一步一步的安裝好Hadoop,可能在這裡會問:我只需要HBase,但是一定要安裝Hadoop嘛?答案是肯定的,因為HBase這個資料庫是相依於Hadoop,因此需要先安裝好Hadoop,才可以安裝HBase。

第一步:登入主機

首先先使用ssh登入到我們的主機


ssh user-name@ip-address-or-domain-name

第二步:建立hadoop使用者

在建立Hadoop之前,需要先建立一個名為hadoop使用者給Hadoop使用。先使用下面指令建立一個使用者。


sudo useradd -m hadoop -s /bin/bash


接著為這個hadoop使用者設置一個密碼,注意:密碼會需要輸入兩次來做確認


sudo passwd hadoop

為了增加目錄權限操作方便,我們將hadoop這個使用者設定有root權限可以使用,設定方式如下指令:


sudo adduser hadoop sudo


到這裡,就把Hadoop需要的使用者建立完成了,記得使用下面指令切換使用者再進行下一步!


su hadoop

第三步:更新鏡像來源並安裝JAVA環境

在Ubuntu底下,安裝任何的套件前,我們都會使用下面的指令先更新好鏡像來源網址。


sudo apt-get update

sudo apt-get install default-jdk default-jre

安裝好JAVA環境之後,可以使用下面的指令做測試:


java -version

如下圖所示:

第四步:設定JAVA環境執行路徑

在本步驟中,需要設定JAVA_HOME環境變數。

先編輯在家目錄下面的.bashrc檔案。


vim ~/.bashrc

接著加入路徑,注意:路徑有可能不同,需要自己設定正確的相對應路徑


export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin
# 設定後面所需要用到的Hadoop相關執行路徑

export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

設定完成之後,再執行source指令將此環境變數載入。


source ~/.bashrc

接著可以使用,whereis java與java -version這兩個指令做驗證。


whereis java

java -version

其結果如下圖所示:

第五步:安裝Hadoop

我們這邊選用的是2.8.5的版本,使用wget指令來進行下載壓縮檔。


wget http://apache.mirror.gtcomm.net/hadoop/common/hadoop-2.8.5/hadoop-2.8.5.tar.gz

第六步

  • 解壓縮Hadoop壓縮檔到/usr/local資料夾
  • 切換資料夾至/usr/local
  • 將資料夾名稱重新命名
  • 將/usr/local/hadoop切換權限給hadoop使用者

sudo tar -zxf ~/hadoop-2.8.5.tar.gz

cd /usr/local

sudo mv ~/hadoop-2.8.5/ ./hadoop

sudo chown -R hadoop /usr/local/hadoop

第七步:驗證Hadoop是否可以運行

下面指令可以幫助我們驗證hadoop是否可以正常運行


cd /usr/local/hadoop

./bin/hadoop version

如果可以成功運行的話,如下面截圖所示:

第八步:偽分佈式Hadoop

Hadoop允許可以使用兩個分離的process運行,意思就是一個當NameNode一個當DataNode,同時讀取的是HDFS文件。

要修改成此模式需要修改core-site.xml與hdfs-site.xml這兩個設定檔案。

Hadoop設定文件是以XML格式,每個設定的property都有起始與結尾標籤,在標籤裡面放置的是設定值。

先開啟,core-site.xml檔案。


cd /usr/local/hadoop

vim ./etc/hadoop/core-site.xml

接著在<configuration></configuration>標籤之間插入下面的值。


<property>
<name>hadoop.tmp.dir</name>
<value>file:///usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>

接著,修改hdfs-site.xml設定檔案


cd /usr/local/hadoop

vim ./etc/hadoop/hdfs-site.xml

一樣在<configuration>與</configuration>中加入:


<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///usr/local/hadoop/tmp/dfs/data</value>
</property>

設定完成後,接著就可以使用下面指令執行NameNode初始化。


cd /usr/local/hadoop

./bin/hdfs namenode -format

執行完成之後,可以注意到這兩行,若是一樣,則代表執行成功。

第九步:執行NameNode與DataNode process

使用下面的指令執行與啟動NameNode與DataNode process


cd /usr/local/hadoop

./sbin/start-dfs.sh

執行此process期間,會使用到ssh相關的登入,因次遇到yes就輸入yes。

遇到打密碼,就打hadoop使用者的密碼。

若在執行過程中出現「localhost: Error: JAVA_HOME is not set and could not be found.」等字樣,則需要在/usr/local/hadoop/etc/hadoop/hadoop-env.sh 底下設定JAVA_HOME環境變數


export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

設定完成之後,再執行一次:./sbin/start-dfs.sh就會成功了。其成功截圖畫面如下:

設定好之後,使用網路瀏覽器拜訪網址:http://ip-address-or-domain-name:50070,就可以看到運行的狀態頁面了。

第十步:啟動yarn

首先,先執行下面的指令,修改檔案名稱並進行mapred-site.xml編輯。


cd /usr/local/hadoop

mv ./etc/hadoop/mapred-site.xml.template ./etc/hadoop/mapred-site.xml

vim ./etc/hadoop/mapred-site.xml

接著在<configuration>與</configuration>中加入下面的設定標籤。


<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

接著設定yarn-site.xml設定檔。


cd /usr/local/hadoop

vim ./etc/hadoop/yarn-site.xml

在<configuration>與</configuration>標籤中加入下面的設定值。


<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

接著就可以啟動yarn了。當然,中間會打密碼執行。

執行下面指令來啟動,啟動完成之後,可以拜訪:http://ip-address-or-domain-name:8088/cluster來看目前所有的叢集(cluster)的狀態與資訊。


cd /usr/local/hadoop

./sbin/start-yarn.sh

# 啟動背景 web server 查看歷史運作紀錄

./sbin/mr-jobhistory-daemon.sh start historyserver

後記

  • 如果使用較低方案的VPS 方案做練習的話,會跑不起來,原因是因為RAM太小不夠。因此需要使用與這篇文章來設定swap來達到這個目的。
  • 有的時候ssh連線是使用非port number 22,因此需要使用到HADOOP_SSH_OPTS來設定port number。設定此環境變數在.bashrc檔案即可,記得使用source 重新載入此檔案。設定環境變數如下,22是我們可以修改的port number:
    export HADOOP_SSH_OPTS="-p 22"
    

參考資料

下一篇將介紹如何安裝:HBase

如何使用Nginx, Gunicorn與Supervisor 部署一個Flask App

前言

前陣子,因為隔壁組的關係,需要建置聊天機器人在外網,所以需要在外面的雲端平台上建置機器人的服務,這樣一來外面的人才可以存取到機器人,因為後端預測語意分析是用Python寫成的,為了要整合起來的便利,所以需要使用Python來建置後端與機器人。

因為Messenger機器人是透過Web後端進行存取與溝通,所以本篇文章是在教學,如何使用Nginx, gunicorn與supervisor 進行搭配,來部署一個Flask App

分別先講一下這四個工具每個的工作:

  1. Flask: 後端程式,一個Python web framework
  2. Nginx: 反向代理
  3. Gunicorn: 幫助我們部署Flask App
  4. Supervisor: 監控與控制Gnuicron的程序(process)
  5. inotify-tools: 監控當後端的code改變時會自動的更新

前置需要先已經設定的東西

  • 已經有一台虛擬私人主機(VPS, Virtual Private Server)
  • Ubuntu 16.04
  • 已經有網域並指向到這台主機的IP位址
  • Python3 (不用安裝,Ubnutu已經內建)

第一步:登入主機

首先,先登入主機。


ssh username@domain_or_ip_address

第二步:安裝Nginx

接著,要安裝好Nginx。


sudo apt-get update

sudo apt-get install nginx

第三步:安裝所需要用的套件


sudo apt-get install supervisor python-pip3 python3-virtualenv

  • supervisor套件先前已經提過,這裡就不在贅述
  • python-pip3 是用於Python3 的pip3 套件管理系統
  • python-virtualenv是用於Python2/Python3的虛擬環境,可以幫我們把Python環境獨立出來與系統環境分開

第四步:建立一個虛擬環境

因為我們的Flask App為了不要與系統環境污染,因此需要建立一個虛擬環境來做這件事情。因此我們建立一個虛擬環境,而名字叫做simple-bot,因為建置環境時,預設會使用Python2做建置環境的對象,所以要在後面指定要建立的Python設定檔。


virtualenv simple-bot --python=/usr/bin/python3

接著建立好環境之後,切換到simple-bot的環境,其指令如下


source ../simplebot/bin/activate

如果是使用Fish shell的話,要執行下面的指令來切換環境


source ../simplebot/bin/activate.fish

如果要離開這個的環境,這時候只需要執行下面的指令即可:


deactivate

寫一個Hello Flask App

下面是一個基本的Hello Flask App


from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
return "Hello World"

if __name__ == '__main__':
app.run(debug=True)

接著執行下面的app.py


python3 app.py

接著使用瀏覽器去拜訪:http://127.0.0.1:5000,接著就會看到下面的畫面了。

安裝Gunicorn

根據英文說法,這個Python3 套件是叫做:


Gunicorn ‘Green Unicorn’ is a Python WSGI HTTP Server for UNIX.

意思就是,用來在UNIX相關作業系統上做Python WSGI HTTP Server

利用下面的方式把Gunicorn安裝起來


pip3 install gunicorn

安裝Supervisor

這是一個允許在UNIX相關作業系統下,可以監控與控制一些指定的程序(processes)

使用前,要先安裝好這個名稱的套件。


sudo apt-get install supervisor

接著在 /etc/supervisor/conf.d/ 目錄下面建立一個叫做HelloBot.conf的設定檔案


[program:HelloBot]
directory=/home/username/hellobot
command=/home/username/hellobot/bin/gunicorn app:app -b 127.0.0.1:8000 --reload --max-requests 1 --access-logfile=- --error-logfile=-
autostart=true
autorestart=true
stderr_logfile=/var/log/HelloBot.err.log
stdout_logfile=/var/log/HelloBot.out.log

這邊來解釋一下,上面每一行的意義。

  1. 第一行的[program:HelloBot]是定義HelloBot這個要監控的程序名稱
  2. 第二行是定義工作目錄(working directory)
  3. 第三行是定義指令,要執行與監控的這個process程序
    這裡除了執行app.py程式起來之外,還有定義跑起來的port number以及需要reload
    還有定義access log 與 error log 是要抓STDOUT與STDERR的輸出。
  4. 第四行與第五行則是定義開機會自動起動。
  5. 倒數兩行則是定義stderr log與stdout log要放在哪一個檔案路徑裡面。

gunicorn所帶的–reload –max-requests 1這兩個參數可以讓gunicorn將程式碼自動更新。

設定好相對應檔案之後,接著執行下面的指令讓supervisor可以讀到新的程序設定檔。

以及為了要載入這個新的程式,必須要重啟supervisor服務。


sudo supervisorctl reread
sudo service supervisor restart

設定Nginx反向代理(reversed proxy)

所謂的反向代理,意思就是在server端上設定當server端收到某一個請求位址之後,可以透過這台server將所有請求導向給另一個真正可以處理這些請求參數服務的後端服務。

所以依照這個定義,則可以將我們上述的兩個東西結合在一起,就會變成:

  • Nginx當作反向代理的server
  • Flask App則是真正處理請求得後端服務

這樣的好處就是,使用者不知道後面是Flask App在做處理,只知道有Nginx的server存在。

從上述的設定檔得知,Flask App服務是跑在127.0.0.1:8000上面,因此我們需要按照下面的方式設定好我們所需要的反向代理設定。

用vim編輯器打開:/etc/nginx/sites-available/default的設定檔

打開之後,找到server區塊,並把下面這一行加進去。

若location /的區塊裡有try_files $uri $uri/ =404;也請記得要刪除。


location / {
proxy_pass http://127.0.0.1:8000;

}

接著檢查設定語法是否正確並重新啟動Nginx服務


sudo nginx -t

sudo service nginx restart

安裝inotify

因為有時候會改一些code讓後端程式變得跟之前不一樣,但是supervisor與Gunicorn並不知道程式碼有更動,因此為了要讓Gunicorn知道程式碼已經變動,所以我們要inotify-tools來幫助我們完成這件事情。使用這個之前,需要在Ubuntu上安裝inotify-tools套件


sudo apt-get update

sudo apt-get install inotify-tools

接著每當同一支程式已經有更新的時候,記得執行下面的指令:

sudo service supervisor restart

這樣就可以把新的程式真正的更新上去了!

結論

上面我們一共安裝了這一些的Python3 套件:


Flask==0.12.2
uwsgi==2.0.17.1
gunicorn==19.9.0
inotify==0.2.10

我們可以定義一個requirements.txt並使用pip3安裝就可以把全部的Python3 套件都安裝好!

我們就可以用下面的方式安裝起來。


pip3 install -r requirements.txt

參考資料

設定 CentOS 上的 MariaDB

前言

由於要使用爬蟲的關係,跟朋友借了一個 server 來存放資料使用 XD,雖然 PHP , Apache 與 MariaDB(MySQL) 已經幫我完整的安裝好了。不過需要自己設定以下則是設定的方法 :

  1. 查看 MariaDB 服務是否有啟動。
    service mariadb status
    

    沒有則自行啟動

    service mariadb restart
    
  2. 啟動完成後,登入 MariaDB ,使用者為:root 密碼為空。
    # 登入 MariaDB
    mysql -u root -p
    # 登入之後,輸入下面的 SQL 語法
    UPDATE mysql.user SET Password=PASSWORD('your-newpassword') where USER='root';
    FLUSH PRIVILEGES;
    quit
    
  3. 完成之後,重新啟動 MariaDB 服務
    service mariadb restart
    
  4. 執行 mysql_secure_installation 去做 MySQL 的安全性設定
    mysql_secure_installation
    
  5. 最後再重新啟動 MariaDB 服務

以上就是 MariaDB 的設定方法。

 

Free VPS的陷阱

上禮拜經過了Moder Web Conference 2015洗禮(? 認識蒼時大大,不亦樂乎?不過這都不是重點,重點是該考慮把專案從虛擬主機的方案轉移到VPS方案了,經過與他人討論和自行摸索之後,大概會使用DigitalOcean和Linode,不過在這之前,覺得想先找看看有沒有免費的VPS,後來找到了http://vpsheaven.com/free-vps-hosting/,內容介紹了許多可能是免費的VPS,在嘗試了一下之後,發現每一個根本不是這回事,除了GuHat(可以填妥申請單,不過還是依樣過了兩天,依舊沒消息…),其他的VPS不外乎就是先給你一個免費的虛擬主機方案(shared web hosting),接著如果要VPS,就要將某個連結推薦給朋友,這到底會不會成功還是個問號= =,再來就是限制地區問題,有些只限制在美國境內可以使用,而且還要通過電話認證,基本上填隨便一個國家地區是不會過的;接著,還有申請過之後,會跳一個彈跳視窗要請你寫問卷(survey),根本沒問卷,只有廣告(advertisement),最後還是呼籲,如果想從最簡單的開始,比如說之前在Web 技術台東有Day聚會中有提過,使用Lionfree,當滿足不了胃口的時候,先從VPS低價方案或Paas的試用開始吧,不要再想有免費的VPS,因為這條路是行不通的。