Fenriswolf 程式筆記

奮利斯狼的地盤,小綿羊勿入

Hadoop 參數設定 – core-site.xml

Hadoop 相關的參數非常的多,要怎麼設定才能達到最好的效能是一件令人頭痛的事
本篇是 core-site.xml 的設定及說明

  • fs.default.name
    預設值 : file:///
    說明 : 設定 Hadoop namenode 的 hostname 及 port,預設是 Standalone mode,如果是 Pseudo-Distributed mode 要指定為 hdfs://localhost:9000,但是這個缺點是只有在本機才能操作,從其他機器不能連。建議可直接使用 Cluster mode,指定 hdfs://hostname:9000。但是 Hadoop 是依據 hostname 去做 ip binding,所以要注意 /etc/hosts 裡 hostname 不能對應到 127.0.0.1,要對應實際的 ip。

    10.1.112.70        hostname
    

    如果發現不能從其他機器連線的話,在 namenode 上用 netstat 看 ip/port mapping 是否正確

    tcp        0      0 ::ffff:10.1.112.70:9000     :::*                        LISTEN      2691/java
    tcp        0      0 ::ffff:10.1.112.70:9000     ::ffff:10.1.112.70:49119    ESTABLISHED 2691/java           
    tcp        0      0 ::ffff:10.1.112.70:9000     ::ffff:10.1.112.70:49113    ESTABLISHED 2691/java
    
  •  

  • hadoop.tmp.dir
    預設值 : /tmp/hadoop-${user.name}
    說明 : Hadoop 存放暫存檔案的目錄,會根據 user account 在此目錄下開不同的子目錄。但是放在預設的 /tmp 下可能會有一個問題,一般在 Centos 會 enable tmpwatch,tmpwatch 會定期把 /tmp 下沒用到的檔案砍掉,如果不希望系統做這件事,可以 disable tmpwatch 或把 hadoop.tmp.dir 指到不同的目錄下
  •  

  • fs.checkpoint.dir
    預設值 : ${hadoop.tmp.dir}/dfs/namesecondary
    說明 : secondary namenode 存放暫存檔案的目錄,如果有多個目錄可用",“隔開。設定多個目錄的好處是 Hadoop 會把 temp image files 分別寫到指定的多個目錄,以避免其中一份資料壞掉。seconary namenode 相關的設定不一定需要,甚至在 Hadoop cluster 可以不需要起 secondary namenode。但重起 namenode 時也會做 file merge,當檔案很大時,重起的時間會非常的長。為了減少 downtime,建議在 production site 都會啟動 secondary namenode。而且要起在跟 namenode 不同的機器,以保證當 namenode 硬碟壞掉的時候,還可以從 secondary namenode 上把資料備份回來。
  •  

  • fs.checkpoint.period
    預設值 : 3600(秒)
    說明 : 控制 secondary namenode 的 checkpoint 時間間隔。如果距離上次 checkpoint 的時間大於這個參數設定的值,就會觸發 checkpoint。secondary namenode 會把 namenode 的 fsimage 和 editlog 做 snapshot。如果存取 Hadoop 的次數頻繁或為了減少重起 namenode 的 downtime,可以把這個值設小一點。
  •  

  • fs.checkpoint.size
    預設值 : 67108864(byte)
    說明 : 如果 Hadoop 非常的忙碌,editlog 可能會在短時間內長的很大,fs.checkpoint.period 的設定不見得可以完全預測這個狀況,所以保險的做法會多設定這個值,以保證當檔案大到超過 fs.checkpoint.size 的值也會觸發 checkpoint。
  •  

  • io.file.buffer.size
    預設值 : 4096(byte)
    說明 : 這是讀寫 sequence file 的 buffer size, 可減少 I/O 次數。在大型的 Hadoop cluster,建議可設定為 65536 到 131072。
  •  

  • ipc.client.connection.maxidletime
    預設值 : 10000(毫秒)
    說明 : 設定 Hadoop client 連線時最大的閒置時間,預設是 10 秒。如果 Hadoop cluster 的網路連線不穩,可以把這個值設到 60000(60秒)。
  •  

  • ipc.server.tcpnodelay
    預設值 : false
    說明 : 在 Hadoop server 是否啟動 Nagle’s 演算法。設 true 會 disable 這個演算法,關掉會減少延遲,但是會增加小封包的傳輸。server site 不太需要這定這個值。
  •  

  • ipc.client.tcpnodelay
    預設值 : false
    說明 : 在 Hadoop client 是否啟動 Nagle’s 演算法。設 true 會 disable 這個演算法,關掉會減少延遲,但是會增加小封包的傳輸。client site 建議把這個值設 true。
  •  

  • hadoop.security.authorization
    預設值 : false
    說明 : 是不是要開啟 service-level 帳號驗證機制,開啟之後 Hadoop 在執行任何動作之前都會先確認是否有權限。詳細的權限設定會放在 hadoop-policy.xml 裡。例如要讓 fenriswolf 這個 account 及 mapreduce group 可以 submit M/R jobs,要設定 security.job.submission.protocol.acl

    <property>
         <name>security.job.submission.protocol.acl</name>
         <value>fenriswolf mapreduce</value>
    </property>
    
  •  

  • hadoop.security.authentication
    預設值 : simple
    說明 : simple 表示沒有 authentication,Hadoop 會用 system account 及 group 來控管權限。另外可以指定為 kerberos,這部分相對比較複雜,要有一個 kerberos server 並產生 account keytab,在執行任何操作前 client 要先用 kinit 指令對 kerberos server 認證,之後的任何操作都是以 kerberos account 來執行。
  •  

  • hadoop.kerberos.kinit.command
    預設值 : N/A
    說明 : 如果 hadoop.security.authentication 設為 kerberos 就要多設這個參數指定 Kerberos kinit 指令的路徑。在 CentOS 裝 krb5-workstation package 後預設安裝路徑為 /usr/kerberos/bin/kinit
  •  

  • fs.trash.interval
    預設值 : 0(分)
    說明 : 清掉垃圾筒的時間。預設是不清, 所以在刪除資料時要自己執行

    hadoop fs -rm -skipTrash
    

    hadoop fs -expunge 
    

    來清除垃圾筒的資料,但是強制用 -skipTrash 會造成誤刪的資料救不回來,user 也會常常會忘記做 -expunge 而造成 Hadoop 空間不會釋放。建議可以設為 1440 讓 Hadoop 每天清除垃圾筒。

  •  

  • topology.script.file.name
    預設值 : N/A
    說明 : 實作 Hadoop Rack Awareness 的機制,指定一個可執行檔,input 會是一組 hostname 或 ip,回傳值是 rack name 清單。不指定的情況下,Hadoop 會預設所有的 node 都在同一個 rack 之下。
    以下是一個 python 的範例,不過用 shell script 或其他語言寫也可以

    #!/usr/bin/python
    
    import sys
    from string import join
    
    DEFAULT = '/dc/rack0';
    
    RACK_MAP = {
        '10.1.113.37' : '/dc/rack1',
        'hadoop-worker01' : '/dc/rack1',
    
        '10.1.113.77' : '/dc/rack1',
        'hadoop-worker02' : '/dc/rack1',
    
        '10.1.113.45' : '/dc/rack2',
        'hadoop-work03' : '/dc/rack2',
    
        '10.1.113.48' : '/dc/rack2',
        'hadoop-work04' : '/dc/rack2',
      }
    
    if len(sys.argv) == 1:
      print DEFAULT
    else:
      print join([RACK_MAP.get(i, DEFAULT) for i in sys.argv[1:]]," ")
    


    如上圖所示,一個非常大的 Hadoop cluster 可能會跨多個 data centers,每個 data center 會有多個 racks,每個 rack 有多個 nodes。假設 Hadoop replication number 設 3,在 Hadoop 做 replication 時會根據這個設定,第一份資料放在 local node,第二份資料放在另一個 rack 的某個 node,第三份資料會放在與第二份同個 rack 但不同的 node 下。當網路設定有問題或斷線時,某一個 rack 可能會全部不見,放在不同的 rack 可以保證仍然能存取到資料。為了增加網路的容錯能力,一般都會設定這個 script。
    如果在 cluster 已經有資料的情況下才設定 rack topology,可以用 hadoop balancer 指令讓所有的 blocks 重新分配

  •  

  • topology.script.number.args
    預設值 : 100
    說明 : 每次傳給 topology.script.file.name script 的參數個數。如果 Hadoop node 個數過多,topology.script.file.name script 會被執行多次,一次傳入 100 個參數
  •  

  • hadoop.native.lib
    預設值 : true
    說明 : 預設 Hadoop 會去找所有可用的 native libraries 並自動 load 進來使用,例如壓縮類的 libraries 像 GZIP, LZO 等等。會設成 false 的原因通常是為了 debug,Hadoop 會把 native libraries 換成相對應的 java 實作方式來執行,例如 GZIP,以方便使用者檢測 libraries 是否執行錯誤。但是 LZO 這類的 libraries 並沒有 java 實作,所以還是會 call native libraries 來做壓縮,也就沒有 debug 的效果了。詳細的壓縮格式類型會在 mapred-site.xml 的設定時再介紹。

 
 
執行環境
CentOS 6.2
JDK 1.6.0_31
Cloudera CDH3U3

參考資料
core-default.xml
Hadoop Data Replication
Hadoop Balancer

廣告

2012/04/05 - Posted by | Hadoop | ,

仍無迴響。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

%d 位部落客按了讚: