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。
    1 10.1.112.70        hostname

    如果發現不能從其他機器連線的話,在 namenode 上用 netstat 看 ip/port mapping 是否正確
    1 tcp        0      0 ::ffff:10.1.112.70:9000     :::*                        LISTEN      2691/java
    2 tcp        0      0 ::ffff:10.1.112.70:9000     ::ffff:10.1.112.70:49119    ESTABLISHED 2691/java          
    3 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
    1 <property>
    2      <name>security.job.submission.protocol.acl</name>
    3      <value>fenriswolf mapreduce</value>
    4 </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(分)
    說明 : 清掉垃圾筒的時間。預設是不清, 所以在刪除資料時要自己執行
    1 hadoop fs -rm -skipTrash


    1 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 或其他語言寫也可以
    01 #!/usr/bin/python
    02  
    03 import sys
    04 from string import join
    05  
    06 DEFAULT = '/dc/rack0';
    07  
    08 RACK_MAP = {
    09     '10.1.113.37' : '/dc/rack1',
    10     'hadoop-worker01' : '/dc/rack1',
    11  
    12     '10.1.113.77' : '/dc/rack1',
    13     'hadoop-worker02' : '/dc/rack1',
    14  
    15     '10.1.113.45' : '/dc/rack2',
    16     'hadoop-work03' : '/dc/rack2',
    17  
    18     '10.1.113.48' : '/dc/rack2',
    19     'hadoop-work04' : '/dc/rack2',
    20   }
    21  
    22 if len(sys.argv) == 1:
    23   print DEFAULT
    24 else:
    25   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

### Hadoop集群中 `core-site.xml` 和 `hdfs-site.xml` 的配置详解及作用 #### 1. `core-site.xml` 配置详解 `core-site.xml` 是 Hadoop 核心配置文件,主要用于定义 Hadoop 文件系统的基本属性和全局参数。以下是常见的配置项及其作用: - **fs.defaultFS** 指定 Hadoop 文件系统的默认名称节点地址,通常为 `hdfs://<namenode-host>:<port>`。这是 HDFS 的主要入口地址[^1]。 ```xml <property> <name>fs.defaultFS</name> <value>hdfs://hadoop103:9000</value> </property> ``` - **io.file.buffer.size** 定义 I/O 缓冲区大小(以字节为单位),用于提高读写性能[^2]。 ```xml <property> <name>io.file.buffer.size</name> <value>131072</value> </property> ``` - **hadoop.tmp.dir** 设置 Hadoop 的临时目录路径,用于存储临时文件和日志信息[^3]。 ```xml <property> <name>hadoop.tmp.dir</name> <value>/data/hadoop/tmp</value> </property> ``` - **dfs.replication** 虽然此参数也可以在 `hdfs-site.xml` 中配置,但在某些情况下可以放在 `core-site.xml` 中。它定义了 HDFS 文件的默认副本数[^1]。 ```xml <property> <name>dfs.replication</name> <value>3</value> </property> ``` #### 2. `hdfs-site.xml` 配置详解 `hdfs-site.xml` 是 HDFS 特定的配置文件,主要用于定义 HDFS 的具体行为和功能。 - **dfs.namenode.name.dir** 指定 NameNode 存储元数据的目录位置,通常为本地文件系统路径[^3]。 ```xml <property> <name>dfs.namenode.name.dir</name> <value>/data/hadoop/namenode</value> </property> ``` - **dfs.datanode.data.dir** 指定 DataNode 存储实际数据块的目录位置,通常为本地文件系统路径[^2]。 ```xml <property> <name>dfs.datanode.data.dir</name> <value>/data/hadoop/datanode</value> </property> ``` - **dfs.replication** 定义 HDFS 文件的默认副本数,确保数据冗余和高可用性[^3]。 ```xml <property> <name>dfs.replication</name> <value>3</value> </property> ``` - **dfs.permissions.enabled** 控制是否启用 HDFS 权限检查,通常在生产环境中建议启用[^1]。 ```xml <property> <name>dfs.permissions.enabled</name> <value>true</value> </property> ``` - **dfs.namenode.secondary.http-address** 指定 SecondaryNameNode 的 HTTP 地址,用于辅助 NameNode 的元数据管理[^2]。 ```xml <property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop104:50090</value> </property> ``` #### 示例代码 以下是一个简单的 Hadoop 集群启动和文件上传示例: ```bash # 启动 Hadoop 集群 start-dfs.sh start-yarn.sh # 创建 HDFS 目录并上传文件 hadoop fs -mkdir /user/test hadoop fs -put /local/path/to/file /user/test/ ``` ### 注意事项 - 在多节点集群中,确保所有节点的配置文件一致,并正确设置主机名和 IP 地址。 - 使用 `hdfs-site.xml` 中的 `dfs.namenode.name.dir` 和 `dfs.datanode.data.dir` 参数时,确保指定的目录具有足够的磁盘空间[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值