Amazon Ads

2015年5月30日 星期六

【筆記】在Ubuntu 14.04建立Hadoop多節點叢集-分散式架構(Multi-node cluster)

這裡使用的版本是2.6.0,之前有些設定如設定JAVA_HOME
或是ssh等,在Setting up a Single Node Cluster己經完成,若有撞牆的地方,可以回去參考一下。

在拜歐的cluster中,會有四台機器,分別為:
  • javakid01:做為master,會用它來跑NameNode和SecondaryNameNode
  • jkserver01:做為slaves,會用它來跑DataNode
  • jkserver02:做為slaves,會用它來跑DataNode
  • jkserver03:做為slaves,會用它來跑DataNode

若要改hostname,你可以這樣做:
sudo vi /etc/hostname
上列四台機器中,先確認已經安裝好Java和Hadoop。

先對javakid01(master),進行設定,在/etc/hosts中加入:
10.211.55.10    javakid01
10.211.55.7     jkserver01
10.211.55.13    jkserver02
10.211.55.14    jkserver03
再來編輯$HADOOP_INSTALL/etc/hadoop/core-site.xml加入下列設定:

        
                fs.defaultFS
                hdfs://javakid01:9000
        

接著編輯$HADOOP_INSTALL/etc/hadoop/hdfs-site.xml加入下列設定:

        
                dfs.replication
                3
        
        
                dfs.namenode.name.dir
                file:/opt/data/hadoop/hadoop_data/hdfs/namenode
        

上面設定好後,使用下列指令建立上列設定的目錄,建立前請確定有足夠的權限:
mkdir -p opt/data/hadoop/hadoop_data/hdfs/namenode
接著編輯$HADOOP_INSTALL/etc/hadoop/mapred-site.xml加入下列設定:

        
                mapred.job.tracker
                javakid01:54311
        

接著編輯$HADOOP_INSTALL/etc/hadoop/yarn-site.xml加入下列設定:


        
                yarn.nodemanager.aux-services
                mapreduce_shuffle
        
        
                yarn.nodemanager.aux-services.mapreduce.shuffle.class
                org.apache.hadoop.mapred.ShuffleHandler
        
        
                yarn.resourcemanager.resource-tracker.address
                javakid01:8025
        
        
                yarn.resourcemanager.scheduler.address
                javakid01:8030
        
        
                yarn.resourcemanager.address
                javakid01:8050
        

最後,在$HADOOP_INSTALL/etc/hadoop/slaves中加入做為DataNode的hostname
jkserver01
jkserver02
jkserver03
下面要開始對做為slaves的機器進行設定,其中jkserver01、jkserver02與jkserver03的設定幾乎是相同的。

一樣先在/etc/hosts中加入:
10.211.55.10    javakid01
10.211.55.7     jkserver01
10.211.55.13    jkserver02
10.211.55.14    jkserver03
請注意!上列的IP會因機器不同而有差異,這裡設定是以我的機器為例。

再來編輯$HADOOP_INSTALL/etc/hadoop/core-site.xml加入下列設定:

        
                fs.defaultFS
                hdfs://javakid01:9000
        

接著編輯$HADOOP_INSTALL/etc/hadoop/hdfs-site.xml加入下列設定:

        
                dfs.replication
                3
        
        
                dfs.datanode.data.dir
                file:/opt/data/hadoop/hadoop_data/hdfs/datanode
        

上面設定好後,使用下列指令建立上列設定的目錄,建立前請確定有足夠的權限:
mkdir -p opt/data/hadoop/hadoop_data/hdfs/datanode
接著編輯$HADOOP_INSTALL/etc/hadoop/mapred-site.xml加入下列設定:

        
                mapred.job.tracker
                javakid01:54311
        

接著編輯$HADOOP_INSTALL/etc/hadoop/yarn-site.xml加入下列設定:


        
                yarn.nodemanager.aux-services
                mapreduce_shuffle
        
        
                yarn.nodemanager.aux-services.mapreduce.shuffle.class
                org.apache.hadoop.mapred.ShuffleHandler
        
        
                yarn.resourcemanager.resource-tracker.address
                javakid01:8025
        
        
                yarn.resourcemanager.scheduler.address
                javakid01:8030
        
        
                yarn.resourcemanager.address
                javakid01:8050
        

最後,也要將讓DataNode知道slaves的設定。在$HADOOP_INSTALL/etc/hadoop/slaves中加入做為DataNode的hostname
jkserver01
jkserver02
jkserver03
接下來,為了讓master不用密碼就可登入slaves的話,需要進行SSH連線的設定。

回到javakid01這台機器,在終端機下執行:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
然後執行:
ssh-copy-id -i ~/.ssh/id_rsa.pub javakid@jkserver01
完成後,由javakid01登入jkserver01,第一次登入會需要在jkserver01上的使用者密碼:
ssh jkserver01
對jkserver02與jkserver03進行相同設定,在javakid01執行:
ssh-copy-id -i ~/.ssh/id_rsa.pub javakid@jkserver02
登入jkserver02:
ssh jkserver02
接著執行:
ssh-copy-id -i ~/.ssh/id_rsa.pub javakid@jkserver03
登入jkserver03:
ssh jkserver03
全部設定完成後,在javakid01執行下列指令對HDFS進行格式化:
hadoop namenode -format
接著啟動 HDFS Daemons:
$HADOOP_INSTALL/sbin/start-dfs.sh
成功啟動後,在javakid01執行jps指令:
jps
應該可以看到下列的結果:
27964 NameNode
28220 SecondaryNameNode
29695 Jps
再來若是到jkserver01、jkserver02或jkserver03任一台機器執行jps,應該可以看到下列結果:
2204 DataNode
2378 Jps
若在瀏覽器輸入http://javakid01:50070這個網址,應該在Datanodes這個頁籤看到三台機器的資訊:


2015年5月26日 星期二

【筆記】Hadoop名詞解釋

名詞意思備註
metricsHDFS與MapReduce daemon會收集一些與事件以及量測相關的資訊,這些總稱為metrics例如,datanode會收集已寫入的byte數、已複製的block總數等metrics
data locality optimization Hadoop在執行map task時,會盡全力將該task放到存放輸入該task資料的那台node去執行,以免使用到寶貴的頻寬進行資料的傳送
shuffle A proccess by which the system performs the sort and transfers the map outputs to the reducers as inputs.
speculative execution Hadoop doesn't try to diagnose and fix slow-running tasks; instead, it tries to detect when a task is running slower than expected and launches another equivalent task as a backup.

2015年5月5日 星期二

【分享】解決Java連Mongo DB時,出現no such cmd: saslStart錯誤

今天在使用Java連 Mongo DB時發生了一個錯誤,訊息如下:
Exception in thread "main" com.mongodb.CommandFailureException: { "serverUsed" : "192.168.55.12:22004" , "ok" : 0.0 , "errmsg" : "no such cmd: saslStart"}
我使用的 Java MongoDB Driver是 2.12.3而連線的Mongo DB版本是2.4.3。

使用的程式碼如下:
MongoCredential credential = MongoCredential.createPlainCredential("foo", "testDB", "bar".toCharArray());
MongoClient mongoClient = new MongoClient(new ServerAddress("192.168.55.12", 22004), Arrays.asList(credential));
DB db = mongoClient.getDB("testDB");
後來發現在使用MongoCredential.createPlainCredential這個方法時,在Mongo DB的2.6版本是才支援的,詳細可以參考文件內說明。

2015年4月28日 星期二

【分享】解決MacBook Pro 開機、關機變慢的問題

開機變慢


好像在上周更新過OS X Yosemite之後,開機就明顯變得很慢:


這裡無法確認更新是否為確切造成開機變慢的原因,只是剛好在此時間點後,狀況變得明顯。

一開始在網路上找到的解法,不外乎是「修復磁碟權限」、把不必要的「登入項目」關閉,或是清除桌面等,該試的都試過了,拜歐一開機等白蘋果出來前,還是要望著非常久的黑螢幕,想著為何會變這麼慢。

後來找到這串討論串:請問各位大哥 為什麼MBP 開機會變慢,六樓朋友的回應,解決了拜歐開機速度慢的問題。

拜歐是這樣做的,先到【系統徧好設定】,在下方倒收第二排有個【啟動磁碟】:


點進去後,在「請選擇要用來開機的系統」中,選擇要開機的硬碟後,再重新開機:


上面的做法解決了拜歐的問題,不禁猜想,會不會是兒子三不五時,找到機會就偷敲鍵盤造成設定跑掉的,XD

關機變慢


在Google上打了「macbook pro 關機變慢」的關鍵字,第一筆出現這一篇:解決升上Yosemite-OS X10.10關機速度慢的問題,這位樓主分享了一篇在Apple Support Communities上討論到Slow shutdown on Yosemite的問題。

這個提到MacBook Pro會變慢的原因,可能是有裝舊版本的Parallels Desktop,受其影響的關係,拜歐的MacBook Pro也有裝,心想,有可能是這個原因。

其解決方法提到,要到~/Library/LaunchAgents和~/Library/LaunchDaemons把有「parallels」字眼的檔案都清掉,在拜歐的電腦中只找到~/Library/LaunchAgents這個資料夾,而就索性把~/Library/LaunchAgents裡面的檔案全刪了,果然,關機就感覺有恢復跟原來一樣的速度,而Parallels Desktop也能正常運作。

請注意,這解決了拜歐的問題,不一定適用看倌您的情境,請在刪不知用途的檔案前,請三思而後行XDD

討論串中還有一位仁兄提到~/Library/Preferences這個資料夾中和「parallels」有關的檔案也要刪,這裡面的拜歐沒動,就不知道有沒有助益了。


2015年4月25日 星期六

【筆記】在PHP中太長的數字以科學符號(scientific notation)顯示的解決方案

寫過PHP的人一定遇到,過長的數字echo出來後,非所預期地以科學符號顯示的問題,如:
$f1 = 201504242111234; 
$f2 = 201504191213211;

echo $f1 . ',' . $f2;
一般預期的結果應該為:
201504242111234,201504191213211
但實際上,結果可能為:
2.0150424211123E+14,2.0150419121321E+14
這時若只是要在網頁上顯示所要的格式,可以使用printf(文件)這個方法,它的用法是:
int printf ( string $format [, mixed $args [, mixed $... ]] )
其中,第一個參數為要印出的格式設定,詳細說明可以參考這裡。

據此,可以把上面echo的這一行替換成下面程式:
printf('%.0f,%.0f', $f1, $f2);
這裡%.0f的意思是說,以浮點數的格式去顯示後面傳入的參數,在其中的0是指小數點後要顯示的位數為「0」。

另外,因為%.0f有兩個,後面要傳入對應的兩個浮點數。

有時,在一些情況下需要在程式中將兩個浮數數串在一起,好讓後面的程式使,這時就要使用到sprintf(文件)這個方法:
string sprintf ( string $format [, mixed $args [, mixed $... ]] )
從上面可以看到,它回傳的是一個字串,所以可以這樣使用:
$s1 = sprintf('%.0f', $f1);
$s2 = sprintf('%.0f', $f2);

$s3 = $s1 . ',' . $s2;

//$s3有可能有其他如做為SQL的運用
//這裡僅把它印出來
echo $s3;

【分享】學習正規表示式(Regular Expression)的資源

Regular Expression翻做中文為正規表示式,又稱正則表達式、正規表示法、正規運算式、規則運算式、常規表示法(wiki),在此拜歐習慣使用正規表示式這個翻譯,因為它唸起來最順,XD。

之前斷斷續續地涉略或鑽研正規表示式的用法,期間也找到一些在網路上覺得不錯的資源,因此在此記錄與分享。

OCPSoft


OCPSoft是一群喜好開放原始碼開發者的組織,在它的網站上找到兩篇講述Java和正規表示式的教學資源。

Guide to Regular Expressions in Java (Part 1)


Guide to Regular Expressions in Java (Part 2)