2012年11月26日 星期一

TaskTracker send heartbeat cases

 可以看到TaskTracker中對於 heartbeat傳送時機有兩種


TaskTracker.java
...
private long getHeartbeatInterval(int numFinishedTasks) {
    return (heartbeatInterval / (numFinishedTasks * oobHeartbeatDamper + 1));
  }

...

heartbeatInterval預設是 HEARTBEAT_INTERVAL_MIN 為 3*1000 ms = 3sec
numFinishedTasks是此TaskTracker目前完成的Task數量
oobHeartbeatDamper是預設1000,000

也就是說getHeartbeatInterval(int numFinishedTasks)回傳的值是:
1. 當TaskTracker尚未完成任何task >>> 3000/(0*1000,000+1) = 3000ms = 3sec
    即3sec才傳一次heartbeat

2. 當TaskTracker完成一個以上task時 >>> 3000/(1*1000,000+1) = 0.00299 = 0sec
    即馬上傳一次heartbeat告知JobTracker有task完成

2012年11月12日 星期一

Ubuntu 網路速度限制

當需要去限制Ubuntu的網路其 上傳/下載 的速度時
可透過 Wondershaper 這個工具


安裝:
  sudo apt-get install wondershaper

使用:
  sudo wondershaper  [link type]   [download speed(kbps)]  [upload speed(kbps)]
  ex:
    sudo wondershaper eth0 512 64

    這樣 eth0的網路連線  下載速度上限就為512Kbps  上傳速度上限為 64 Kbps


[Reference]
Wondershaper流量監控工具
[分享] 在面板顯示上傳下載流量 [論壇 - Ubuntu基本設定]

2012年10月31日 星期三

java.lang.NullPointerException 問題

在開發大型程式時, 經常會用到物件導向的概念,
但有時會不小心忘了使用到一個"尚未存在的物件",  存取使用其物件所屬類別的函式,
就會造成
java.lang.NullPointerException 的問題

ex:
...
Job job;
job.setconf(); //setconf() 為Job class中的一個函式
...

就會有問題
因為實際上 Job job; 只是宣告了一個是宣告了一個Job type的變數

應該要宣告出一個實際的物件, 才能去使用其函式

...
Job job = new Job();
job.setconf();
...


[Note] 所以當發生java.lang.NullPointerException此問題時, 可以去檢查一下是否有物件尚未被new出來

2012年9月30日 星期日

Reduce Task assign 時機

在Hadoop中, Reduce task 並非等到所有 Map task 做完才被assign下去做,
預設:

JobInProgress.java
...
public synchronized Task obtainNewReduceTask(TaskTrackerStatus tts, int clusterSize,
int numUniqueHosts) throws IOException {
...
if (!scheduleReduces()) {
      return null;
    }
...
}
...
public synchronized boolean scheduleReduces() {
    return finishedMapTasks >= completedMapsForReduceSlowstart;
  }

completedMapsForReduceSlowstart
=(預設DEFAULT_COMPLETED_MAPS_PERCENT_FOR_REDUCE_SLOWSTART)*numMapTasks
= 0.05*這個job的map task 數量

目的:Ensure we have sufficient map outputs ready to shuffle before scheduling reduces

...............................................................................................................
舉例來說, 假設此Job有 40 map tasks, 1 reduce task
則此Job的completedMapsForReduceSlowstart = 0.05*40=2

及表示這個Job至少必須完成 2 個map tasks, 才可以assign reduce task

2012年6月18日 星期一

task complete percent

在執行hadoop job時, 可以從管理的網頁觀察到 job 運行的狀態,
亦可觀察到job中的 task 運作的情況,
如下圖
好奇的是, 每個 task 的"Complete"的%數是怎麼來的

簡單去查看了一下jobtasks.jsp source code,
發現他是用到 Hadoop API 中的 TaskReports 這個class裡面的 getProgress()

getProgress() 是以 0~1 表現task完成度
所以 jobtasks.jsp 中在

--------
...
for (int i = start_index ; i < end_index; i++) {
          TaskReport report = reports[i];
          out.print("<tr><td><a href=\"taskdetails.jsp?tipid=" +
            report.getTaskID() + "\">"  + report.getTaskID() + "</a></td>");
         out.print("<td>" + StringUtils.formatPercent(report.getProgress(),2) +
                   ServletUtil.percentageGraph(report.getProgress() * 100f, 80) + "</td>");
...
----------

乘上100來便於觀測完成的%數

2012年6月17日 星期日

VirtualBox Screen Size adjusting

VirtualBox的VM視窗大小可拖拉視窗邊緣來調整,
但有時會當解析度太大時會造成VM視窗無法涵蓋整個VM裡頭原有的螢幕大小,
導致操作不便, 如下

此時可透過去調整VM OS的解析度來解決VMS1
找到顯示器的選項
解析度調整為800X600
保留組態並關閉顯示器的設定
完成後的VM視窗比例,含括了整個VM內部OS的視窗, 相較下操作性更為便利

2012年6月10日 星期日

ignore the yes/no checking while ssh connect first time

[Problem]
當每回第一次連線到一個新的ip/host時總會產生以下的訊息:

user@host:$ ssh 192.168.1.1
The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established.
ECDSA key fingerprint is c7:16:8b:55:c8:39:24:5a:db:cd:e9:79:8c:24:59:39.
Are you sure you want to continue connecting (yes/no)?

此時就又必須在輸入一次" yes"才會完成連線

那假若不想輸入yes就直接連線進去可用以下方法

[Method]
在 ~/.ssh/ 中新創一份檔案叫 config
然後在config中加入

    Host 192.168.1.1
        StrictHostKeyChecking no
        UserKnownHostsFile=/dev/null

儲存.

而之後若是第一次作ssh連線到192.168.1.1的host時,
就不會在出現以上的訊息, 也不用在輸入yes就可直接進入連線


[Note]
適用情況之一:
假設像是hadoop這種大規模數量的node建置時,
master必須先把authorized_keys scp給每個slave, 但手動每次的scp太花費時間,
當寫成shell script時又會卡在上述問題的詢問上,
此時就可先在master的~/.ssh/config 上利用Method加入所有slave

2012年6月6日 星期三

hadoop管理網頁的修改

有時單純輸出log檔然後再去收集觀察不一定方便
有空再來研究一下如何去修改監測jobtracker及namenode兩個網頁

[Reference]
Hadoop 網頁管理介面樣板修改的可能性?

VirtualBox install on ubuntu

VirualBox 要安裝在 ubuntu上非常簡單

[Version]
Ubuntu 12.04
VirtualBox

[Steps]
1. Download VirtualBox package
2. sudo apt-get install dkms
3. sudo dpkg -i VirtualBox-3.2_4.1.16_Ubuntu_karmic_i386.deb
4. 要開啟virtualbox也很簡單, 只要在terminal上執行 virtualbox
    就會開啟圖形介面

[Reference]
https://www.virtualbox.org/manual/ch02.html#idp12629648

Virtualbox-Build multiple VMs cross mutiple physical servers

[Motivation]
當想模擬數十台甚至數百台VM所組成的cluster時, 單一實體server會受限於cpu數量以及memory大小, 而無法建立如此多台VM, 所以必須跨連到其他實體的servers, 此時VM又該如何佈署及設置網路?

[Virtual Machine]
本篇使用的是VirtualBox4.1

[Physical Machine]
HP ProLiant DL380 G6 (2core, 20G mem, 500G hd ) X 3
各自OS為 Ubuntu 12.04

[Method]
1. Install virtualbox at each physical servers   在各個server上安裝virtualbox
    參考:http://lifenote332.blogspot.tw/2012/06/virtualbox-install-on-ubuntu.html

2. Start Virtualbox and Create a new VM   新增一個新VM
    a. 設定[名稱], 選擇[作業系統]及[版本]
        (在此的名稱與VM內的OS完全沒關, 只是Virtualbox辨識用)
    b. 設定[記憶體大小] (在這設1G)
    c. 啟動硬碟-->選擇[新建硬碟]
    d. 檔案類型-->選擇[VDI]
    e. 存放裝置選擇詳細資料-->選擇[動態配置]
    f. 虛擬磁碟檔案位置-->選擇(即將創造的vdi檔的存放位置), 大小-->選擇(在此設成50G)
    g. 完成建立

3. Set two network interface cards for the VM   給予此VM兩張網卡
    a. NAT(Network Address Translation):
        概念:模擬自身就是本台實體server(Host OS), 以便對外連線, 但會使得實體server無法偵測到自己(此VM即Guest OS), 也因此無法連線到其他實體server上的VM
        功用:便利此VM上網作些更新或下載的動作
       
    b. Bridge
        概念:模擬自身與本台實體server(Host OS)存在於同一個Hob or Router底下,使得實體server能偵測得到自己, 因此在其他實體server上的VM也同樣的設定下, 可偵測到彼此
        功用:讓VM不僅可在本台實體server上互連, 也可與其他台實體server上的VM互連
       

4. Install OS and set network configuration on the VM   安裝OS及設定網路
     a. 在此安裝linux OS(Ubuntu 11.10)
     b. 網路設定的部份, 選擇[編輯連線], 因為先前給予了兩張網卡所以會有兩個連線, 而連線對映的設置應為:
         I.  裝置的MAC Address : (eth0) 即為給予的NAT網卡 --> IPv4設定 :自動(DHCP)
         II. 裝置的MAC Address : (eth1) 即為給予的Bridge網卡 --> IPv4設定 :手動(manual)
             address : 192.168.X.X(X表示自行設置, 在此設成192.168.123.1)
             mask:      255.255.X.X(在此設成255.255.255.0)
             gateway:  192.168.X.254(在此設成192.168.123.254, 網路上似乎常用254)
             DNS server: (同gateway)

5. Clone VDI   複製vdi
    當一個VM建好時, 他所有的設定都包成了一個vdi檔, 當然也可以複製此vdi來開啟另一個新的VM, 使其具備與原始的VM有同樣的設定, 但無法直接複製, 必須透過VirtualBox上的指令
    a. 執行:vboxmanage clonvdi old.vdi new.vdi
        便會產生新的vdi來開啟新的VM
    b. 執行:vboxmanage internalcommands sethduuid new.vdi
        因為有可能新舊兩個VM的uuid重複導致Virtualbox無法去開啟, 所以需在給new.vdi一個隨機的新uuid

6. Deploy new VM    開始佈署VM
    複製好的vdi, 可在本機開啟成新的VM, 亦可透過scp傳給其他台實體server 來開啟新的VM
    a. 再次實行2. , 只是到2. c.時, 選擇[使用現有硬碟], 然後選取要使用的vdi檔
        (因為在"啟動硬碟"此步驟時, virtualbox會建立一個新VM的資料夾, 我習慣先把要開啟的vdi檔先移到此然後在選取開啟, 這樣新VM的資料夾就對應新vdi, 比較方便管理)
    b. 執行3.
    c. 執行4. , 但不用在裝OS(因為已經有了), 只需調整網卡的部份及IP
        (IP一樣設成192.168.X.X)
    d. 修改hostname, 執行:sudo gedit /etc/hostname  修改完要重開VM
        (不要跟其他VM重複, 自己容易辨識的就行)

    重複5., 6. 即可佈署大量的VM

[Recommendation]
A. 假設想要所有VM都裝一些相同套件(ex. hadoop and Java)或設定, 可在一開始建第一個VM就都先下載安裝好, 如此複製此VM所產生的vdi也會具有相同的套件安裝

B. 想建立ssh免密碼連線, 可以先在第一台VM做好自己連自己的免密碼

C. 若想建立一個大型互連的cluster, 在host設定上為了減少麻煩, 可在第一台VM先設置好
    /etc/hosts, 將想要互連的host全部設進去, 之後的VM建立就不用在一個個去修改hosts

D. 當每次新建好一個VM時(就是網卡及hostname等全部設好),
    1. 先ssh 到先前已經建好的VM, 若OK則表示Bridge設置沒問題
    2. 然後開啟網頁瀏覽器, 若能正常開啟連外網頁, 則表示NAT沒問題

[延伸]
X. 曾經想過, 若VMs分佈在很多台physical machines上時, 控管每個VM要不斷轉換去使用各個physical machine, 這樣顯得很麻煩, 後來有找到一套軟體可以在單一一台server上就可去連到各個physical machine上的VM,  叫做"RemoteBox",  不過在嘗試使用下, 雖確實可以連到各台的VMs, 但卻無法開啟該VM的視窗畫面, 這點尚未突破

RemoteBox官網:
remotebox.knobgoblin.org.uk/downloads.cgi

[Reference]
多台實體machine建VM hadoop cluster
http://changyy.pixnet.net/blog/post/25612440-%5Blinux%5D-%E5%AE%89%E8%A3%9D-hadoop-0.20.1-multi-node-cluster-@-ubuntu-9.1

remotebox相關介紹
http://www.openfoundry.org/index.php?option=com_content&task=view&id=8319&Itemid=40

vboxmanage 指令doc
http://www.virtualbox.org/manual/ch08.html#vboxmanage-clonevm

vboxmanage clonevdi指令介紹
http://lbt95.pixnet.net/blog/post/30970746-%5Bvirtualbox%5D-%E4%BD%BF%E7%94%A8vboxmanage-%E8%A4%87%E8%A3%BD%E5%87%BA%E7%AC%AC%E4%BA%8C%E5%80%8B%E4%BD%9C%E6%A5%AD%E7%B3%BB%E7%B5%B1

virtualbox 網卡type介紹
http://www.wretch.cc/blog/mk99/22949462

2012年5月29日 星期二

fair scheduler中的comparator

Hadoop中的 fair scheduler在assign task時,
會先對所有的jobs做sort再去挑選哪個job可以assign task,
而在sort中的任兩個elements 比較用的comparator程式碼小複雜, 概念簡述如下:

1. 先比較誰有滿足minshare
    a. 滿足的, 相對assign的優先權較低
    b. 若兩者皆不滿足 --> 誰的越接近滿足minshare比例的, 相對assign的優先權較低
    c. 若兩者皆已滿足minshare --> 誰的weight值越小, 相對assign的優先權較低
2. 若以上都相等, 比較 start time(再不簡述行就比job name)

註:
當 c. 中兩者weight都一樣時, 就是比兩者目前的running tasks數,
在此也就是Hadoop提出之fair scheduler的想法:
1. 先滿足min share
2. 再滿足fair share

[Reference]
Hadoop-0.21.0公平调度器算法分析

2012年5月20日 星期日

Virtualbox的VM開多cpu

想要在Virtualbox上已經建好設定好的VM(其實新開的也一樣), 增加大於一顆的cpu數量時,
發現無法開啟, 並出現以下錯誤:

開啟虛擬機器 hdp1master 的工作階段失敗。

VT-x features locked or unavailable in MSR. (VERR_VMX_MSR_LOCKED_OR_DISABLED).

結果碼(&N): NS_ERROR_FAILURE (0x80004005)
元件: Console
介面: IConsole {1968b7d3-e3bf-4ceb-99e0-cb7c913317bb}

重新於設定處去觀察, (設定值 > 系統 > 處理器)
會發現當cpu數量調成2顆以上時,
底下會有個警示說"未偵測到最佳值",
並且訊息顯示" 控制在虛擬機器中的虛擬CPU數, 您需要在您的主機系統支援硬體虛擬化以使用一個以上的CPU"

上網去找解:
1.  執行 sudo /etc/init.d/vboxdrv setup
     重開virtualbox再去調cpu數時, 不再有"未偵測到最佳值"的警訊
     但仍有錯誤訊息.

     [Reference]
     http://www.ubuntu-tw.org/modules/newbb/viewtopic.php?post_id=88236

2. 後來發現主機要重新去調整Bios, 開啟CPU的虛擬功能(前提是本身主機板有提供此能力)
    以自己電腦為例,
    按delete 進Bios後 > 進階 > 監控 > CPU > Intel 虛擬化技術 > (原本關閉) 開啟
    然後再進作業系統重新開啟virtualbox 後就可以了!

    [Reference]
    http://ckwsteven.pixnet.net/blog/post/29109830-virtualb    o%8C%AF%E8%AA%A4%E8%A8%8A%E6%81%AF-vt-x-features-locked-or-unavailable-i

Hangs when exiting ssh

在寫shell script檔時,有時會希望ssh到另一台叫他做事,
此時希望自己離開繼續執行下面未完的shell script, 而那一台繼續做事,
過往用 & 作背景處理的方式以不管用

ex: 連到adalab 然後要他 sleep 20sec, 而自己要能馬上離開作其他事例如pwd
ssh hdp1@adalab <<EOI
sleep20 &
exit
EOI
pwd

此時必須改成:
ssh hdp1@adalab <<EOI
sleep 20 </dev/null> /dev/null 2>&1 &
EOI
pwd

就完成了~

[Reference]
http://www.openssh.org/faq.html#3.10

2012年5月17日 星期四

hostname 修改

hostname修改只要去 /etc/hostname 裡面作修改,
除存後重開機就行了

2012年5月13日 星期日

ECDSA host key for 'XXX' differs from the key for the IP address

之前在使用 ssh時碰到類似以下的問題: 
 
Warning: the ECDSA host key for 'XXX' differs from the key for the IP address 'XXX'
Offending key for IP in /home/hadoop/.ssh/known_hosts:5
Matching host key in /home/hadoop/.ssh/known_hosts:7
Are you sure you want to continue connecting (yes/no)?
 
後來想到因為本機曾經連到過叫hdp2的vm, 但後來hdp2這個vm又重新創造過, 
所以其實算是不同的機器, 但在本機的/home/hadoop/.ssh/known_hosts紀錄的是舊的hdp2資訊, 
與現在連線的hdp2衝突,所以每次連線都在問是否要繼續連線.
 
解決方式:
/home/hadoop/.ssh/known_hosts刪掉,
重新ssh到hdp2時他就會問你要不要establish, yes後, 
他似乎會在重建一個known_hosts
下次就不會在出現這個warning了 
 
[Reference] 
http://security.stackexchange.com/questions/10532/ecdsa-keys-changed-ssh-insecure-now

2012年4月25日 星期三

background execution

有時候會想不要等到第一個指令做完才執行第二個指令,
就必須讓第一個指令變成在backgroud 做,
方法很簡單, 只要在指令後面加上 就行了,

Example:
$ bin/hadoop jar  hadoop-examples-<version>.jar grep input output 'g'

此時這個hadoop job就會在background執行,
而不用等他做完就可以先執行下一個指令

shell script - ssh and forwarding command

想說執行shell script file, 讓他自動ssh連線到另一台server
並執行一些指令如下:

---test.sh---
ssh user1@server1
mkdir testFolder
exit
---

但發現會停在連線過去的部份, 也就是只做了ssh user1@server1,
剩下的指令都不會自動作, 要自己再額外手打,

後來上網查了一些, 發現別人在作類似的事情時,
會在ssh 指令後面加上 <<EOI 
及在exit 後面加上 EOI

然後嘗試:
---test.sh---
ssh user1@server1 <<EOI
mkdir testFolder
exit
EOI
---

就成功了!

原因尚待研究...

shell script - delay for a while

之前一直在想說寫shell script時要怎麼在指令間達到 delay的效果,
後來發現很簡單只要加
    sleep (second)
就行了

ex:
想要執行pwd 10秒後再執行ifconfig

---test.sh---
pwd
sleep 10
ifconfig
---

2012年4月18日 星期三

Safe mode will be turned off automatically

昨天幫學弟架完他們要用的Hadoop(hadoop1)後發現今天在開自己的Hadoop(hadoop)時,一直沒辦法偵測到第三個datanode, 且jobtracker偵測到的tasktracker數為0也無法動作, 去看了一下jobtracker的log檔發現一直出現下列訊息:
 ...
org.apache.hadoop.ipc.RemoteException: org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot delete /tmp/hadoop-hadoop/mapred/system. Name node is in safe mode.
The ratio of reported blocks 0.6726 has not reached the threshold 0.9990. Safe mode will be turned off automatically.
...
表示一直沒辦法離開safe mode, 上網找了一下
意思是說在開啟Hadoop系統時, namenode會去check各個datanode的data block,
若datablock遺失的比率超過 1-0.999 時, 他就會一直處於safemode.

讓系統離開safe mode有兩種方式:
1.
    可以用
                         hadoop dfsadmin -safemode leave
    來離開 safe mod
2.
    或調低遺失比率的threshold

使用1.後,  jobtracker也偵測到兩個tasktracker但就是偵測不到第三個,
後來直接去第三個tracker上面紀錄的 tasktracker log,
發現他說他沒辦法辨識我namenode的host name!

這才想起來, 昨天在幫他們架時有修改到 /etc/hosts,
忘記再把我自己的namenode的 host name及IP加進去,
導致這個tasktracker在執行時, 無法辨識namenode是誰,
加進去後就解決了.... 腦殘

2012年3月29日 星期四

TFTP Server on Ubuntu

[Reference]
TFTP Server 與 xinetd 的安裝: Debian/Ubuntu
XCP安裝
XEN官網


TFTP Server on Ubuntu (test version ubuntu 11.04)
  1. TFTP 需要 syslinux
    1. $ sudo apt-get install syslinux
    2. $ syslinux -v
    3. 若成功則會顯示 syslinux 4.04  Copyright 1994-2011 H. Peter Anvin et al
  2. 安裝 tftpd-hpa 與 xinetd
    1. $ sudo apt-get install tftpd-hpa xinetd
    2. $ sudo gedit /etc/xinetd.d/tftp 
    3. 在 /etc/xinetd.d/tftp中加入:
      service tftp
      {
             socket_type     = dgram
             protocol        = udp   
             wait            = yes
             user            = root
             server          = /usr/sbin/in.tftpd
             server_args     = -s /var/lib/tftpboot
             disable         = no
             per_source      = 11
             cps             = 100 2
             flags           = IPv4
      } 
    4. 重新啟用xinetd:
      1. $ sudo service xinetd reload
      2. $ sudo service xinetd restart
    5. 確認tftpd是否有在運作:
      1. $ sudo netstat -anp | grep tftp
      2.  若正常運作應該會看到
      3. hadoop@adalab:~$ sudo netstat -anp | grep tftp
        udp        0      0 0.0.0.0:69              0.0.0.0:*                           25122/in.tftpd 
        unix  2      [ ]         DGRAM                    14691816 25122/in.tftpd

2012年3月8日 星期四

remotely submit job to jobtracker

之前一直想到一個問題, 如何去同遠端的node而非master node來submit job給master node的JobTracker?

在Hadoopg手冊(Chapter 6: MapReduce如何運作) 中提到可透過JobClient去submit job到 JobTracker上去執行, 而在圖6-1中看到他把 JobClient括起來標示成 client node, JobTracker用 jobtracker node標示起來, 立刻想到是否可在Hadoop系統中的slaver node上(即已有從master node複製過去的hadoop整個資料夾)submit job?

便從master(adalab)  start hadoop, 然後在從slaver(algoq-ProLiant-DL380-G6) 上面執行:

bin/hadoop jar hadoop-examples-0.20.205.0.jar grep ../../gridmix/data/MonsterQueryBlockCompressed/ g_outtest 's'

然後發現可以執行!

bash 檔中的 if else判斷式

[Reference]
sites.google.com/site/tiger2000/home 
第二十四章 Shell Script 

Testing 判斷式


Testing 判斷式通常與if-then-else一起互用, 以便發揮其效果. 先從一個最簡單的例子看起 :

$ cat myscript7
#!/bin/sh
if [ -f /etc/passwd ]; then
   echo "/etc/passwd is a file"
else
   echo "PANIC : /etc/passwd is not a file!!"
fi

先說明一下 [ -f /etc/passwd ] 這個最重要的部份, [ ] 裡面就是判斷式, 而這裡是判斷 /etc/passwd 是不是一個 file ?
由結果來看看是執行 then 下面的敘述, 或者執行 else 的敘述.

同時很重要一點是 底下這些敘述都是不正確的敘述, 會有錯誤產生喔 :
[-f /etc/passwd ]  [-f 連在一起 
[ -f /etc/passwd]  passwd] 連在一起
[ -f/etc/passwd ]  -f與/etc/passwd連在一起

這裡是一個雙重條件判斷的範例:

CONFIG=config.ini
if [ -e $CONFIG -a "`grep ^Mailer $CONFIG`" ]; then
   SERVER_LIST=(`grep ^Mailer $CONFIG | cut -d= -f2 | sed 's/,/ /g'`)
   SERVER_NUM=${#SERVER_LIST[@]}
else
   echo "$CONFIG not found"
   exit 2
fi

上述的範例有些複雜, 簡單的說它透過 -a (代表 and) 判斷是否同時滿足  -e $CONFIG 與 `grep ^Mailer $CONFIG?
所以另外一個 -o (寄是代表 or) 就會類似這樣了:

if [ -e $CONFIG -o "`grep ^Mailer $CONFIG`" ]; then
   XXXXX (自己發揮)
fi


所以利用 [ ] 我們可以做出以下這些判斷, 這些也都很常用喔 !!

test     true if ....

[ string1 = string2 ] string1 and string2 are equal [ string1 != string2 ] string1 and string2 are not equal [ string1 \< string2 ] string1 is lexically less than string2 (e.g. 'a' is less than 'b') [ string1 \> string2 ] string1 is lexically greater than string2 (e.g. 'b' is greater than 'a') [ -z string ] string is zero (e.g. a empty string) [ -n string ] string is nonzero (e.g. a VAR string) [ -e file ] file exists [ -f file ] file is a file [ -d file ] file is a directory [ -c file ] file is a character device [ -b file ] file is a block device [ -p file ] file is a named pipe [ -s file ] file is not empty [ -k file ] file's sticky bit is set [ -S file ] file is a socket [ -L file ] file is a symbolic link [ -r file ] file is readable by user [ -w file ] file is writeable by user [ -x file ] file is executeable by user [ -O file ] file is owner by user [ -G file ] file is group owned by a greoup [ -u file ] file has its set user ID bit set [ -g file ] file has its group user ID bit set [ file1 -nt file2 ] file1 is newer than file2 [ file1 -ot file2 ] file1 is older than file2 [ file -ef file2 ] file1 is another name for file2 [ n1 -eq n2 ] true if integer n1 = integer n2 [ n1 -ne n2 ] true if integer n1 <> n2 [ n1 -gt n2 ] true if n1 > n2 [ n1 -ge n2 ] true if n1 >= n2 [ n1 -lt n2 ] true if n1 < n2 [ n1 -le n2 ] true if n1 <= n2

2012年3月5日 星期一

fairscheduler修改無效

[Version]
hadoop 0.20.205.0

[Problem]
之前一直在嘗試修改fairscheduler的source code, 利用ant package指令編譯完後產生jar file 在HADOOP_HOME/build/contrib/fairscheduler中, 根據官網手冊, 把fairscheduler的jar檔放進HADOOP_HOME/lib中(照過去經驗與想法上也是如此, 要被引用的class理應都該放到lib中)

http://hadoop.apache.org/common/docs/r0.20.205.0/fair_scheduler.html

Installation


To run the fair scheduler in your Hadoop installation, you need to put it on the CLASSPATH. The easiest way is to copy the hadoop-*-fairscheduler.jar from HADOOP_HOME/build/contrib/fairscheduler to HADOOP_HOME/lib. Alternatively you can modify HADOOP_CLASSPATH to include this jar, in HADOOP_CONF_DIR/hadoop-env.sh


然而怎麼去修改src都沒發現有任何改變, 從HADOOP_HOME/logs/fairscheduler/hadoop-hadoop-fairscheduler-adalab.log中也沒發現加入的東西

然後又發現, 當我把fairscheduler從HADOOP_HOME/lib中拿掉後, 觀察http://<JobTracker>:50030/scheduler, FairScheduler依然在執行!
代表Hadoop看的lib 不是 HADOOP_HOME/lib !

後來一一拿掉hadoop中所有的fairscheuduler jar 檔, 發現當拿掉HADOOP_HOME/share/hadoop/lib/中的那個, FairScheduler才停止運作, 意即系統看的是這個路徑的lib

[Solution]
1. 檢查HADOOP_HOME/conf/hadoop-env.sh , 發現HADOOP_CLASSPATH被註解掉便啟用,
    export HADOOP_CLASSPATH=/home/hadoop/hadoop-0.20.205.0/lib:${HADOOP_CLASSPATH}
    但這是個錯誤的嘗試, 因為已經知道他看得不是HADOOP_HOME/lib

2. 查看了hadoop資料夾看是否有人引用了" /share"這個路徑,  發現

HADOOP_HOME/bin/hadoop:
=================================
if [ -e $HADOOP_PREFIX/share/hadoop/hadoop-core-* ]; then
......
  # add libs to CLASSPATH
  for f in $HADOOP_PREFIX/share/hadoop/lib/*.jar; do
    CLASSPATH=${CLASSPATH}:$f;
  done
......
else
......
  # add libs to CLASSPATH
  for f in $HADOOP_HOME/lib/*.jar; do
    CLASSPATH=${CLASSPATH}:$f;
  done
=================================

if [ -e file]; then
    A
else
    B
指的是, 如果指定的file存在, 則作A, 否則作B,
所以hadoop執行時先看到了share這個資料夾有存在, 所以指定了share中的hadoop lib給系統,換言之就是預設是不會去看放在HADOOP_HOME/lib中的jar檔, 也就是為何把fairscheduler的jar檔放進去沒用!

最簡單的方式就是把編譯好的jar file放到HADOOP_HOME/share/hadoop/lib中, 而不是HADOOP_HOME/lib.


放置到HADOOP_HOME/share/hadoop/lib後確實有看到修改的跡象:

HADOOP_HOME/logs/fairscheduler/hadoop-hadoop-fairscheduler-adalab.log
...
2012-03-05 18:49:22,803    PREEMPT_VARS    default    MAP    0    0
2012-03-05 18:49:22,803    PREEMPT_VARS    default    REDUCE    0    0
2012-03-05 18:49:22,803    HELLOOOOOOOOOOOOOOOOOOOOOO!!!!!
2012-03-05 18:49:23,303    PREEMPT_VARS    default    MAP    0    0
2012-03-05 18:49:23,303    PREEMPT_VARS    default    REDUCE    0    0
2012-03-05 18:49:23,303    HELLOOOOOOOOOOOOOOOOOOOOOO!!!!!
2012-03-05 18:49:23,368    HEARTBEAT    tracker_algoq-ProLiant-DL380-G6:localhost/127.0.0.1:60564
2012-03-05 18:49:23,368    RUNNABLE_TASKS    0    0    0    0
2012-03-05 18:49:23,368    INFO    Can't assign another MAP to HEEEEEEEEEEEELLLLLOOOOO!!!!!!!tracker_algoq-ProLiant-DL380-G6:localhost/127.0.0.1:60564
2012-03-05 18:49:23,368    HEEEEEEEEEEEELLLLLOOOOO!!!!!!!
... 

[Reference]
hadoop scheduler的編譯的編譯

2012年2月29日 星期三

Evernote

雲端記事本收納資料 輕鬆安心找得到

〔記者甘偉中/專題報導〕
是否曾有這樣的經驗,電腦中一堆收集來的資料,有儲存的網頁、word 檔、圖檔、pdf 檔等不同格式,這些資料或許是工作上的需求、或許是為了旅遊蒐集而來、又或者是個人興趣蒐集。他們分散在不同的資料夾,資料夾可能還一層包一層,久了之後 要再翻出來很不容易。如果你有這樣的麻煩,那麼雲端記事本 Evernote 這個工具,可以讓你的生活變得比較輕鬆。
Evernote(http://www.evernote.com/about/intl/zh-tw/)是個雲端記事本服務,可以透過瀏覽器、桌面應 用程式、平板或手機 App 三種途徑,將資料紀錄並同步至雲端,之後即使手機遺失、電腦損毀,只要再安裝 Evernote,就可以把資料從雲端同步回來。



資料不是保存下來就好,還要日後找得回來才有效。管理面上 Evernote 有兩個好用的功能:「標籤」及「光學辨識」。在 Evernote 內的記事,除了可用資料夾整理之外,還可以設定標籤。如此一來每份資料可擁有不只一種分類,日後即可依據資料夾與標籤快速取得。「光學辨識」則是 Evernote 認得出圖片上的文字,可以依據圖片來查詢資料。比如用手機將名片拍攝下來,就可透過 Evernote 的搜尋功能找到名片上的文字。光學辨識準確度沒有純文字高,但用來協助資料的篩選,可以提昇被查獲的機率。光學辨識目前已支援英文及日文,中文辨識還正在 開發中。



Evernote 除了本身的雲端記事功能之外,也發展出許多不同的應用。比如官方開發出的 Evernote Hello 手機 App,可用手機拍下朋友頭像、名片,在 Evernote 中建立聯絡人資料。很多人喜歡在餐廳用餐時拍下菜色,Evernote Food 在拍照的同時,會紀錄該餐廳所在位置,用完餐後可以再從 Evernote 加上評比。Expensify 是用來紀錄收據的 App,可將紙本收據拍照存入 Evernote,便於日後管理、銷帳。



官方目標是將 Evernote 發展成一個平台,平常可使用行動設備紀錄、拍照,再經由雲端同步到家中電腦整合管理。各式各樣的 App 可由社群或第三方協力單位來開發,以符合各種不同的使用情境。
Evernote 在 2008 年成立,草創初期公司人數為 15 人,到 2010 年時成長為 70 人,截至目前已經有 170 多人。創辦人 Phil Libin 當初建立此服務,是希望能夠有一個整合存放所有資料的地方,並且安心日後可以找得到。如今 Evernote 全球約有 22,000,000 名使用者,其中 800,000 名是活躍用戶;全球每天約新增 65,000 名使用者,台灣地區每天約新增 1,000 名使用者。
據 Evernote 亞太區總經理 Troy Malone 表示,台灣用戶數量約佔全球 2%,不過活躍用戶卻高達 34%,相較全球活躍用戶比率來看相當高,因此被視為亞太區重要市場。目前 Troy Malone 約每季造訪台灣一次,除了開發市場之外,也尋求與台灣企業的合作。如 HTC Flyer 平板電腦,即內建 Evernote 為筆記應用程式。



Evernote 採取 Freemium 商業模式,也就是提供一般使用者免費使用,同時也提供進階功能的付費版。Evernote 所有獲利來源都靠付費版,曾經公司也面臨資金不足的困境,當 CEO 正在撰寫解散信時,幸好遇到其中一位用戶慷慨解囊,才得以繼續存活。如今創辦人 Phil Libin 仍然堅持要把免費版做好,他認為只有提供優質的免費版服務,才能擴大免費用戶數量,才會有越多人轉換到付費版。
付費版每個月需繳 5 元美金,或每年 45 元美金,提供不少實用的功能如:加大每月上傳量為 1G,回復記事到歷史版本,搜尋 pdf 檔內容,手機離線存取記事等。

LINK

Leona Lewis - Run




原曲是:
Snow Patrol - Run

2012年2月28日 星期二

setup/cleanup task

hadoop 在運行一個job的時候, 除了自身的map/reduce tasks之外,
其開始執行前有個setup task, 當setup task 執行完, 此job才會進入到RUNNING state,
而當所有map/reduce tasks都執行完時, 會有一個cleanup task,
當cleanup task 執行完後, 此job就會進入 SUCCEDED/FAILED/KILLED states.

備註:setup/cleanup task 的功能要再補充

2012年2月20日 星期一

ant 手冊

[Reference]
http://ant.apache.org/manual/index.html

ArrayList

[Reference]
http://pydoing.blogspot.com/2011/05/java-arraylist.html

Failed fetch notification for map task

若在執行job的時候發生:
Failed fetch notification #1 for map task

先檢查
   1. node架設時的hosts檔設定是否完整 --> 會影響到nodes之間溝通的權限

task attempt

TaskTracker 所執行的每個小工作,就是 Task attempt (嘗試執行 Task)。
亦即每個 mapper 或 reducer 就是 Task attempt。

由於機器可能會跑到一半掛點,java 可能當掉,程式可能錯誤。
所以 Task attempt 總個數會大於 mapper + reducer 總個數。

此外,遇到執行太慢的 Task,JobTracker 會找兩台 TaskTracker 執行同一個 mapper 或 reducer task。
一旦其中一個先完成,另一個就會被 KILL 掉。這就是 Failed 跟 Killed 的差異所在。
Failed 是 mapper 或 reducer 程式有執行上錯誤的狀況,因此若看 Log 會看到 Java 的 Trace 紀錄。
Killed 是相同一個 task 給兩台 TaskTracker 執行做競爭,當其中一台提早執行完畢時,另一台就會被 Killed。

[Reference]
http://forum.hadoop.tw/viewtopic.php?f=7&t=1794

Retired Job

關於 retired job 解釋

Job Retirement Policy (pre-H21 only!)

Once a job is complete it is kept in memory (up to mapred.jobtracker.completeuserjobs.maximum) and on disk as per the above. There is a configuration value that controls the overall retirement policy of completed jobs:
Key: mapred.jobtracker.retirejob.interval
Default: 24 * 60 * 60 * 1000  (1 day) 完成的job一天後就會自動清除(retired)
In other words, completed jobs are retired after one day by default. The check for jobs to be retired is done by default every minute and can be controlled with:
Key: mapred.jobtracker.retirejob.check
Default: 60 * 1000 (60s in msecs) job完成後1分鐘內不會被清除(retired)
The check runs continually while the JobTracker is running. If a job is retired it is simply removed from the in-memory list of the JobTracker (it also removes all Tasks for the job etc.). Jobs are not retired under at least 1 minute (hardcoded in JobTracker.java) of their finish time. The retire call also removes the JobTracker Local (see above) file for the job. All that is left are the two files per retired job in the history directory (hadoop.job.history.location) plus – if enabled – the Per Job files (hadoop.job.history.user.location).

[Reference]
http://www.cloudera.com/blog/2010/11/hadoop-log-location-and-retention/

2012年2月14日 星期二

Olympic swimmer proposes to girlfriend on medal stand

When Matt Grevers jumped into the pool prior to this last weekend's 100-meter backstroke at the Missouri Grand Prix, he had diamond on his mind, not gold.
The two-time gold medalist had concocted an elaborate plan to propose to his longtime girlfriend, fellow national-team swimmer Annie Chandler, atop the medal stand. All he had to do was get there.
Grevers ended up winning the race. And when organizers asked Chandler to present the medals to the three top finishers, she didn't suspect anything out of the ordinary. When Grevers dropped to a knee, Chandler's reaction says it all.
"I've just been searching for a unique way to pop the question," Grevers told reporters. "My whole family is here and I figured it would be a perfect opportunity and a unique situation."
Originally, Grevers had hoped to propose while Chandler was on the medal stand. A fifth-place performance in Friday's 100 breaststroke scuttled those plans. He didn't want to do it on Sunday, so his plans were all riding on Saturday's backstroke race.
"I took [the race] out a little fast because my heart was racing the whole time," he said. "If I didn't get first it wouldn't have worked out so well."
Grevers' brother, Andy, is an assistant swim coach at the University of Missouri (where the event was held) and played a key role in the proposal. He held the ring during the race and surreptitiously passed it to his brother afterward.
The couple didn't talk about potential wedding dates, though late July probably won't be in the cards. The 2012 London Olympics begin on the 27th of that month. Grevers and Chandler hope they'll both be competing.

video

真是個不錯的情人節禮物!

medalist: n. 獎牌得獎者
concoct: v. 策劃
elaborate: a. 精心的

2012年2月13日 星期一

MagV

在App Store蟬聯超過500天的電子閱讀龍頭─MagV雲端書城
MagV深耕兩岸雲端版圖 20120213


觀察系統資源運作--top

觀察CPU utility, Memory use... 等等
可以使用 top 指令
ex:
1. $top -d 1

    -d: 表示資訊幾秒更新一次, 上述範例是一秒更新一次

2. $top
    $1
   
    top完後再按"1" 可以觀察各個單一CPU utility

開關cpu 指令

Disable a CPU core on Ubuntu
1. cat /proc/cpuinfo
2. echo 0 | sudo tee /sys/devices/system/cpu/cpu1/online
    關CPU1

3. echo 1 | sudo tee /sys/devices/system/cpu/cpu1/online
    開CPU1

[Reference]
http://www.upubuntu.com/2011/09/how-to-disable-cpu-core-on-ubuntudebian.html