系統環境:html
集羣各節點組件分配:java
安裝 Hadoop 集羣前先作好下面的準備工做,在修改配置文件的時候,建議在一個節點上修改,而後同步到其餘節點。由於要同步配置文件和在多個節點啓動服務,建議配置 ssh 無密碼登錄。node
# vim /etc/sysctl.conf #disable ipv6 net.ipv6.conf.all.disable_ipv6=1 net.ipv6.conf.default.disable_ipv6=1 net.ipv6.conf.lo.disable_ipv6=1
# sysctl -p
# cat /proc/sys/net/ipv6/conf/all/disable_ipv6 1
hostname bd-ops-test-74
# vim /etc/sysconfig/network 修改HOSTNAME=bd-ops-test-74
在每一個節點上都應有一份hosts表,在以後的配置中,對應節點名稱使用hostname # vim /etc/hosts 172.16.57.74 bd-ops-test-74 172.16.57.75 bd-ops-test-75 172.16.57.76 bd-ops-test-76 172.16.57.77 bd-ops-test-77
# setenforce 0 # vim /etc/sysconfig/selinux #修改SELINUX=disabled #清空iptables # iptables -F
這裏選擇 74 節點爲時鐘同步服務器,其餘節點爲客戶端同步時間到該節點。安裝ntp:linux
# yum install ntp -y
修改 74 上的配置文件 /etc/ntp.conf
web
driftfile /var/lib/ntp/drift restrict default nomodify notrap nopeer noquery restrict 127.0.0.1 restrict ::1 restrict 172.16.57.0 mask 255.255.255.0 nomodify notrap server 0.centos.pool.ntp.org iburst server 1.centos.pool.ntp.org iburst server 2.centos.ntp.org iburst server 3.centos.pool.ntp.org iburst includefile /etc/ntp/crypto/pw keys /etc/ntp/keys disable monitor
啓動 ntp:apache
#設置開機啓動 # chkconfig ntpd on # service ntpd start
ntpq用來監視ntpd操做,使用標準的NTP模式6控制消息模式,並與NTP服務器通訊。bootstrap
ntpq -p
查詢網絡中的NTP服務器,同時顯示客戶端和每一個服務器的關係。vim
#ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *dns1.synet.edu. 202.118.1.47 2 u 57 64 377 41.912 -3.877 4.628
在76和77節點上執行下面操做:centos
# ntpdate bd-ops-test-74
Ntpd啓動的時候一般須要一段時間大概5分鐘進行時間同步,因此在ntpd剛剛啓動的時候還不能正常提供時鐘服務,報錯"no server suitable for synchronization found"。啓動時候須要等待5分鐘。bash
過一下子咱們就能夠看到同步成功了:
#ntpdate bd-ops-test-74 24 Aug 22:32:14 ntpdate[14024]: step time server 172.16.57.74 offset -77.582859 sec
此過程再也不贅述,本例中jdk安裝目錄爲/opt/programs/jdk1.7.0_67
從官方下載cdh5.5壓縮倉庫包,傳送門:http://archive.cloudera.com/cdh5/repo-as-tarball/5.5.1/cdh5.5.1-centos5.tar.gz
解壓後配置本地倉庫使用。
Zookeeper 至少須要3個節點,而且節點數要求是基數,這裏在7五、7六、77上安裝 Zookeeper。
在須要安裝的節點上執行:
# yum install zookeeper* -y
設置 zookeeper 配置 /etc/zookeeper/conf/zoo.cfg
maxClientCnxns=50 tickTime=2000 initLimit=10 syncLimit=5 dataDir=/opt/zookeeper/zkdata clientPort=2181 dataLogDir=/opt/zookeeper/zkdatalog server.1=172.16.57.75:2888:3888 server.2=172.16.57.76:2888:3888 server.3=172.16.57.77:2888:3888
指定jdk路徑/etc/zookeeper/conf/java.env
export JAVA_HOME=/opt/programs/jdk1.7.0_67/
將配置文件同步到其餘節點:
# scp -r /etc/zookeeper/conf root@bd-ops-test-76:/etc/zookeeper/ # scp -r /etc/zookeeper/conf root@bd-ops-test-77:/etc/zookeeper/
在每一個節點上初始化並啓動 zookeeper,注意 myid 的值須要和 zoo.cfg 中的編號一致。
在 75 節點運行:
# service zookeeper-server init --myid=1 # service zookeeper-server start
在 76 節點運行:
# service zookeeper-server init --myid=2 # service zookeeper-server start
在 77 節點運行:
# service zookeeper-server init --myid=3 # service zookeeper-server start
經過下面命令測試是否啓動成功:
# zookeeper-client -server bd-ops-test-74:2181
根據文章開頭的節點規劃,
在74,75上安裝 hadoop-hdfs-namenode,
# yum install hadoop-hdfs-namenode -y
在74,75,76,77上安裝hadoop-hdfs-datanode
# yum install hadoop-hdfs-datanode -y
建立 /etc/hadoop/conf/hadoop-env.sh,主要指定的是jdk、hadoop等相關安裝目錄
# cat hadoop-env.sh export HADOOP_MAPRED_HOME=/usr/lib/hadoop-mapreduce export HADOOP_HOME=/usr/lib/hadoop export JAVA_HOME=/opt/programs/jdk1.7.0_67/ export HADOOP_NAMENODE_OPTS="-XX:+UseParallelGC -XX:ParallelGCThreads=8" export HADOOP_HEAPSIZE=16384 export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_HOME/lib/hadoop-lzo.jar
在/etc/hadoop/conf/slaves中指定集羣的hostname
# cat slaves bd-ops-test-74 bd-ops-test-75 bd-ops-test-76 bd-ops-test-77
在/etc/hadoop/conf/core-site.xml
中設置fs.defaultFS
屬性值,該屬性指定NameNode是哪個節點以及使用的文件系統是file仍是hdfs,格式:hdfs://<namenode host>:<namenode port>/
,默認的文件系統是file:///
:
<property> <name>fs.defaultFS</name> <value>hdfs://bd-ops-test:8020</value> </property>
在/etc/hadoop/conf/hdfs-site.xml
中設置dfs.permissions.superusergroup
屬性,該屬性指定hdfs的超級用戶,默認爲hdfs,你能夠修改成hadoop:
<property> <name>dfs.permissions.superusergroup</name> <value>hadoop</value> </property>
更多的配置信息說明,請參考 Apache Cluster Setup
在hadoop中默認的文件路徑以及權限要求以下:
目錄 全部者 權限 默認路徑 hadoop.tmp.dir hdfs:hdfs drwx------ /var/hadoop dfs.namenode.name.dir hdfs:hdfs drwx------ file://${hadoop.tmp.dir}/dfs/name dfs.datanode.data.dir hdfs:hdfs drwx------ file://${hadoop.tmp.dir}/dfs/data dfs.namenode.checkpoint.dir hdfs:hdfs drwx------ file://${hadoop.tmp.dir}/dfs/namesecondary
說明你能夠在 hdfs-site.xm l中只配置hadoop.tmp.dir
,也能夠分別配置上面的路徑。這裏使用分別配置的方式,hdfs-site.xml中配置以下:
<property> <name>dfs.namenode.name.dir</name> <value>file:///opt/hadoop/data/hdfs/nn</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:///opt/hadoop/data1/hdfs/dn,file:///opt/hadoop/data2/hdfs/dn,file:///opt/hadoop/data3/hdfs/dn</value> </property>
在NameNode上手動建立 dfs.name.dir
或 dfs.namenode.name.dir
的本地目錄:
mkdir -p /opt/hadoop/data/hdfs/nn
在DataNode上手動建立 dfs.data.dir
或 dfs.datanode.data.dir
的本地目錄:
mkdir -p /opt/hadoop/data{1,2,3}/hdfs/dn
修改上面目錄全部者:
chown -R hdfs:hdfs /opt/hadoop/*
hadoop的進程會自動設置 dfs.data.dir
或 dfs.datanode.data.dir
,可是 dfs.name.dir
或 dfs.namenode.name.dir
的權限默認爲755,須要手動設置爲700:
# chmod 700 /opt/hadoop/data/hdfs/nn
注意:DataNode的本地目錄能夠設置多個(我這裏有三個),你能夠設置 dfs.datanode.failed.volumes.tolerated
參數的值,表示可以容忍不超過該個數的目錄失敗。
回收站功能默認是關閉的,建議打開。在 /etc/hadoop/conf/core-site.xml
中添加以下兩個參數:
fs.trash.interval
,該參數值爲時間間隔,單位爲分鐘,默認爲0,表示回收站功能關閉。該值表示回收站中文件保存多長時間,若是服務端配置了該參數,則忽略客戶端的配置;若是服務端關閉了該參數,則檢查客戶端是否有配置該參數;fs.trash.checkpoint.interval
,該參數值爲時間間隔,單位爲分鐘,默認爲0。該值表示檢查回收站時間間隔,該值要小於fs.trash.interval
,該值在服務端配置。若是該值設置爲0,則使用 fs.trash.interval
的值。在NameNode節點上安裝:
# yum install hadoop-httpfs -y
而後修改 /etc/hadoop/conf/core-site.xml配置代理用戶:
<property> <name>hadoop.proxyuser.httpfs.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.httpfs.groups</name> <value>*</value> </property>
安裝lzo:
# yum install hadoop-lzo* impala-lzo -y
最後,在 /etc/hadoop/conf/core-site.xml
中添加以下配置:
<property> <name>io.compression.codecs</name> <value>org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec, org.apache.hadoop.io.compress.BZip2Codec,com.hadoop.compression.lzo.LzoCodec, com.hadoop.compression.lzo.LzopCodec</value> </property> <property> <name>io.compression.codec.lzo.class</name> <value>com.hadoop.compression.lzo.LzoCodec</value> </property>
更多關於LZO信息,請參考:Using LZO Compression
cdh 的 rpm 源中默認已經包含了 snappy ,直接在每一個節點安裝Snappy:
yum install snappy snappy-devel -y
而後,在 core-site.xml
中修改io.compression.codecs
的值,添加 org.apache.hadoop.io.compress.SnappyCodec
。
使 snappy 對 hadoop 可用:
ln -sf /usr/lib64/libsnappy.so /usr/lib/hadoop/lib/native/
在 7五、7六、77 上安裝 hadoop-hdfs-journalnode
yum install hadoop-hdfs-journalnode -y
在 7四、75(namenode) 上安裝 hadoop-hdfs-zkfc:
yum install hadoop-hdfs-zkfc -y
修改/etc/hadoop/conf/core-site.xml,作以下修改:
<property> <name>fs.defaultFS</name> <value>hdfs://bd-ops-test:8020</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>bd-ops-test-75:2181,bd-ops-test-76:2181,bd-ops-test-77:2181</value> </property>
修改/etc/hadoop/conf/hdfs-site.xml
<property> <name>dfs.nameservices</name> <value>bd-ops-test</value> </property> <property> <name>dfs.ha.namenodes.bd-ops-test</name> <value>bd-ops-test-74,bd-ops-test-75</value> </property> <property> <name>dfs.namenode.rpc-address.bd-ops-test.bd-ops-test-74</name> <value>bd-ops-test-74:8020</value> </property> <property> <name>dfs.namenode.rpc-address.bd-ops-test.bd-ops-test-75</name> <value>bd-ops-test-75:8020</value> </property> <property> <name>dfs.namenode.http-address.bd-ops-test.bd-ops-test-74</name> <value>bd-ops-test-74:50070</value> </property> <property> <name>dfs.namenode.http-address.bd-ops-test.bd-ops-test-75</name> <value>bd-ops-test-75:50070</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://bd-ops-test-75:8485;bd-ops-test-76:8485;bd-ops-test-77:8485/bd-ops-test</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/opt/hadoop/data1/hdfs/jn</value> </property> <property> <name>dfs.client.failover.proxy.provider.bd-ops-test</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/var/lib/hadoop-hdfs/.ssh/id_rsa</value> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property>
將74上的配置文件同步到每個節點:
scp -r /etc/hadoop/conf root@bd-ops-test-75:/etc/hadoop/ scp -r /etc/hadoop/conf root@bd-ops-test-76:/etc/hadoop/ scp -r /etc/hadoop/conf root@bd-ops-test-77:/etc/hadoop/
在74節點格式化NameNode:
sudo -u hdfs hadoop namenode -format
啓動7五、7六、77上的 hadoop-hdfs-journalnode 服務
service hadoop-hdfs-journalnode start
在namenode上初始化共享存儲,若是沒有格式化,則先格式化:
hdfs namenode -initializeSharedEdits
啓動第一個namenode(74)
service hadoop-hdfs-namenode start
75做爲 Standby NameNode,運行
sudo -u hdfs hadoop namenode -bootstrapStandby
而後,啓動 Standby NameNode:
service hadoop-hdfs-namenode start
在兩個NameNode上,即74和75,安裝hadoop-hdfs-zkfc
yum install hadoop-hdfs-zkfc -y
在任意一個NameNode上下面命令,其會建立一個znode用於自動故障轉移
hdfs zkfc -formatZK
而後再兩個 NameNode 節點上啓動zkfc:
service hadoop-hdfs-zkfc start
在datanode節點運行:
service hadoop-hdfs-datanode start
若是安裝了HttpFS,則啓動 HttpFS 服務:
service hadoop-httpfs start
使用 curl 運行下面命令,能夠測試 webhdfs 並查看執行結果:
# curl "http://localhost:14000/webhdfs/v1?op=gethomedirectory&user.name=hdfs" {"Path":"\/user\/hdfs"}
更多的 API,請參考 WebHDFS REST API
分別訪問 http://bd-ops-test-74:50070/ 和 http://bd-ops-test-75:50070/ 查看誰是 active namenode,誰是 standyby namenode。
查看某Namenode的狀態:
#查看nn1狀態 $ sudo -u hdfs hdfs haadmin -getServiceState bd-ops-test-74 active #查看nn2狀態 $ sudo -u hdfs hdfs haadmin -getServiceState bd-ops-test-75 standby
執行手動切換:
sudo -u hdfs hdfs haadmin -failover bd-ops-test-74 bd-ops-test-75
再次訪問 http://bd-ops-test-74:50070/ 和 http://bd-ops-test-75:50070/ 查看誰是 active namenode,誰是 standyby namenode。
根據文章開頭的節點規劃,7四、75 爲resourcemanager節點,74,、7五、7六、77 爲nodemanager節點,historyserver 裝在 76 節點上。
在74,75安裝:
yum install hadoop-yarn hadoop-yarn-resourcemanager -y
在74-77安裝:
yum install hadoop-yarn hadoop-yarn-nodemanager hadoop-mapreduce -y
在76安裝:
yum install hadoop-mapreduce-historyserver hadoop-yarn-proxyserver -y
要想使用YARN,須要在 /etc/hadoop/conf/mapred-site.xml
中作以下配置:
<property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
修改/etc/hadoop/conf/yarn-site.xml,配置resourcemanager的節點名稱、一些服務的端口號以及ha的配置:
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <!-- RM Manager Configd --> <property> <name>yarn.resourcemanager.connect.retry-interval.ms</name> <value>2000</value> </property> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.ha.automatic-failover.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.ha.automatic-failover.embedded</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yarn-rm-cluster</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>bd-ops-test-74,bd-ops-test-75</value> </property> <property> <name>yarn.resourcemanager.ha.id</name> <value>bd-ops-test-74</value> </property> <!-- <property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value> </property> --> <!--scheduler capacity --> <property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value> </property> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> <property> <name>yarn.resourcemanager.zk-address</name> <value>bd-ops-test-75:2181,bd-ops-test-76:2181,bd-ops-test-77:2181</value> </property> <property> <name>yarn.resourcemanager.zk.state-store.address</name> <value>bd-ops-test-75:2181,bd-ops-test-76:2181,bd-ops-test-77:2181</value> </property> <property> <name>yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms</name> <value>5000</value> </property> <!-- RM1 Configs--> <property> <name>yarn.resourcemanager.address.bd-ops-test-74</name> <value>bd-ops-test-74:23140</value> </property> <property> <name>yarn.resourcemanager.scheduler.address.bd-ops-test-74</name> <value>bd-ops-test-74:23130</value> </property> <property> <name>yarn.resourcemanager.webapp.https.address.bd-ops-test-74</name> <value>bd-ops-test-74:23189</value> </property> <property> <name>yarn.resourcemanager.webapp.address.bd-ops-test-74</name> <value>bd-ops-test-74:23188</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address.bd-ops-test-74</name> <value>bd-ops-test-74:23125</value> </property> <property> <name>yarn.resourcemanager.admin.address.bd-ops-test-74</name> <value>bd-ops-test-74:23141</value> </property> <!-- RM2 Configs --> <property> <name>yarn.resourcemanager.address.bd-ops-test-75</name> <value>bd-ops-test-75:23140</value> </property> <property> <name>yarn.resourcemanager.scheduler.address.bd-ops-test-75</name> <value>bd-ops-test-75:23130</value> </property> <property> <name>yarn.resourcemanager.webapp.https.address.bd-ops-test-75</name> <value>bd-ops-test-75:23189</value> </property> <property> <name>yarn.resourcemanager.webapp.address.bd-ops-test-75</name> <value>bd-ops-test-75:23188</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address.bd-ops-test-75</name> <value>bd-ops-test-75:23125</value> </property> <property> <name>yarn.resourcemanager.admin.address.bd-ops-test-75</name> <value>bd-ops-test-75:23141</value> </property> <!-- Node Manager Configs --> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>61440</value> </property> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>24</value> </property> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>86400</value> </property> <property> <name>yarn.log-aggregation.retain-check-interval-seconds</name> <value>8640</value> </property> <property> <name>yarn.nodemanager.localizer.address</name> <value>0.0.0.0:23344</value> </property> <property> <name>yarn.nodemanager.webapp.address</name> <value>0.0.0.0:23999</value> </property> <property> <name>yarn.web-proxy.address</name> <value>0.0.0.0:8080</value> </property> <property> <name>mapreduce.shuffle.port</name> <value>23080</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <property> <name>yarn.nodemanager.local-dirs</name> <value>file:///opt/hadoop/data1/yarn/dn,file:///opt/hadoop/data2/yarn/dn,file:///opt/hadoop/data3/yarn/dn</value> </property> <property> <name>yarn.nodemanager.log-dirs</name> <value>file:///opt/hadoop/data1/yarn/logs,file:///opt/hadoop/data2/yarn/logs,file:///opt/hadoop/data3/yarn/logs</value> </property> <!-- <property> <name>yarn.nodemanager.disk-health-checker.min-healthy-disks</name> <value>0</value> </property> <property> <name>yarn.nodemanager.disk-health-checker.enable</name> <value>false</value> </property> --> <property> <name>yarn.nodemanager.remote-app-log-dir</name> <value>hdfs://bd-ops-test:8020/yarn/apps</value> </property> <property> <name>yarn.application.classpath</name> <value> $HADOOP_CONF_DIR, $HADOOP_COMMON_HOME/*,$HADOOP_COMMON_HOME/lib/*, $HADOOP_HDFS_HOME/*,$HADOOP_HDFS_HOME/lib/*, $HADOOP_MAPRED_HOME/*,$HADOOP_MAPRED_HOME/lib/*, $HADOOP_YARN_HOME/*,$HADOOP_YARN_HOME/lib/* </value> </property> <property> <name>yarn.web-proxy.address</name> <value>172.16.57.76:41202</value> </property> <property> <name>yarn.log.server.url</name> <value>http://bd-ops-test-76:19888/jobhistory/logs</value> </property> </configuration>
在 /etc/hadoop/conf/mapred-site.xml
中配置 MapReduce History Server:
<property> <name>mapreduce.jobhistory.address</name> <value>bd-ops-test-76:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>bd-ops-test-76:19888</value> </property>
此外,確保 mapred、yarn 用戶可以使用代理,在 /etc/hadoop/conf/core-site.xml
中添加以下參數:
<property> <name>hadoop.proxyuser.mapred.groups</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.mapred.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.yarn.groups</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.yarn.hosts</name> <value>*</value> </property>
配置 Staging 目錄:
<property> <name>yarn.app.mapreduce.am.staging-dir</name> <value>/user</value> </property>
並在 hdfs 上建立相應的目錄:
# sudo -u hdfs hadoop fs -mkdir -p /user # sudo -u hdfs hadoop fs -chmod 777 /user # sudo -u hdfs hadoop fs -mkdir -p /user/history # sudo -u hdfs hadoop fs -chmod -R 1777 /user/history # sudo -u hdfs hadoop fs -chown mapred:hadoop /user/history
建立 yarn.nodemanager.local-dirs
和 yarn.nodemanager.log-dirs
參數對應的目錄:
# mkdir -p mkdir /opt/hadoop/data{1..3}/yarn/{dn,logs} # chown -R yarn:yarn /opt/hadoop/data{1..3}/yarn
同步配置文件到整個集羣。
在每一個節點啓動 YARN :
for x in `ls /etc/init.d/|grep hadoop-yarn` ; do service $x start ; done
在 76節點啓動 mapred-historyserver :
/etc/init.d/hadoop-mapreduce-historyserver start
在 hdfs 運行以後,建立 /tmp
臨時目錄,並設置權限爲 1777
:
sudo -u hdfs hadoop fs -mkdir /tmp sudo -u hdfs hadoop fs -chmod -R 1777 /tmp
經過http://bd-ops-test-74:23188/cluster/cluster, http:// bd-ops-test-75:23188/cluster/cluster , 能夠查看誰是actice誰是standby,經過 http://cdh1:19888/ 能夠訪問 JobHistory 的管理頁面。
查看ResourceManager狀態:
yarn rmadmin -getServiceState bd-ops-test-73
執行手動切換:
yarn rmadmin -transitionToActive --forcemanual bd-ops-test-74