1. 程式人生 > >保姆級教程,帶你認識大資料,從0到1搭建 Hadoop 叢集

保姆級教程,帶你認識大資料,從0到1搭建 Hadoop 叢集

# 大資料簡介,概念部分 概念部分,建議之前沒有任何大資料相關知識的朋友閱讀 ## 大資料概論 ### 什麼是大資料 大資料(Big Data)是指**無法在一定時間範圍**內用常規軟體工具進行捕捉、管理和處理的資料集合,是需要新處理模式才能具有更強的決策力、洞察發現力和流程優化能力的**海量、高增長率和多樣化的資訊資產** 粗略解讀以下 - 常規軟體工具:例如 JavaEE、Mysql(500-1000w資料)即使構建 Mysql 叢集,叢集中節點的數量也不是無限增加的。 - 海量、高增長率:資料本身基數大,每天新加入的資料也多 - 多樣化:除了文字資料外,還有圖片、視訊等資料 主要解決**海量資料的儲存**和**海量資料的分析計算**問題 ### 大資料的特點 1. 大量:根據 IDC “數字宇宙” 報告 預計到2020年,全球資料使用量將達到35.2ZB 2. 高速:在海量的資料面前,處理資料的效率就是企業的生命 3. 多樣 - 結構化資料:資料庫、文字為主 - 非結構化資料:網路日誌、音訊、視訊、圖片、地理位置資訊 4. 低價值密度:價值密度的高低與資料總量的大小成反比,快速對有價值資料“提純” ## 大資料應用場景 1. 物流倉儲:大資料分析系統助力商家精細化運營、提升銷量、節約成本 2. 零售:分析使用者消費習慣,為使用者購買商品提供方便,從而提升商品銷量 - 國外案例:紙尿褲+啤酒,分析過往的商超訂單發現紙尿褲+啤酒同時出現的概率很高,因此將這兩樣物品放在一起,刺激更多的人消費 3. 旅遊:深度結合大資料能力與旅遊行業需求,共建旅遊產業智慧管理、智慧服務和智慧營銷的未來 4. 商品廣告推薦:給使用者推薦可能喜歡的商品(千人千面) 5. 保險、金融、房地產:資料探勘、風險預測 ## 大資料發展前景 十八大:實施國家大資料發展戰略 十九大:推動網際網路、大資料、人工智慧和實體經濟深度融合 # Hadoop ## 簡介 Hadoop 是 Apache 基金會開發的分散式系統基礎架構,主要解決海量資料的儲存和分析計算問題。與大資料所研究的方向一樣。廣義上來說,Hadoop通常指的是 Hadoop 的生態圈。我理解就和 Javaer 常說的 Spring Cloud 一樣,並不特指一個技術,而是一些攜手解決一個複雜問題的集合 創始人 Doug Cutting ,借鑑谷歌三篇論文 GFS ---> HDFS 解決了資料儲存的問題 Map-Reduce ---> MR 解決了資料分析計算的問題 BigTable ---> HBase NoSQL資料庫 ### 三大發行版本 Apache 最原始,最基礎版本,適合入門學習 Cloudera CDH版本、2008年成立,2009年Doug Cutting 加盟。 主要在大型網際網路企業中使用,免費使用,付費維護 Hortonworks 2011年成立,文件較好,市場份額小 ### 優勢 - 高可靠性:底層維護多個數據副本(default 3) - 高擴充套件性:在叢集間分配任務資料,可方便的擴充套件數以千計的節點 - 高效性:在MapReduce的思想下,Hadoop是並行工作的 - 高容錯性:能夠自動將失敗的任務重新分配 ## 組成 ![image-20201201223419081](https://img2020.cnblogs.com/blog/1654189/202012/1654189-20201219162808048-1201253601.png) 2.x 時代的 Hadoop 將資料的計算分析和資源排程進行解耦,獨立出來 Yarn 專門負責 CPU、記憶體、硬碟、網路等資源的排程 ### HDFS 架構概述 - NameNode(nn) 儲存檔案的元資料,如檔名,目錄結構,檔案屬性(生成時間,副本數,檔案許可權)以及每個檔案的塊列表和塊所在的 DataNode 等 - DataNode(dn) 在本地檔案系統儲存檔案塊資料,以及塊資料的校驗和 - Secondary NameNode(2nn) 監控HDFS狀態的輔助後臺程式,每隔一段時間獲取HDFS元資料的快照 ### YARN 架構概述 ![image-20201201225516944](https://img2020.cnblogs.com/blog/1654189/202012/1654189-20201219162807507-24711042.png) ### MapReduce 架構概述 MapReduce 將計算過程分為兩個階段:Map 和 Reduce 1. Map 階段並行處理資料 2. Reduce 階段對 Map 結果進行彙總 ## 大資料技術生態體系 ![image-20201201231750466](https://img2020.cnblogs.com/blog/1654189/202012/1654189-20201219162806721-1811097948.png) ## 安裝 **建議在新的虛擬機器完成,方便後續克隆、搭建叢集** **安裝 hadoop 之前建議設定 linux IP 為靜態 IP、必須安裝 Java 以及配置環境變數、建議關閉防火牆(自己測試的時候)** ### 虛擬機器網路配置 我自己的網路配置 `vim /etc/sysconfig/network-scripts/ifcfg-ens33`, 網路採用 NAT 方式。一般 NAT模式對應的虛擬網絡卡是 vmnet8, 主機中 vmnet8 對應的虛擬網絡卡 ipv4 地址需要設定靜態 IP, 並且該 IP 與虛擬機器網路編輯器中 vmnet8 的 子網IP 、 以及下面配置中 IPADDR,GATEWAY,DNS1 前三段要一致。且第四段不能一樣。如圖所示 1. 主機虛擬網絡卡配置 ![image-20201216222815408](https://img2020.cnblogs.com/blog/1654189/202012/1654189-20201219162806022-1009058225.png) 2. 虛擬機器網路編輯器 ![image-20201216223155226](https://img2020.cnblogs.com/blog/1654189/202012/1654189-20201219162805731-1331339261.png) 3. 虛擬機器網路配置檔案 ```properties TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="static" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="ens33" UUID="5f66ee29-f43f-4761-abec-bd0656e25e09" DEVICE="ens33" ONBOOT="yes" IPV6_PRIVACY="no" IPADDR="192.168.100.104" GATEWAY="192.168.100.2" DNS1="192.168.100.2" ``` 我安裝的版本是 [2.10.1](https://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.10.1/hadoop-2.10.1.tar.gz) 下載上面的壓縮包在 linux 伺服器,解壓後放在 /opt/module 目錄下 配置環境變數 ```shell export HADOOP_HOME=/opt/module/hadoop export PATH=$PATH:$HADOOP_HOME/bin export PATH=$PATH:$HADOOP_HOME/sbin ``` 重新整理 profile 檔案 ```shell source /etc/profile ``` 測試安裝結果 ```shell # hadoop Usage: hadoop [--config confdir] [COMMAND | CLASSNAME] CLASSNAME run the class named CLASSNAME or where COMMAND is one of: fs run a generic filesystem user client version print the version jar run a jar file note: please use "yarn jar" to launch YARN applications, not this command. checknative [-a|-h] check native hadoop and compression libraries availability distcp copy file or directories recursively archive -archiveName NAME -p * create a hadoop archive classpath prints the class path needed to get the Hadoop jar and the required libraries credential interact with credential providers daemonlog get/set the log level for each daemon trace view and modify Hadoop tracing settings Most commands print help when invoked w/o parameters. ``` ## 執行模式 - 本地模式,單節點 Java 程序,一般用於除錯 - 偽分散式模式,適合計算機效能不是非常強勁的朋友使用(16GB記憶體以下) - 分散式 ### 本地模式 如果你的 Hadoop 包是從官方下載的正式包,預設情況下。Hadoop 配置的都是本地執行模式 #### 官方 Grep 案例 http://hadoop.apache.org/docs/r2.10.1/hadoop-project-dist/hadoop-common/SingleCluster.html ```shell $ mkdir input $ cp etc/hadoop/*.xml input $ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.1.jar grep input output 'dfs[a-z.]+' $ cat output/* ``` 出現下面的內容,則本地模式執行成功 ``` 1 dfsadmin ``` 正如我們看到的那樣 #### 官方 WordCount 案例 1. 建立輸入目錄(源目錄) wcinput , 新建文字檔案 wc.txt ```shell # mkdir wcinput # cd wcinput/ # touch wc.input # vim wc.input lvbanqihao ake libai libai hanxin wuya hanxin zhangsan direnjie guanyu guanyu zhangfei chengjisihan jing ``` 2. 執行 examples 中的 wordcount 功能 ```shell # hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.1.jar wordcount wcinput/ wcoutput ``` 3. 檢視結果 ```shell # cat wcoutput/* ake 1 chengjisihan 1 direnjie 1 guanyu 2 hanxin 2 jing 1 libai 2 lvbanqihao 1 wuya 1 zhangfei 1 zhangsan 1 ``` ### 偽分散式模式 修改 ${HADOOP_HOME}/etc/hadoop 下的配置檔案。含義見註釋, #### HDFS的配置和操作 ##### 配置 ###### core-site.xml ```xml fs.defaultFS
hdfs://linux101:9000
hadoop.tmp.dir /opt/module/hadoop/data/tmp ``` ###### hdfs-site.xml ```xml dfs.replication 1 ``` ###### hadoop-env.sh 修改 JAVA_HOME 路徑為 JDK 路徑 1. 通過 ` echo $JAVA_HOME` 命令顯示已配置的 JAVA_HOME 路徑。複製 2. vim 開啟 hadoop-env.sh 修改 ##### 啟動叢集 - 格式化 NameNode 僅在第一次啟動需要(格式化NameNode,會產生新的叢集id,導致NameNode和DataNode的叢集id不一致,叢集找不到已往資料。所以,格式NameNode時,一定要先刪除data資料和log日誌,然後再格式化NameNode) ```shell bin/hdfs namenode -format ``` - 啟動 NameNode ``` sbin/hadoop-daemon.sh start namenode ``` - 啟動 DataNode ``` sbin/hadoop-daemon.sh start datanode ``` ##### 檢視叢集 1. 首先通過 JDK 的 jps 命令檢視 NameNode 和 DataNode 程序是否啟動 2. 接著訪問該伺服器的 50070 埠(確保防火牆已經關閉,並且主機和虛擬機器可以互相訪問) 3. 檢視日誌檔案 ${HADOOP_HOME}/logs ##### 操作叢集 在HDFS檔案系統上**建立**一個input資料夾 ```shell bin/hdfs dfs -mkdir -p /user/keats/input ``` 將測試檔案內容**上傳**到檔案系統上 ```shell bin/hdfs dfs -put wcinput/wc.input /user/keats/input/ ``` **檢視**上傳的檔案是否正確 ```shell bin/hdfs dfs -ls /user/keats/input/ bin/hdfs dfs -cat /user/keats/ input/wc.input ``` 執行 MapReduce 程式 ```shell bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/keats/input/ /user/keats/output ``` 檢視輸出結果 ``` bin/hdfs dfs -cat /user/keats/output/* ``` 將測試檔案內容**下載**到本地 ``` hdfs dfs -get /user/keats/output/part-r-00000 ./wcoutput/ ``` **刪除**輸出結果 ``` hdfs dfs -rm -r /user/keats/output ``` #### YARN的操作和配置 ##### 配置 配置 JAVA_HOME ${HADOOP_HOME}/etc/hadoop/ - yarn-env.sh - mapred-env.sh 配置 yarn-site.xml ```xml yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.resourcemanager.hostname linux101 ``` 配置: (對mapred-site.xml.template重新命名為) mapred-site.xml ```xml mv mapred-site.xml.template mapred-site.xml mapreduce.framework.name yarn ``` ##### 啟動叢集 - 啟動前必須保證NameNode和DataNode已經啟動 - 啟動ResourceManager ``` sbin/yarn-daemon.sh start resourcemanager ``` - 啟動NodeManager ``` sbin/yarn-daemon.sh start nodemanager ``` #### 配置歷史伺服器 為了檢視程式的歷史執行情況,需要配置一下歷史伺服器。具體配置步驟如下 1. 配置 mapred-site.xml ```xml mapreduce.jobhistory.address
linux101:10020
mapreduce.jobhistory.webapp.address linux101:19888 ``` 2. 啟動歷史伺服器 ``` sbin/mr-jobhistory-daemon.sh start historyserver ``` 3. jps 檢視歷史伺服器是否啟動 4. 檢視JobHistory http://linux101:19888/jobhistory #### 配置日誌的聚集 日誌聚集概念:應用執行完成以後,將程式執行日誌資訊上傳到HDFS系統上。 日誌聚集功能好處:可以方便的檢視到程式執行詳情,方便開發除錯。 **注意**:開啟日誌聚集功能,需要重新啟動NodeManager 、ResourceManager和HistoryManager ##### 配置 yarn-site.xml ```xml yarn.log-aggregation-enable true yarn.log-aggregation.retain-seconds 604800 ``` ##### 重啟 NodeManager 、ResourceManager和HistoryManager 沒有 restart 命令,只能先關後開 或者自己寫個指令碼 關閉 ``` sbin/yarn-daemon.sh stop resourcemanager sbin/yarn-daemon.sh stop nodemanager sbin/mr-jobhistory-daemon.sh stop historyserver ``` 關閉完成後,執行 jps 進行驗證 開啟 ``` sbin/yarn-daemon.sh start resourcemanager sbin/yarn-daemon.sh start nodemanager sbin/mr-jobhistory-daemon.sh start historyserver ``` ##### 測試 刪除HDFS上已經存在的輸出檔案 ``` bin/hdfs dfs -rm -R /user/keats/output ``` 執行 wordcount ``` hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.1.jar wordcount /user/keats/input /user/keats/output ``` 檢視日誌 http://linux101:19888/jobhistory #### 配置檔案說明 Hadoop配置檔案分兩類:預設配置檔案和自定義配置檔案,只有使用者想修改某一預設配置值時,才需要修改自定義配置檔案,更改相應屬性值 ##### 預設配置檔案 | 要獲取的預設檔案 | 檔案存放在Hadoop的jar包中的位置 | | -------------------- | ---------------------------------------------------------- | | [core-default.xml] | hadoop-common-2.7.2.jar/ core-default.xml | | [hdfs-default.xml] | hadoop-hdfs-2.7.2.jar/ hdfs-default.xml | | [yarn-default.xml] | hadoop-yarn-common-2.7.2.jar/ yarn-default.xml | | [mapred-default.xml] | hadoop-mapreduce-client-core-2.7.2.jar/ mapred-default.xml | ##### 自定義配置檔案 core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四個配置檔案存放在$HADOOP_HOME/etc/hadoop這個路徑上,使用者可以根據專案需求重新進行修改配置 ## **完全分散式 ### 克隆虛擬機器 一般都通過克隆虛擬機器的方式來模擬多臺物理機,去模擬完全分散式。(錢多任性的土豪除外) - 首先確保被克隆虛擬機器以及配置靜態IP、安裝 JDK、關閉防火牆、配置好了 hosts 檔案 - 需要克隆 3 臺虛擬機器 - ip 對應著 102、103、104 - 更改主機名, centos7 使用這個命令: ` hostnamectl set-hostname linux103` - 另外 vmware15 + centos7 在修改 IP 並重啟後, mac 地址會自動變化,這個不用手動修改(視訊中 centos6 老師是手動改的) 全部搞定後,主機通過 moba 是可以通過虛擬機器主機名連線任何一個虛擬機器的(主機的 hosts 檔案也需要配置) ### 安裝 JDK(scp 命令學習) #### scp(secure copy)安全拷貝 這塊其實按照我剛才的克隆操作,jdk 已經安裝配置好。但是視訊中老師是克隆的空虛擬機器。我想大概是主要為了教大家 scp (secure copy) 命令 ```shell scp -r [username@hostname1:]/x/xxx [username@hostname2:]/x/xxx ``` 表示安全的從 hostname1 遞迴拷貝檔案到 hostname2 伺服器。 其中 [username@hostname1:] 表示可以省略,省略的時候表示當前伺服器本地的資料夾/檔案。username 表示遠端主機的使用者名稱,hostname 表示遠端主機的主機名 #### rsync 遠端同步工具 與 scp 不同的地方有兩處 一是該工具僅同步差異的檔案。相同的檔案不做操作 二是該工具只能操作本機和另外一臺機器之間的同步,不能操作兩個其他伺服器 **注意**:如果本機檔案路徑對應的是一個檔案,而外部機器對應的是一個不存在的資料夾。則該檔案內容會被拷貝成資料夾名稱的檔案 ``` rsync -rvl /x/xxx [username@hostname2:]/x/xxx ``` | 選項 | 功能 | | ---- | ------------ | | -r | 遞迴 | | -v | 顯示覆制過程 | | -l | 拷貝符號連線 | #### xsync叢集分發指令碼 學會了 rsync 命令之後,就可以進行叢集中兩個伺服器之間的檔案同步了,但是對於正式環境中動輒幾十成百上千臺伺服器來說,手敲命令同步檔案肯定不現實。因此需要寫一個分發命令的指令碼 該指令碼會讀取輸入指令碼後的第一個引數(要分發的檔案所在目錄) 在當前使用者目錄下,如果是 root 則在 root 目錄下建立 bin 資料夾,然後建立 xsync 檔案,內容如下 ```shell #!/bin/bash #1 獲取輸入引數個數,如果沒有引數,直接退出 pcount=$# if((pcount==0)); then echo no args; exit; fi #2 獲取檔名稱 p1=$1 fname=`basename $p1` echo fname=$fname #3 獲取上級目錄到絕對路徑 pdir=`cd -P $(dirname $p1); pwd` echo pdir=$pdir #4 獲取當前使用者名稱稱 user=`whoami` #5 迴圈 for((host=103; host<105; host++)); do echo ------------------- linux$host -------------- rsync -rvl $pdir/$fname $user@linux$host:$pdir done ``` 修改指令碼具有可執行許可權 `chmod +x xsync` ### 叢集配置 #### 叢集部署規劃 1. NameNode 和 SecondaryNameNode 佔用的記憶體是相當的。比較耗記憶體。因此需要分開 2. ResourceManager 也比較耗記憶體 | | linux102 | linux103 | linux104 | | ---- | ------------------ | --------------------------- | -------------------------- | | HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode | | YARN | NodeManager | ResourceManager NodeManager | NodeManager | #### 配置叢集 ##### 核心配置檔案 core-site.xml ```xml fs.defaultFS hdfs://linux102:9000 hadoop.tmp.dir /opt/module/hadoop/data/tmp ``` HDFS配置檔案 ##### 配置hadoop-env.sh ``` vi hadoop-env.sh export JAVA_HOME=/opt/module/jdk1.8 ``` ##### 配置hdfs-site.xml ```xml dfs.replication 3 dfs.namenode.secondary.http-address linux104:50090 ``` YARN配置檔案 ##### 配置yarn-env.sh ``` vi yarn-env.sh export JAVA_HOME=/opt/module/jdk1.8 ``` ##### 配置yarn-site.xml ```xml yarn.nodemanager.aux-services mapreduce_shuffle yarn.resourcemanager.hostname linux103 ``` MapReduce配置檔案 ##### 配置mapred-env.sh ``` vi mapred-env.sh export JAVA_HOME=/opt/module/jdk1.8 ``` ##### 配置mapred-site.xml 在該檔案中增加如下配置 ```xml mapreduce.framework.name yarn ``` ##### 在叢集上分發配置好的Hadoop配置檔案 xsync /opt/module/hadoop/ ##### 檢視檔案分發情況 cat /opt/module/hadoop/etc/hadoop/core-site.xml ### 叢集單點啟動 如果叢集是第一次啟動,需要**格式化NameNode** . 如果格式化遇到問題,需要重新排查問題後,重新格式化 因為我的虛擬機器在複製之前,做過偽分散式的測試。殘留了 data logs 目錄,需要**刪除三個虛擬機器上的 data/ logs/ 目錄**,如果你是按照我的步驟走的,也需要統統刪除後,再執行格式化操作 ``` hadoop namenode -format ``` 之後啟動三個節點的 102 節點的 namenode 和 三個節點的 datanode, 開啟 linux102:50070 檢視是否啟動成功 #### 配置ssh登入 ![img](https://img2020.cnblogs.com/blog/1654189/202012/1654189-20201219162804969-1772100510.png) 生成公鑰和私鑰,進入當前使用者根目錄下的 .ssh 目錄,我使用的 root 使用者 ``` ssh-keygen -t rsa ``` 將公鑰拷貝到要免密登入的目標機器上 ``` ssh-copy-id linux102 ssh-copy-id linux103 ssh-copy-id linux104 ``` 對於當前機器(例如 Linux102)通過 ssh 訪問自己時,也是需要密碼的。想要無祕訪問也需要將自己的公鑰追加到自己的認證檔案後面 ssh資料夾下(~/.ssh)的檔案功能解釋 | known_hosts | 記錄ssh訪問過計算機的公鑰(public key) | | --------------- | ------------------------------------- | | id_rsa | 生成的私鑰 | | id_rsa.pub | 生成的公鑰 | | authorized_keys | 存放授權過得無密登入伺服器公鑰 | ### 群起叢集 配置slaves ``` cd /opt/module/hadoop/etc/hadoop/ vim slaves ``` 配置所有 datanode 伺服器,不允許有空格 ``` linux102 linux103 linux104 ``` 分發給 103 102 ``` xsync slaves ``` **啟動叢集** ``` sbin/start-dfs.sh ``` 關閉叢集 ``` sbin/stop-dfs.sh ``` **啟動YARN** 老師視訊裡提到必須使用 103 節點起,我實測 2.10.1 版本是可以在 102 伺服器起的,不知是 sh 檔案更新還是 root 賬戶的原因 ``` sbin/start-yarn.sh ``` Web端測試 SecondaryNameNode 瀏覽器中輸入:http://linux104:50090/status.html ### 測試叢集 上傳小檔案 ``` hdfs dfs -put wcinput/wc.input / ``` 上傳大檔案 ``` hdfs dfs -put /opt/software/hadoop-2.10.1.tar.gz / ``` 大檔案佔了多個 block,如果下載的話多個塊又會被合併下載下來 ![image-20201217231439569](https://img2020.cnblogs.com/blog/1654189/202012/1654189-20201219162803783-1316639866.png) 實際檔案儲存在 ${HADOOP_HOME}/data/tmp 路徑下的子子子子子子目錄中,感興趣的讀者可以進去看看 ``` /opt/module/hadoop/data/tmp/dfs/data/current/BP-1473062949-192.168.100.102-1608214270058/current/finalized/subdir0/subdir0 ``` ### 叢集時間同步 #### 時間伺服器配置 1. 檢查 ntp 是否安裝 `rpm -qa|grep ntp` 機器都是克隆的,查下 102 就可 ``` ntp-4.2.6p5-10.el6.centos.x86_64 fontpackages-filesystem-1.41-1.1.el6.noarch ntpdate-4.2.6p5-10.el6.centos.x86_64 ``` 2. 修改 ntp 配置檔案 1. 授權區域網網段上的所有機器可以從這臺機器上查詢和同步時間 `vim /etc/ntp.conf` 2. 當該節點丟失網路連線,依然可以採用本地時間作為時間伺服器為叢集中的其他節點提供時間同步 ```conf # 開啟這段註釋,將 IP 第三段改成自己虛擬機器區域網第三段 restrict 192.168.100.0 mask 255.255.255.0 nomodify notrap # 新增下面的內容:當該節點丟失網路連線,依然可以採用本地時間作為時間伺服器為叢集中的其他節點提供時間同步 server 127.127.1.0 fudge 127.127.1.0 stratum 10 ``` 3. 修改 /etc/sysconfig/ntpd 檔案,讓硬體時間與系統時間一起同步 ``` vim /etc/sysconfig/ntpd 增加內容 SYNC_HWCLOCK=yes ``` 4. 重啟 ntpd 服務 `service ntpd status` 檢視狀態 start 啟動 5. 設定 ntpd 開機自啟 `chkconfig ntpd on` #### 其他伺服器配置 1天1次 ``` 0 0 * * 1-7 /usr/sbin/ntpdate linux102 ``` 修改伺服器時間 ``` date -s "2017-9-11 11:11:11" ``` 經過10分鐘等待,看時間是否同步(建議測試修改 cron 表示式,使同步間隔縮小) ``` d