1.系統參數調整
中文名稱 | 英文名稱 | 默認值 | 推薦值或推薦策略 | 修改命令 | 作用 | 備註 |
socket的監聽隊列最大值 | net.core.somaxconn | 128 | 1024或更大 | echo 1024 >/proc/sys/net/core/somaxconn | 增大打開文件數據和網絡連接上限,調整內核參數net.core.somaxconn,提高讀寫速度和網絡帶寬使用率 | 如果是hadoop使用,需重啓hadoop纔能有效,並且要配合hadoop集羣參數ipc.server.listen.queue.size使用纔有效 |
讀取不更新文件atime屬性 | noatime | noatime |
vi /etc/fstab #/dev/data1 / ext4 defaults,noatime 0 0 mount -o remount /dev/data1 |
當以noatime選項加載(mount)文件系統時,對文件的讀取不會更新文件屬性中的atime信息。設置noatime的重要性是消除了文件系統對文件的寫操作,文件只是簡單地被系統讀取。 | ||
磁盤預讀緩存區大小 | blockdev --getra /dev/sda | 256 | 2048或更大 | blockdev --setra 2048 /dev/sda | 預讀可以減少磁盤尋道次數和I/O等待時間 | 執行命令只對一塊磁盤有效,需執行多次,且重啓系統後失效 |
系統IO調度器 | IO Scheduler | cfq | deadline | echo deadline > /sys/block/sda/queue/scheduler |
DEADLINE在CFQ的基礎上,解決了IO請求餓死的極端情況。除了CFQ本身具有的IO排序隊列之外,DEADLINE額外分別爲讀IO和寫IO提供了FIFO隊列。讀FIFO隊列的最大等待時間爲500ms,寫FIFO隊列的最大等待時間爲5s。FIFO隊列內的IO請求優先級要比CFQ隊列中的高,,而讀FIFO隊列的優先級又比寫FIFO隊列的優先級高。優先級可以表示如下: FIFO(Read) > FIFO(Write) > CFQ |
查看命令: cat /sys/block/sda/queue/scheduler |
epoll文件描述符上限 | fs.epoll.max_user_watches | 27054714 | 270547140 | echo /proc/sys/fs/epoll/max_user_watches | 單個用戶使用epoll進行watch的文件描述符上限。 note(dirlt):對於服務器應該特別有用,可以限制內存使用量 |
查看命令: sysctl -a |grep epoll |
設置openfile | ulimit -a |grep 'open files' | 1024 | 65535或更大 |
即時生效: ulimit -n 65535 永久生效: 在/ect/security/limits.conf中添加 * - nofile 65535 * - nproc 65535 |
打開文件描述上限太小,會出現打不開文件的問題 | |
系統交換分區 | swap | 開啓 | 關閉 | swapoff -a | 如果進程內存不足,系統會將內存中的部分數據暫時寫入磁盤,當需要時再將磁盤上的數據動態換置到內存中,這樣會降低進程執行效率 |
重新掛載swap分區: swapon -a |
2.hdfs的參數
數據塊的副本數 | dfs.replication | 3 | 2 | 頁面修改 | 減少副本塊可以節約存儲空間 | |
SequenceFile I/O 緩存區大小 | io.file.buffer.size | 131072(可以更大) | core-site.xml 的羣集範圍高級配置代碼段(安全閥) | hadoop訪問文件的IO操作都需要通過代碼庫,在很多情況下io.file.buffer.size都被用來設置緩存的大小。不論是對硬盤或者是網絡操作來講,較大的緩存都可以提供更高的數據傳輸,但這也就意味着更大的內存消耗和延遲。這個參數要設置爲系統頁面大小的倍數,以byte爲單位。 | ||
.Trash目錄下文件被永久刪除前保留的時間 | fs.trash.interval | 1440(24小時) | core-site.xml 的羣集範圍高級配置代碼段(安全閥) | |||
垃圾回收的檢查間隔 | fs.trash.checkpoint.interval | 1440 | core-site.xml 的羣集範圍高級配置代碼段(安全閥) | |||
是否啓動Hadoop的本地庫 | io.native.lib.available | true | core-site.xml 的羣集範圍高級配置代碼段(安全閥) | 本地庫可以加快基本操作,例如IO,壓縮等。 | ||
NameNode 處理程序計數 | dfs.namenode.handler.count | 40 | 400 | 頁面修改 | 設定 namenode server threads 的數量,這些 threads 會用 RPC 跟其他的 datanodes 溝通。當 datanodes 數量太多時會發現很容易出現 RPC timeout,解決方法是提升網絡速度或提高這個值,但要注意的是 thread 數量多也表示 namenode 消耗的內存也隨着增加。 | 擴展性相關參數 |
NameNode 服務處理程序計數 | dfs.namenode.service.handler.count | 400 | 頁面修改 | |||
NameNode的java堆棧大小 | NameNode Java heap size | 90G | 頁面修改 | |||
DataNode的java堆棧大小 | DataNode maximum Java heap size | 16G | 頁面修改 | |||
DataNode 處理程序計數 | dfs.datanode.handler.count | 3 | 50 | |||
提前讀取的字節數 | dfs.datanode.readahead.bytes | 4M | 64M | 頁面修改 | 讀取塊文件時,DataNode 可以使用 posix_fadvise 系統呼叫將數據顯式放入操作系統緩衝區緩存中當前讀取器位置之前。這樣可以提高性能,尤其是在磁盤高度佔用的情況下。該配置指定 DataNode 嘗試提前讀取的位置比當前讀取位置提前的字節數。 | |
ipc服務監聽隊列長度 | ipc.server.listen.queue.size | 1024 | 與系統參數net.core.somaxconn保持一致 | core-site.xml 的羣集範圍高級配置代碼段(安全閥) | 增大打開文件數據和網絡連接上限,提高hadoop集羣讀寫速度和網絡帶寬使用率 |
3.yarn的參數
日誌聚合保留期 | yarn.log-aggregation.retain-seconds | 7 | 2 | 頁面修改 | 刪除聚合日誌前要保留它們多久 | |
Mapreduce 提交複製 | mapreduce.client.submit.file.replication | 10 | 1 | 頁面修改 | mapreduce任務數據的副本數,默認是10,比普通HDFS文件的默認幅本數大很多,可能也是考慮到把輸入數據放到更多的DN上,儘可能實現本地數據計算,但會增大數據量,更改爲1個副本 | |
MapReduce產生的中間數據存放目錄 | mapred.local.dir | /data/cache1/dfs/mapred/local,/data/cache2/dfs/mapred/local,/data/cache3/dfs/mapred/local,/data/cache4/dfs/mapred/local | 頁面修改 | |||
Map 任務 Java 選項庫 | mapreduce.map.java.opts | -Xmx1024M | 頁面修改 | jvm啓動時的參數,只對java,scala程序有效(相比mapreduce.map.memory.mb要小一點是因爲java程序佔用內存較少) | ||
Map 任務內存 | mapreduce.map.memory.mb | 1.5G | 頁面修改 | map任務申請的內存 | ||
Reduce 任務 Java 選項庫 | mapreduce.reduce.java.opts | -Xmx2560M | 頁面修改 | 同map | ||
Reduce 任務內存 | mapreduce.reduce.memory.mb | 3G | 頁面修改 | 同map | ||
I/O 排序因子 | mapreduce.task.io.sort.factor | 10 | 100 | 頁面修改 | 排序文件時要合併的流的數量。也就是說,在 reducer 端合併排序期間要使用的排序頭數量。此設置決定打開文件句柄數。並行合併更多文件可減少合併排序迭代次數並通過消除磁盤 I/O 提高運行時間。注意:並行合併更多文件會使用更多的內存。如 'io.sort.factor' 設置太高或最大 JVM 堆棧設置太低,會產生過多地垃圾回收。Hadoop 默認值爲 10,建議使用更高值。 | |
I/O 排序內存緩衝 (MiB) | mapreduce.task.io.sort.mb | 512M | 頁面修改 | 當排序文件時要使用的內存緩衝總量。注意:此內存由 JVM 堆棧大小產生(也就是:總用戶 JVM 堆棧 - 這些內存 = 總用戶可用堆棧空間)。注意:Cloudera 的默認值不同於 Hadoop 的默認值;默認情況下,Cloudera 使用更大的緩衝,因爲現代機器通常有更多的 RAM。 | ||
洗牌期間並行傳輸的默認數量 | mapreduce.reduce.shuffle.parallelcopies | 10 | 50 | 頁面修改 | 複製(洗牌)階段期間 reduce 運行的並行傳輸的默認數量。此數量應在(節點數 * 每節點 map 時隙數)的平方根與節點數 * 每節點 map 時隙數/2 之間 | |
JobHistory Server 的 Java 堆棧大小(字節) | 10G | 頁面修改 | ||||
ResourceManager 的 Java 堆棧大小(字節) | 10G | 頁面修改 | ||||
容器內存 | yarn.nodemanager.resource.memory-mb | 20G | 頁面修改 | 每個節點分配給yarn跑任務的內存 | ||
容器虛擬 CPU 內核 | yarn.nodemanager.resource.cpu-vcores | 12 | 頁面修改 | 每個節點分配給yarn跑任務的cpu | ||
root隊列的所有子隊列 | yarn.scheduler.capacity.root.queues | default | 容量調度程序配置高級配置代碼段(安全閥) | 目前只配置了default,同時跑的任務多了可以配置不同隊列,每個隊列佔用的的資源可以在這裏調控 | ||
隊列的資源容量佔比(百分比)。 | yarn.scheduler.capacity.root.capacity | 100 | 容量調度程序配置高級配置代碼段(安全閥) | 系統繁忙時,每個隊列都應該得到設置的量的資源;當系統空閒時,該隊列的資源則可以被其他的隊列使用。同一層的所有隊列加起來必須是100%。 | 參考http://www.360doc.com/content/14/0117/15/834950_345972005.shtml,配置集羣同時運行的任務數量 | |
yarn.nodemanager.aux-services | mapreduce_shuffle | yarn-site.xml 的 YARN 服務高級配置代碼段(安全閥) | 跑mapreduce的必要參數 | |||
yarn.nodemanager.aux-services.mapreduce_shuffle.class | org.apache.hadoop.mapred.ShuffleHandler | yarn-site.xml 的 YARN 服務高級配置代碼段(安全閥) | 跑mapreduce的必要參數 | |||
yarn.log-aggregation.retain-check-interval-seconds | 86400 | yarn-site.xml 的 YARN 服務高級配置代碼段(安全閥) | 多長時間檢查一次日誌,並將滿足條件的刪除(yarn程序的日誌可以保存到hdfs,設置存儲期限) | |||
yarn.nodemanager.remote-app-log-dir | /data/logs/hadoop-yarn/apps | yarn-site.xml 的 YARN 服務高級配置代碼段(安全閥) | yarn執行程序的日誌存放目錄 | |||
JobTracker可以啓動的線程數 | mapreduce.jobtracker.handler.count | 10 | 100 | 頁面修改 | JobTracker可以啓動的線程數 | 暫時不考慮增大,任務增多的時候需要調整此參數 |
壓縮 Map 輸出 | mapreduce.map.output.compress | FALSE | TRUE | 頁面修改 | 如已啓用,將在將 map 輸出發送到網絡前對其進行壓縮。將是生成的客戶端配置的一部分。 | |
MapReduce Map 輸出的壓縮編碼解碼器 | mapreduce.map.output.compress.codec | org.apache.hadoop.io.compress.DefaultCodec | org.apache.hadoop.io.compress.SnappyCodec | 頁面修改 | 採用snappy壓縮 | |
默認啓動的reduce數 | mapreduce.job.reduces | 10 |
0.95 or 1.75 multiplied by (<no. of nodes> * <no. of maximum containers per node>) 本次測試使用25 |
頁面修改 | 提升reduce併發度 | reduce數量最好自己設置 |
單個shuffle可以佔用Java 堆棧的百分比上限 | mapreduce.reduce.shuffle.memory.limit.percent | 0.25 | 0.45 | yarn-site.xml 的 YARN 服務高級配置代碼段(安全閥) | 每個fetch取到的輸出的大小能夠佔的內存比的大小 | |
觸發merge的內存百分比 | mapreduce.reduce.shuffle.merge.percent | 0.66 | 0.9 | yarn-site.xml 的 YARN 服務高級配置代碼段(安全閥) | 在shuffle階段期間用於觸發merge的Java堆棧百分比 | |
傳輸的並行線程數 | mapreduce.tasktracker.http.threads | 40 | 100 | yarn-site.xml 的 YARN 服務高級配置代碼段(安全閥) | map和reduce是通過http進行數據傳輸的,這個是設置傳輸的並行線程數 | |
JobTracker MetaInfo Maxsize | mapreduce.job.split.metainfo.maxsize | 10000000 | -1 | 頁面修改 | 分割 metainfo 文件的大小上限。JobTracker 將不會嘗試讀取大於已配置值的分割 metainfo 文件。 | 大量小文件時有效 |
最大shuffle連接 | mapreduce.shuffle.max.connections | 0 | 暫不調整 | 頁面修改 | ||
客戶端線程計數 | yarn.resourcemanager.client.thread-count | 50 | 100 | 頁面修改 | 用於處理應用程序管理請求的線程數量。 |
優先級低 擴展性相關參數 |
調度程序線程計數 | yarn.resourcemanager.scheduler.client.thread-count | 50 | 100 | 頁面修改 | 用於通過調度器接口處理請求的線程數量。 |
優先級低 擴展性相關參數 |
管理客戶端線程計數 | yarn.resourcemanager.admin.client.thread-count | 1 | 10 | 頁面修改 | 用於處理 ResourceManager 管理接口的線程數量。 |
優先級低 擴展性相關參數 |
容器管理器線程計數 | yarn.nodemanager.container-manager.thread-count | 20 |
建議調整爲(no. of maximum containers per node)的整數倍 本次調整爲50 |
頁面修改 | 容器管理器使用的線程數,主要用於AM與NM通信。 | 優先級低 |
清理線程計數 | yarn.nodemanager.delete.thread-count | 4 | 16 | 頁面修改 | 用於清理臨時結果的線程數。 | 優先級低 |