EXCEL--找出特定字串在是否存在於搜尋的字串


今天在解一個Excle的字串的問題,想找出特定字串在是否存在於搜尋的字串內,
於是使用函數SEARCH(find_text,within_text,[start_num]),
這個公式是不分大小寫,如果想區分大小寫,則改用函數FIND。
儲存格公式如下:
=SEARCH("A",A1)
只要是大於0,表示A是存在於字串內的第N個位置。
為了不讓找不到字而出現錯誤訊息,公式改為:
=IF(TYPE(SEARCH("#",A2))=16,0,SEARCH("#",A513))

EXCEL--不要顯示#VALUE!、#DIV/0!等錯誤訊息


在設計公式時,常常會遇到一些錯誤的訊息,如:#VALUE!、#DIV/0!…等。
這時候我們可以用TYPE函數來取得錯誤訊息的內部號碼,再以IF來判斷就可以自訂錯誤。
如下圖,由TYPE函數得知#VALUE!的號碼是16,所以判斷如果A2+B2的TYPE值為16,就顯示0

SQL Developer匯出Insert格式文字,表格名稱會帶有雙引號

利用Oracle SQL Developer來將資料以Insert格式匯出之後,發現匯出檔的表格名稱帶有雙引號,如下:
Insert into "export_table" (A,B,C,D,E) values ('1','2','3','4','5');




雖然可以使用文字編輯器的「取代」來去除雙引號,但是這次遇到500MB的匯出檔,連開啟都有問題,此法就失效了。
最後發現如果將表格名稱在匯出選項中改為大寫,就可以去除雙引號,如下圖:


匯出檔就不會帶有雙引號:
Insert into EXPORT_TABLE (A,B,C,D,E) values ('1','2','3','4','5');

v$bh有一些奇怪的數字,在dba_objects找不到


因為在v$bh中發現一些很奇怪的數字,例如:4294967295,在dba_objects上根本就查不到,
剛好在網路上搜尋到下面一篇文章(http://www.hellodba.com/reader.php?ID=132&lang=cn
,說明Global Temporary Table也會被載入Buffer Cache,
而且因為Global Temporary Table會針對不同的Session,讓彼此之間的資料獨立,不被其他
Session影響,但是這樣的機制就無法在Buffer Cache內呈現原始的object_id。
為了保持各自Session的資料的獨立,Oracle創建了一個系統臨時物件(這個臨時物件屬於sys),
保持了與臨時表相同的結構,然後在buffer中載入臨時物件的資料,
以系統臨時物件的object_id存放各自資料,使之相互不影響。

練習:Buffer Cache的Dirty狀態



先查詢測試表格(tmp01)的相關資料,會使用模糊查詢是因為我在實驗上發現如果有INDEX,它會被載入Buffer Cache,而不會是Table
SQL> select object_id,object_name from dba_objects where object_name like upper('%tmp_01%');
 OBJECT_ID   OBJECT_NAME
----------   ---------------------
     70444   TMP_01
     70445   TMP_01_PK

SQL> select * from v$bh where objd=70444; --> 沒有資料,表示它沒有被載入。
SQL> select * from v$bh where objd=70445; --> 有資料,載入Buffer Cache

查詢在Buffer Cache的Index,可以發現所有的Dirty都是N
SQL> select * from v$bh where objd=70445;

修改資料
SQL> update tmp_01 set a=2 where id=1;
SQL> commit;

再查詢一次,這次就可以發現Block的Dirty='Y',
表示Buffer Cache的資料已經被更改了。
SQL> select * from v$bh where objd=70445;
      OBJD DIR
---------- ---
     70445 Y

EXP-00091: Exporting questionable statistics.


將測試資料庫export出來時,中間發現了EXP-00091的錯誤:
EXP-00091: Exporting questionable statistics.

原因是Client端的Characterset與Server端不一致,先查詢Server的Characterset:

SQL> select * from v$nls_parameters where parameter='NLS_CHARACTERSET';
PARAMETER          VALUE                  NLS_CHARACTERSET
-----------------  ---------------------  -----------------
NLS_CHARACTERSET   WE8MSWIN1252


WIN: set NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252
LINUX: export NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252

再重新Export,就沒有錯誤訊息了。

參數log_archive_max_processes


今天查詢V$ARCHIVE_PROCESSES時發現兩台機器的值不一樣

Serve A:
SQL> select * from V$ARCHIVE_PROCESSES;
   PROCESS STATUS                         LOG_SEQUENCE STATE
---------- ------------------------------ ------------ ------------
         0 ACTIVE                                    0 IDLE
         1 ACTIVE                                    0 IDLE
         2 ACTIVE                                    0 IDLE
         3 ACTIVE                                    0 IDLE
         4 STOPPED                                   0 IDLE
         5 STOPPED                                   0 IDLE

[root@oel62 ~]# ps -ef |grep arc
oracle    2505     1  0 07:46 ?        00:00:01 ora_arc0_testdb
oracle    2515     1  0 07:46 ?        00:00:01 ora_arc1_testdb
oracle    2517     1  0 07:46 ?        00:00:01 ora_arc2_testdb
oracle    2519     1  0 07:46 ?        00:00:01 ora_arc3_testdb
root      4413  2989  0 09:43 pts/2    00:00:00 grep arc

從Table與Linux來看,有四個Processes在執行


Server B:
SQL> select * from V$ARCHIVE_PROCESSES;
   PROCESS STATUS                         LOG_SEQUENCE STATE
---------- ------------------------------ ------------ ------------
         0 ACTIVE                                    0 IDLE
         1 ACTIVE                                    0 IDLE
         2 STOPPED                                   0 IDLE

testfh:/home/mgr>ps -ef |grep arc
cloneora  6862     1  0  Jul 25  ?         2:49 ora_arc0_CLONE
cloneora  6864     1  0  Jul 25  ?         0:21 ora_arc1_CLONE
clonemgr  6435  6196  1 09:44:02 pts/tb    0:00 grep arc

從Table與Linux來看,有兩個Processes在執行。


原因是參數log_archive_max_processes,它是指定arhcive processes的最大數量。

如何讓Sqlplus可以取得Linux Shell的return結果


可以利用Shell將return值寫入檔案A,
但是檔案A的內容是定義一個帶有return值的Sqlplus變數,
當我們用Sqlplus去執行檔案A時,就會產生一個自訂的變數。

範例:

test.sh的內容,其中define是Sqlplus定義變數的方法:
#!/bin/sh
v_txt="hello"
echo "define v_test=$v_txt" > $HOME/a.sql

以Sqlplus去執行:
SQL> ! $HOME/test.sh
SQL> @$HOME/a.sql

當執行test.sh時,會將define v_test=hello寫入a.sql
當執行a.sql時,會定義一個變數v_test
接者就可以以Sqlplus來存取變數v_test
SQL> select '&VAR_TEST' A from dual;
或者
SQL> select 'hello' A from dual;

關閉listener的log監控


DB:Oracle 11gR2(11.2.0.1)

今天學習關閉listener的log監控時,發現找不到預設的log檔。
預估的路徑:$ORACLE_HOME/network/log/listener.log
於是到 Listener的管理介面去找:

[oracle@oel62 log]$ lsnrctl
LSNRCTL> show log_status
LISTENER parameter "log_status" set to ON
我的log狀態是開啟的。

LSNRCTL> show log_file
LISTENER parameter "log_file" set to /opt/oracle/diag/tnslsnr/oel62/listener/alert/log.xml
路徑與檔名都不一樣了

離開Listener的管理介面,回到Linux下。
LSNRCTL> quit

先到再到/opt/oracle/diag/tnslsnr/oel62/listener/alert,
去記錄log.xml的檔案大小,接著在Client端用Sqlplus連線進去資料庫,
果然檔案大小變大,內容也增加連線的訊息。

回到Listener的管理介面,並且把log給關閉
[oracle@oel62 log]$ lsnrctl
LSNRCTL> set log_status off
LISTENER parameter "log_status" set to OFF

再到/opt/oracle/diag/tnslsnr/oel62/listener/alert,
去記錄log.xml的檔案大小,接著在Client端用Sqlplus連線進去資料庫,
果然檔案大小都沒有改變,內容也沒有再增加。

會學習關閉log的原因,是因為當連線是短期且非常頻繁的話,log的成長會很驚人,
當然也可以用Shell Script來定期清除它。

Zplviewer,一個開發及預覽ZPL的程式(Zebra)

今天無意之間找到一個可以預覽 Zebra 的 ZPL 語言寫出來的條碼標籤,它是以Java寫出來的
網址是:http://zplviewer.sourceforge.net/ 
進入之後,在頁面的下面可以找到here的超連結,按下之後可以下載檔案:launch.jnlp

下載之後直接按兩下執行就可以了,但是前提是必需有安裝Java的runtime。
測試畫面如下,但是因為現在手上已經沒有Zebra的條碼機了,所以無法比對,
但是至少可以預覽,開發上就方便多了。
不用像以前一樣,每次改完都還要等現場停工時才能知道結果。

Excel--加密巨集程式(VBAProject)


今天遇到一個Excel加密的問題,原本以為是工作表加密,結果卻是巨集被加密。
於是到網路上查詢並學習一下。
原來這個功能很早就有了,也不是很複雜,只是我自己不知道而已,
只要到VBA編輯器內的「工具」--> 「VBAProject屬性」修改即可。


更改Oracle預設日期格式


Oracle預設的日期格為為'YYYY-MM-DD',例:2012/08/14,可以依下例的方法改變日期格式:

一、Session級別,只對自己當前的Session有效:
  alter session set nls_date_format='yyyy/mm/dd'; 

二、System級別,真正改變預設值

1、更改Linux上,oracle帳號的.bash_profile,加入下行:
 export NLS_DATE_FORMAT='yyyy/mm/dd'

2、在Windows上,打開登錄檔,在HKLM/SOFTWARE/ORACLE/HOME0/下,新建一個nls_date_format的字串
   ,並且給予日期格式,如:yyyy/mm/dd

HP-UX 查詢是32位元,還是64位元


ak47# getconf KERNEL_BITS
32    --> 32-bit
64    --> 64-bit

或者檢查vmunix's filetype
ak47# file /stand/vmunix
/stand/vmunix:  PA-RISC1.1 executable --32-bit
/stand/vmunix:  ELF-64 executable     --64-bit

Linux也可以用getconf
#getconf LONG_BIT
32    --32-bit
64    --64-bit

Hadoop、Zookeeper、Hbase安裝配置說明


原本使用Hbase所內建的Zookeeper來啟動HMaster、HRegionServer,但是不知道是什麼原因,
HQuorumPeer(Zookeeper)總是啟動一下就停用了,已經啟動的HMaster、HRegionServer,
也都因為找不到HQuorumPeer而停用。跟著Google找到的文件,修改好幾次的設定,情況依舊。
自己也仔細看了Zookeeper log,可是它都只有啟動的訊息,沒有停止或錯誤的訊息。
只好先刪除以rpm安裝的Hadoop,再以tar的方式安裝,無效;

再把Hbase的版本從0.94改為0.92.1,也是沒用。
最後試著設定獨立的Zookeeper,結果很穩定,真是感動。

一、環境:

  Hadoop:1.0.3
  Zookeeper:3.3.6
  Hbase:0.92.1
  作業系統:Oracle Linux 6.2 x64
  Master:192.168.56.201(oel62n1)
  Slave:192.168.56.202(oel62n2)

二、設定Hadoop

  自己新增一個user(每個Node都要)
  [root@oel62n1 ~]# useradd -m hduser

  下載後解壓縮
  [root@oel62n1 ~]# tar -zxvf hadoop-1.0.3.tar.gz

  我將原始資料夾移動到/usr/local,並且改變權限
  [root@oel62n1 ~]# mv hadoop-1.0.3 /usr/local
  [root@oel62n1 ~]# chown -R hduser:hduser /usr/loca/hadoop-1.0.3

  修改設定檔,內容與之前用rmp安裝的設定一樣,可參考之前文章
  [root@oel62n1 ~]# su - hduser
  [ hduser@oel62n1 ~]$ cd /usr/local/hadoop-1.0.3/conf
  [ hduser@oel62n1 conf]$ vi hadoop-env.sh
  [ hduser@oel62n1 conf]$ vi core-site.xml
  [ hduser@oel62n1 conf]$ vi hdfs-site.xml
  [ hduser@oel62n1 conf]$ vi mapred-site.xml
  [ hduser@oel62n1 conf]$ vi master
  [ hduser@oel62n1 conf]$ vi slavers
  設定免密碼登入SSH,這次改以rsa加密製作key
  [ hduser@oel62n1 ~]$ ssh-keygen -t rsa 
  [ hduser@oel62n1 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hduser@oel62n2
  [ hduser@oel62n1 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hduser@oel62n1

  複製hadoop-1.0.3到其他Node(oel62n2),並且修改權限
  [root@oel62n1 ~]# scp -r /usr/local/hadoop-1.0.3 hduser@oel62n2:/usr/local  
  [root@oel62n2 ~]# chown -R hduser:hduser /usr/local/hadoop-1.0.3

  啟動服務
   [ hduser@oel62n1 ~]$ cd /usr/local/hadoop-1.0.3/bin
   [ hduser@oel62n1 ~]$ ./start-all.sh

三、設定Zookeeper

  下載後解壓縮
  [hduser@oel62n1 ~]$ tar -zxvf zookeeper-3.3.6.tar.gz
  [hduser@oel62n1 ~]$ mv zookeeper-3.3.6 /usr/local 

  設定zookeeper的參數,將sample複製過來使用
  [hduser@oel62n1 ~]$ cd /usr/local/zookeeper-3.3.6/conf
  [hduser@oel62n1 ~]$ cp zoo_sample.cfg zoo.cfg

  編輯zoo.cfg
  [hduser@oel62n1 ~]$ vi zoo.cfg

  參數說明可參考:

  修改zoo.cfg的參數,預設在/tmp,重開機內容就不見了,所以自己改在:
  dataDir=/usr/local/zookeeper-3.3.6/dataDir

  叢集模式下,需要在zoo.cfg的最後面加入Node的IP、Port
  格式為server.ID=HOST_IP:PORT1:PORT2
  ID是一個數字表示第幾號的Node;PORT1是這台Node與Master Node之間通訊的PORT;
  PORT2是當Master Node故障時,各Node之間必需選擇一個新的Master,
  而這個PORT就是各Node在選擇時所使用的PORT。
  
  server.1=192.168.56.201:3688:3689
  server.2=192.168.56.202: 3688:3689

  與Hadoop一樣,將整個資料夾複製到其他的Node上
  [root@oel62n1 ~]# scp -r /usr/local/zookeeper-3.3.6 hduser@oel62n2:/usr/local  
  [root@oel62n2 ~]# chown -R hduser:hduser /usr/local/zookeeper-3.3.6

  在每台Node上設定myid,先參照zoo.cfg的dataDir的位置,在dataDir內增加文字檔myid
  [hduser@oel62n1 ~]$ vi /usr/local/zookeeper-3.3.6/dataDir/myid
  
  依據各zoo.cfg內server.ID中ID的數字填入myid文字檔,例如:
  oel62n1的myid就是1;oel62n2的myid就是2  

  分別啟動各Node的Zookeeper
  [hduser@oel62n1 ~]$ cd /usr/local/zookeeper-3.3.6/bin
  [hduser@oel62n1 bin]$ ./zkServer.sh start
  [hduser@oel62n2 ~]$ cd /usr/local/zookeeper-3.3.6/bin
  [hduser@oel62n2 bin]$ ./zkServer.sh start  

  用Client端的程式去測試:
  [hduser@oel62n1 bin]$ zkCli.sh -server 127.0.0.1:2181
  [zk: 127.0.0.1:2181(CONNECTED) 1] create /test01 abcd  --建立測試
  再到oel62n2測試找不找的到資料:
  [hduser@oel62n2 bin]$ zkCli.sh -server 127.0.0.1:2181
  [zk: 127.0.0.1:2181(CONNECTED) 1] ls /
  [test01, zookeeper]  --這是Master Node的資料,表示成功。
  [zk: 127.0.0.1:2181(CONNECTED) 1] delete /test01  --刪除
  [zk: 127.0.0.1:2181(CONNECTED) 2] ls /
  [zookeeper]  --不見了   

四、設定Hbase
  依上列方法下載並解壓縮到/usr/local/hbase-1.0.3,並改變擁有者為hduser

修改hbase-site.xml
填入正確的JAVA路徑
export JAVA_HOME=/usr/java/jdk1.7.0_05
這裡要注意輸入Hadoop的設定檔路徑,不是Hbase。
export HBASE_CLASSPATH=/usr/local/hadoop-1.0.3/conf
預設的heap會使用1GB的記憶體,但是我只有1G的記憶體,所以把它改小
export HBASE_HEAPSIZE=256
是否啟用內建的Zookeeper,所以是false,不使用內建。
export HBASE_MANAGES_ZK=false


修改hbase-site.xml,內容大致如下:


  hbase.rootdir
  hdfs://oel62n1.ccc.com.tw:54310/hbase
    The directory shared by RegionServers.
   



    hbase.cluster.distributed
    true
    The mode the cluster will be in. Possible values are
      false: standalone and pseudo-distributed setups with managed Zookeeper
      true: fully-distributed with unmanaged Zookeeper Quorum (see hbase-env.sh)
   

 

 
         hbase.zookeeper.property.clientPort
         2181
         Property from ZooKeeper's config zoo.cfg.
         The port at which the clients will connect.
        

      

    
    
hbase.rootdir是參考Hadoop的core-site.xml檔內的參數:
fs.default.name 加上卻存放的資料夾。

hbase.cluster.distributed表示是否要啟用hbase的叢集

hbase.zookeeper.property.clientPort指的是獨立Zookeeper Port


接著編輯/usr/local/hbase-0.92.1/conf/regionservers
[hduser@oel62n1 conf]
增加Node的Host:
oel62n1
oel62n2

參考上面scp的步驟,把整個hbase-0.92.1複製到oel62n2上

在Master上啟用Hbase叢集
[hduser@oel62 bin]$ cd /usr/local/hbase-0.92.1/bin
[hduser@oel62 bin]$ ./start-hbase.sh 


Hadoop Cluster 增加節點(Node)

繼上次安裝安裝兩台Hadoop來組成Cluster,現在要試著再增加一台。

原來的Cluster架構:

  1、Virual Machine A(Mater):192.168.56.201(oel62n1)
  2、Virual Machine B(Slave):192.168.56.202(oel62n2)

預計增加一台:

  Virual Machine C(Slave):192.168.56.203(oel62n3)

因為我是以VirualBox來測試,所以就直接clone oel62n2,並且重設網路相關設定。

一、編輯/etc/hosts,增加下列一行:

  192.168.56.203  oel62n3  oel62n3

二、設定SSH免密碼登入oel62n3

  [root@oel62n1 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub root@oel62n3
  (不要再執行ssh-keygen -d,因為key改變後會導致無法直接登入oel62n2)

三、設定Master(oel62n1)的/etc/hadoop/slaves,增加下列一行:

  oel62n3

四、將Master的設定檔複製到oel62n3

  [root@oel62n1 ~]# scp /etc/hadoop/* root@oel62n3:/etc/hadoop/

五、設定Script執行權限

  [root@oel62n3 ~]# chmod 744 /usr/sbin/hadoop-daemon.sh

六、在增加的節點(oel62n3)上啟用Datanode、Tasktracker,不必將整個Cluster重新啟動

  [root@oel62n3 ~]# hadoop-daemon.sh --config ./conf start datanode
  [root@oel62n3 ~]# hadoop-daemon.sh --config ./conf start tasktracker

  平均各節點的資料
  [root@oel62n3 ~]# hadoop balancer

七、修正錯誤

  原則上只要到上個步驟就成功了,但是我的情況卻出現了錯誤,我一啟動oel62n3的datanode
  ,oel62n2的datanode就shutdown,相反啟動oel62n2,shutdown的就是oel62n3。
  所以只好先查看oel62n3的log:

  [root@oel62n3 ~]# less /var/log/hadoop/root/hadoop-root-datanode-oel62n3.ccc.com.tw.log

  內容一段比較奇怪的地方:
  2012-08-03 14:48:02,076 WARN org.apache.hadoop.hdfs.server.datanode.
  DataNode: DataNode is shutting down: org.apache.hadoop.ipc.RemoteException:
  org.apache.hadoop.hdfs.protocol.UnregisteredDatanodeException:
  Data node 192.168.56.203:50010 is attempting to report
  storage ID DS-483675970-192.168.56.202-50010-1343799430568.
  Node 192.168.56.202:50010 is expected to serve this storage.

  上述訊息storage ID的值感覺好像不太對,再查看oel62n2的log:

  [root@oel62n2 ~]# less /var/log/hadoop/root/hadoop-root-datanode-oel62n2.ccc.com.tw.log

  storage id的值和oel62n3是一樣的:
  2012-08-03 14:50:02,076 WARN org.apache.hadoop.hdfs.server.datanode.
  DataNode: DataNode is shutting down: org.apache.hadoop.ipc.RemoteException:
  org.apache.hadoop.hdfs.protocol.UnregisteredDatanodeException:
  Data node 192.168.56.203:50010 is attempting to report
  storage ID DS-483675970-192.168.56.202-50010-1343799430568.
  Node 192.168.56.202:50010 is expected to serve this storage.

  猜想原因是出在這裡,因為我是用VirualBox直接Clone新的機器,
  所以導致兩台的storage Id重複,再查oel62n1的log,果然ID值就不一樣。
  所以就試著修改看看:

  [root@oel62n3 ~]# vi /tmp/hadoop-root/dfs/data/current/VERSION

  將storageID的值
  storageID=DS-483675970-192.168.56.202-50010-1343799430568
  改為:
  storageID=DS-483675970-192.168.56.203-50010-1343799430568

  重新啟用datanote,結果如下圖,這次就成功了。


 

http://192.168.56.201:50070/
  

http://192.168.56.201:50030/



在Oracle Enterprise Linux 6.2上安裝Hadoop 1.0.3(Multi-Node Cluster)


Hadoop有下列不同的服務:NameNode、JobTracker、DataNode、TaskTracker、SecondaryNameNode
其中NameNode、JobTracker只能有一台主要的機器來負責


一、測試環境
  1、作業系統:Oracle Linux 6.2 x64
  2、Virual Machine A:192.168.56.201(oel62n1)  --> Master Host
  3、Virual Machine B:192.168.56.202(oel62n2)  --> Slave Host
  4、作業系統只安裝文字介面

二、安裝Hadoop套件(兩台都安裝)
  我是下載rpm:hadoop-1.0.3-1.x86_64.rpm
  也可以下載tar檔,直接解壓就可以了

  [root@oel62n1]# rpm -ivh hadoop-1.0.3-1.x86_64.rpm
  [root@oel62n2]# rpm -ivh hadoop-1.0.3-1.x86_64.rpm

  注意:如果像我前安裝並測試過sigle-node,最好就是把它刪除再重建,
   不然會像我一樣,一直出問題,設定檔怎麼設定都是有錯。
(因為對設定檔還不夠了解啦!)
我刪除的步驟:
        [root@oel62n1]# rpm -e hadoop-1.0.3-1.x86_64.rpm
   [root@oel62n1]# rm -rf /etc/hadoop
[root@oel62n1]# rm -rf /var/log/hadoop

三、設定對應的主機名稱、SSH直接登入
  1、編輯兩台的/etc/hosts
    將兩台的hostname、ip各自填入兩台的hosts內,
oel62n1、oel62n2的/etc/hosts內容如下:

127.0.0.1   localhost localhost.localdomain
    192.168.56.201 oel62n1   oel62n1
    192.168.56.202 oel62n2   oel62n2

  2、設定SSH直接登入,此步驟不要省略,以免後面啟動服務時要一直輸入密碼。

    [root@oel62n1]# ssh-keygen -d
    --所有選項都直接按下Enter鍵就好

    [root@oel62n1]# ssh-copy-id -i ~/.ssh/id_dsa.pub root@oel62n2

自己本身也要免密碼登入:
[root@oel62n1]# ssh-copy-id -i ~/.ssh/id_dsa.pub root@oel62n1

    測試看看是否直接進入oel62n2
    [root@oel62n1 .ssh]# ssh oel62n2

測試看看是否直接進入oel62n1
    [root@oel62n1 .ssh]# ssh oel62n1

四、兩台都要安裝JAVA(JDK)

  [root@oel62n1]# rpm -ivh jdk-7u5-linux-x64.rpm
  [root@oel62n2]# rpm -ivh jdk-7u5-linux-x64.rpm

五、設定Hadoop的masters、slaves參數檔(只有當master的host才需要)
  我是以oel62n1為master:
 
  [root@oel62n1]# vi /etc/hadoop/hadoop-env.sh

  修改JAVA_HOME的位置如下:
  export JAVA_HOME=/usr/java/jdk1.7.0_05

  [root@oel62n1]# vi /etc/hadoop/masters

  此參數檔是指定SecondaryNameNode的host,填入:
  oel62n1

  [root@oel62n1]# vi /etc/hadoop/slaves

  此參數檔是指定其他當為node的host,填入:
  oel62n1
  oel62n2

六、設定Hadoop的參數檔(所有的host都要,內容都是指向master)

  [root@oel62n1]# vi /etc/hadoop/core-site.xml

  增加的內容如下:
 
    fs.default.name
    hdfs://oel62n1:54310
    The name of the default file system.  A URI whose
      scheme and authority determine the FileSystem implementation.  The
      uri's scheme determines the config property (fs.SCHEME.impl) naming
      the FileSystem implementation class.  The uri's authority is used to
      determine the host, port, etc. for a filesystem.
 


  [root@oel62n1]# vi /etc/hadoop/mapred-site.xml

  增加的內容如下:
 
    mapred.job.tracker
    master:54311
    The host and port that the MapReduce job tracker runs
      at.  If "local", then jobs are run in-process as a single map
      and reduce task.
   
 

  [root@oel62n1]# vi /etc/hadoop/hdfs-site.xml

  增加的內容如下(每一份在HDFS上面的資料會有幾份的複製):
 
    dfs.replication
    2
    Default block replication.
      The actual number of replications can be specified when the file is created.
      The default is used if replication is not specified in create time.
   
 

  以上是較簡單、快速的設定,其實hadoop還有許多的設定可以變化,有時間再測試看看。

七、格式化Namecode的HDFS filesystem

  [root@oel62n1]# hadoop namenode -format

八、啟用/關閉Hadoop Cluster
  只要在master host上執行:

  開啟script
  [root@oel62n1]# start-all.sh

  關閉script
  [root@oel62n1]# stop-all.sh

  也可以依daemons開啟
  [root@oel62n1]# start-mapred.sh
  [root@oel62n1]# start-dfs.sh

  也可以依daemons關閉
  [root@oel62n1]# stop-mapred.sh
  [root@oel62n1]# stop-dfs.sh

  可以下jps的指令來觀察各daemons的狀態:

  Master Host:
    [root@oel62n1]# cd $JAVA_HOME/bin
    [root@oel62n1]# ./jps
    20853 DataNode
    20463 NameNode
    21200 Jps
    20966 SecondaryNameNode
    21156 TaskTracker
    21036 JobTracker

  Slave Host:
    [root@oel62n2]# cd $JAVA_HOME/bin
    [root@oel62n2]# ./jps
    4356 TaskTracker
    4431 Jps
    4191 DataNode

  也可以開啟網頁來檢視:
  JobTracker:http://192.168.56.201:50030/
  NameCode:http://192.168.56.201:50070/
  Tasktracker:http://192.168.56.201:50060/

十、錯誤修改

  第一次在開啟start-all.sh時並沒有成功,所以我查了一下log:
  [root@oel62n1]#  cat /var/log/hadoop/root/hadoop-root-datanode-oel62n1.log
  [root@oel62n2]#  cat /var/log/hadoop/root/hadoop-root-datanode-oel62n2.log

  錯誤訊息大致如下,意指我的檔案權限不對:
  2012-08-01 13:20:56,287 WARN org.apache.hadoop.hdfs.server.datanode.DataNode:
  Invalid directory in dfs.data.dir: Incorrect permission for /tmp/hadoop-root/dfs/data,
  expected: rwxr-xr-x, while actual: rwx------

  修改檔案權限,兩台都要:
  [root@oel62n1]#  chmod 755 /tmp/hadoop-root/dfs/data
  [root@oel62n2]#  chmod 755 /tmp/hadoop-root/dfs/data

  重新啟動後,又出現另一個錯誤,大致說我的namenode的id與記錄不符:
  ... ERROR org.apache.hadoop.dfs.DataNode: java.io.IOException:
  Incompatible namespaceIDs in /app/hadoop/tmp/dfs/data: namenode namespaceID = 308967713;
  datanode namespaceID = 113030094

  修改namenode的id:
  [root@oel62n1]# vi /tmp/hadoop-root/dfs/data/current/VERSION
  --將namespaceID改為與log一樣
  [root@oel62n2]# vi /tmp/hadoop-root/dfs/data/current/VERSION
  --將namespaceID改為與log一樣

  重新啟動後成功了。