1、概要java
因爲工做須要,最近一段時間開始接觸學習hadoop相關的東西,目前公司的實時任務和離線任務都跑在一個hadoop集羣,離線任務的特色就是天天定時跑,任務跑完了資源就空閒了,爲了合理的利用資源,咱們打算在搭一個集羣用於跑離線任務,計算節點和儲存節點分離,計算節點結合aws的Auto Scaling(自動擴容、縮容服務)以及競價實例,動態調整,在跑任務的時候拉起一批實例,任務跑完就自動釋放掉服務器,本文記錄下hadoop集羣的搭建過程,方便本身往後查看,也但願能幫到初學者,本文全部軟件都是經過yum安裝,你們也能夠下載相應的二進制文件進行安裝,使用哪一種方式安裝,從屬我的習慣。node
2、環境web
一、角色介紹shell
10.10.103.246 NameNode zkfc journalNode QuorumaPeerMain DataNode ResourceManager NodeManager WebAppProxyServer JobHistoryServer 10.10.103.144 NameNode zkfc journalNode QuorumaPeerMain DataNode ResourceManager NodeManager WebAppProxyServer 10.10.103.62 zkfc journalNode QuorumaPeerMain DataNode NodeManager
10.10.20.64 journalNode QuorumaPeerMain NameNode zkfc 10.10.40.212 journalNode QuorumaPeerMain NameNode zkfc 10.10.102.207 journalNode QuorumaPeerMain 10.10.103.15 ResourceManager WebAppProxyServer JobHistoryServer NodeManager DataNode 10.10.30.83 ResourceManager WebAppProxyServer JobHistoryServer NodeManager DataNode
二、基礎環境說明apache
a、系統版本bootstrap
咱們用的是aws的ec2,用的aws本身定製過的系統,不過和redhat基本相同,內核版本:4.9.20-10.30.amzn1.x86_64vim
b、java版本瀏覽器
java version "1.8.0_121"
c、hadoop版本緩存
hadoop-2.6.0
d、cdh版本bash
cdh5.11.0
e、關於主機名,由於我這裏用的aws的ec2,默認已有主機名,而且內網能夠解析,故就不單獨作主機名的配置了,若是你的主機名內網不能解析,請必定要配置主機名,集羣內部通信不少組件使用的是主機名
3、配置部署
一、設置yum源
vim /etc/yum.repos.d/cloudera.repo [cloudera-cdh5-11-0] # Packages for Cloudera's Distribution for Hadoop, Version 5.11.0, on RedHat or CentOS 6 x86_64 name=Cloudera's Distribution for Hadoop, Version 5.11.0 baseurl=http://archive.cloudera.com/cdh5/redhat/6/x86_64/cdh/5.11.0/ gpgkey=http://archive.cloudera.com/cdh5/redhat/6/x86_64/cdh/RPM-GPG-KEY-cloudera gpgcheck=1 [cloudera-gplextras5b2] # Packages for Cloudera's GPLExtras, Version 5.11.0, on RedHat or CentOS 6 x86_64 name=Cloudera's GPLExtras, Version 5.11.0 baseurl=http://archive.cloudera.com/gplextras5/redhat/6/x86_64/gplextras/5.11.0/ gpgkey=http://archive.cloudera.com/gplextras5/redhat/6/x86_64/gplextras/RPM-GPG-KEY-cloudera gpgcheck=1
PS:我這裏安裝的5.11.0,若是想安裝低版本或者高版本,根據本身的需求修改版本號便可
二、安裝配置zookeeper集羣
yum -y install zookeeper zookeeper-server
vi /etc/zookeeper/conf/zoo.cfg tickTime=2000 initLimit=10 syncLimit=5 dataDir=/data/zookeeper clientPort=2181 maxClientCnxns=0 server.1=10.10.103.144:2888:3888 server.2=10.10.103.226:2888:3888 server.3=10.10.103.62:2888:3888 autopurge.snapRetainCount=3 autopurge.purgeInterval=1
mkdir /data/zookeeper #建立datadir目錄 /etc/init.d/zookeeper-server init #全部節點先初始化 echo 1 > /data/zookeeper/myid #10.10.103.144上操做 echo 2 > /data/zookeeper/myid #10.10.103.226上操做 echo 3 > /data/zookeeper/myid #10.10.103.62上操做 /etc/init.d/zookeeper-server #啓動服務 /usr/lib/zookeeper/bin/zkServer.sh status #查看全部節點狀態,其中只有一個節點是Mode: leader就正常 了
三、安裝
a、10.10.103.246和10.10.103.144安裝
yum -y install hadoop hadoop-client hadoop-hdfs hadoop-hdfs-namenode hadoop-hdfs-zkfc hadoop-hdfs-journalnode hadoop-hdfs-datanode hadoop-mapreduce-historyserver hadoop-yarn-nodemanager hadoop-yarn-proxyserver hadoop-yarn hadoop-mapreduce hadoop-yarn-resourcemanager hadoop-lzo* impala-lzo
b、10.10.103.62上安裝
yum -y install hadoop hadoop-client hadoop-hdfs hadoop-hdfs-journalnode hadoop-hdfs-datanode hadoop-lzo* impala-lzo hadoop-yarn hadoop-mapreduce hadoop-yarn-nodemanager
PS:
一、通常小公司,計算節點(ResourceManager)和儲存節點(NameNode)的主節點部署在兩臺服務器上作HA,計算節點(NodeManager)和儲存節點(DataNode)部署在多臺服務器上,每臺服務器上都啓動NodeManager和DataNode服務。
二、若是大集羣,可能須要計算資源和儲存資源分離,集羣的各個角色都有服務器單獨部署,我的建議劃分以下:
a、儲存節點
NameNode:
須要安裝hadoop hadoop-client hadoop-hdfs hadoop-hdfs-namenode hadoop-hdfs-zkfc hadoop-lzo* impala-lzo
DataNode:
須要安裝hadoop hadoop-client hadoop-hdfs hadoop-hdfs-datanode hadoop-lzo* impala-lzo
QJM集羣:
須要安裝hadoop hadoop-hdfs hadoop-hdfs-journalnode zookeeper zookeeper-server
b、計算節點
ResourceManager:
須要安裝hadoop hadoop-client hadoop-yarn hadoop-mapreduce hadoop-yarn-resourcemanager
WebAppProxyServer:
須要安裝 hadoop hadoop-yarn hadoop-mapreduce hadoop-yarn-proxyserver
JobHistoryServer:
須要安裝 hadoop hadoop-yarn hadoop-mapreduce hadoop-mapreduce-historyserver
NodeManager:
須要安裝hadoop hadoop-client hadoop-yarn hadoop-mapreduce hadoop-yarn-nodemanager
四、配置
a、建立目錄並設置權限
mkdir -p /data/hadoop/dfs/nn #datanode上操做 chown hdfs:hdfs /data/hadoop/dfs/nn/ -R #datanode上操做 mkdir -p /data/hadoop/dfs/dn #namenode上操做 chown hdfs:hdfs /data/hadoop/dfs/dn/ -R #namenode上操做 mkdir -p /data/hadoop/dfs/jn #journalnode上操做 chown hdfs:hdfs /data/hadoop/dfs/jn/ -R #journalnode上操做 mkdir /data/hadoop/yarn -p #nodemanager上操做 chown yarn:yarn /data/hadoop/yarn -R #nodemanager上操做
b、撰寫配置文件
vim /etc/hadoop/conf/capacity-scheduler.xml <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property><name>yarn.scheduler.capacity.maximum-applications</name><value>10000</value></property> <property><name>yarn.scheduler.capacity.maximum-am-resource-percent</name><value>0.4</value></property> <property><name>yarn.scheduler.capacity.resource-calculator</name><value>org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator</value></property> <property><name>yarn.scheduler.capacity.node-locality-delay</name><value>30</value></property> <property><name>yarn.scheduler.capacity.root.queues</name><value>default,server,offline</value></property> <property><name>yarn.scheduler.capacity.root.default.capacity</name><value>95</value></property> <property><name>yarn.scheduler.capacity.root.default.maximum-capacity</name><value>100</value></property> <property><name>yarn.scheduler.capacity.root.default.user-limit-factor</name><value>100</value></property> <property><name>yarn.scheduler.capacity.root.default.state</name><value>running</value></property> <property><name>yarn.scheduler.capacity.root.default.acl_submit_applications</name><value>*</value></property> <property><name>yarn.scheduler.capacity.root.default.acl_administer_queue</name><value>*</value></property> <property><name>yarn.scheduler.capacity.root.server.capacity</name><value>0</value></property> <property><name>yarn.scheduler.capacity.root.server.maximum-capacity</name><value>5</value></property> <property><name>yarn.scheduler.capacity.root.server.user-limit-factor</name><value>100</value></property> <property><name>yarn.scheduler.capacity.root.server.acl_submit_applications</name><value>haijun.zhao</value></property> <property><name>yarn.scheduler.capacity.root.server.acl_administer_queue</name><value>haijun.zhao</value></property> <property><name>yarn.scheduler.capacity.root.server.maximum-am-resource-percent</name><value>0.05</value></property> <property><name>yarn.scheduler.capacity.root.server.state</name><value>running</value></property> <property><name>yarn.scheduler.capacity.root.offline.capacity</name><value>5</value></property> <property><name>yarn.scheduler.capacity.root.offline.maximum-capacity</name><value>100</value></property> <property><name>yarn.scheduler.capacity.root.offline.user-limit-factor</name><value>100</value></property> <property><name>yarn.scheduler.capacity.root.offline.acl_submit_applications</name><value>hadoop,haifeng.huang,hongan.pan,rujing.zhang,lingjing.li</value></property> <property><name>yarn.scheduler.capacity.root.offline.acl_administer_queue</name><value>hadoop,haifeng.huang,hongan.pan,rujing.zhang,linjing.li</value></property> <property><name>yarn.scheduler.capacity.root.offline.maximum-am-resource-percent</name><value>0.8</value></property> <property><name>yarn.scheduler.capacity.root.offline.state</name><value>running</value></property> </configuration> ~~~~~~~~~~~~~~~~~分界線~~~~~~~~~~~~~~~~~~~
vim /etc/hadoop/conf/core-site.xml <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <!-- 定義默認的文件系統--> <property><name>fs.defaultFS</name><value>hdfs://mycluster/</value></property> <!-- 開啓垃圾回收,默認不開啓,單位分鐘 --> <property><name>fs.trash.interval</name><value>1440</value></property> <!-- 可用於壓縮/解壓縮的壓縮編×××類,逗號分隔列表 --> <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,org.apache.hadoop.io.compress.SnappyCodec</value></property> <!-- 開啓lzo支持--> <property><name>io.compression.codec.lzo.class</name><value>com.hadoop.compression.lzo.LzoCodec</value></property> <!-- oozie user setting --> <property><name>hadoop.proxyuser.oozie.hosts</name><value>*</value></property> <property><name>hadoop.proxyuser.oozie.groups</name><value>*</value></property> <!-- HTTPFS proxy user setting --> <property><name>hadoop.proxyuser.httpfs.hosts</name><value>*</value></property> <property><name>hadoop.proxyuser.httpfs.groups</name><value>*</value></property> <!-- aws key id --> <property><name>fs.s3n.awsAccessKeyId</name><value>AKIAIXxxx</value></property> <property><name>fs.s3.awsAccessKeyId</name><value>AKIAIXxxx</value></property> <property><name>fs.s3bfs.awsAccessKeyId</name><value>AKIAIXxxx</value></property> <property><name>fs.s3bfs.awsSecretAccessKey</name><value>Hdne1k/2c90Ixxxxxx</value></property> <property><name>fs.s3.awsSecretAccessKey</name><value>Hdne1k/2c90Ixxxxxx</value></property> <property><name>fs.s3n.awsSecretAccessKey</name><value>Hdne1k/2c90Ixxxxxx</value></property> <property><name>fs.s3n.endpoint</name><value>s3.amazonaws.com</value></property> <property><name>fs.s3bfs.impl</name><value>org.apache.hadoop.fs.s3.S3FileSystem</value></property> <property><name>fs.s3.impl</name><value>org.apache.hadoop.fs.s3native.NativeS3FileSystem</value></property> </configuration> ~~~~~~~~~~~~~~~~~分界線~~~~~~~~~~~~~~~~~~~
vim /etc/hadoop/conf/hdfs-site.xml <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <!-- 定義nameservice列表 --> <property><name>dfs.nameservices</name><value>mycluster</value></property> <!-- 定義副本數,默認3 --> <property><name>dfs.replication</name><value>2</value></property> <!-- 定義namenode的數據存儲路徑 --> <property><name>dfs.namenode.name.dir</name><value>/data/hadoop/dfs/nn</value></property> <!-- 定義datanode的數據存儲路徑 --> <property><name>dfs.datanode.data.dir</name><value>/data/hadoop/dfs/dn</value></property> <!-- 設置集羣的超級用戶 --> <property><name>dfs.permissions.superusergroup</name><value>hdfs</value></property> <!-- 在hdfs上啓用權限檢查 --> <property><name>dfs.permissions.enabled</name><value>false</value></property> <!-- 定義namenode的地址列表 --> <property><name>dfs.ha.namenodes.mycluster</name><value>10.10.20.64,10.10.40.212</value></property> <!-- 定義namenode的rpc通信地址和端口 --> <property><name>dfs.namenode.rpc-address.mycluster.10.10.20.64</name><value>10.10.20.64:8020</value></property> <property><name>dfs.namenode.rpc-address.mycluster.10.10.40.212</name><value>10.10.40.212:8020</value></property> <!-- 定義namenode web管理地址和端口 --> <property><name>dfs.namenode.http-address.mycluster.10.10.20.64</name><value>10.10.20.64:50070</value></property> <property><name>dfs.namenode.http-address.mycluster.10.10.40.212</name><value>10.10.40.212:50070</value></property> <!-- 定義namenode的edits文件存儲的journal集羣地址--> <property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://10.10.20.64:8485;10.10.40.212:8485;10.10.102.207:8485/mycluster</value></property> <!-- 定義journalnode的文件存儲路徑 --> <property><name>dfs.journalnode.edits.dir</name><value>/data/hadoop/dfs/jn</value></property> <!-- 啓用客戶端自動切換到Active的NameNode --> <property><name>dfs.client.failover.proxy.provider.mycluster</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property> <!-- run an arbitrary shell command to fence the Active NameNode --> <property><name>dfs.ha.fencing.methods</name><value>shell(/bin/true)</value></property> <!-- 開啓namenode自動切換 --> <property><name>dfs.ha.automatic-failover.enabled</name><value>true</value></property> <!-- 存儲namenode的ha相關信息的zk地址 --> <property><name>ha.zookeeper.quorum</name><value>10.10.20.64:2181,10.10.40.212:2181,10.10.102.207:2181</value></property> <!--默認文件的塊大小,以字節爲單位,默認是134217728 --> <property><name>dfs.blocksize</name><value>134217728</value></property> <!-- namenode中用於處理RPC的線程數,默認是10 --> <property><name>dfs.namenode.handler.count</name><value>128</value></property> <!-- datanode上用於處理RPC的線程數。默認爲3 --> <property><name>dfs.datanode.handler.count</name><value>64</value></property> <!--datanode預留空間,默認是0,單位是字節,好比該節點有1T空間,想讓hdfs預留100G給系統使用,能夠設置爲107374182400 --> <property><name>dfs.datanode.du.reserved</name><value>107374182400</value></property> <!-- 定義了每一個datanode直接平衡操做所允許的最大帶寬,單位byte --> <property><name>dfs.balance.bandwidthPerSec</name><value>1048576</value></property> <!-- 定義不容許鏈接到NameNode的主機列表的文件。該文件的完整路徑必須指定。若是該值是空的,沒有主機被排除在外 --> <property><name>dfs.hosts.exclude</name><value>/etc/hadoop/conf.mycluster/datanodes.exclude</value></property> <!-- 指定要用於進出DN的數據傳輸線程的最大數量,默認4096 --> <property><name>dfs.datanode.max.transfer.threads</name><value>4096</value></property> <!-- datanode數據副本存放磁盤選擇策略有兩種方式:第一種是沿用hadoop1.0的磁盤目錄輪詢方式,實現類:RoundRobinVolumeChoosingPolicy.Java;第二種是選擇可用空間足夠多的磁盤方式存儲,實現類:AvailableSpaceVolumeChoosingPolicy.java--> <property><name>dfs.datanode.fsdataset.volume.choosing.policy</name><value>org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy</value></property> <property><name>dfs.datanode.available-space-volume-choosing-policy.balanced-space-threshold</name><value>10737418240</value></property> <property><name>dfs.datanode.available-space-volume-choosing-policy.balanced-space-preference-fraction</name><value>0.75</value></property> <!-- A Hadoop HDFS DataNode has an upper bound on the number of files that it can serve at any one time --> <property><name>dfs.datanode.max.xcievers</name><value>4096</value></property> <!-- enable webhdfs --> <property><name>dfs.webhdfs.enabled</name><value>true</value></property> <property><name>dfs.checksum.type</name><value>CRC32</value></property> <property><name>dfs.client.file-block-storage-locations.timeout</name><value>3000</value></property> <property><name>dfs.datanode.hdfs-blocks-metadata.enabled</name><value>true</value></property> <property><name>dfs.namenode.safemode.threshold-pct</name><value>0.85</value></property> <property><name>fs.s3.awsAccessKeyId</name><value>AKIAIXxxx</value></property> <property><name>fs.s3.awsSecretAccessKey</name><value>Hdne1k/2c90Ixxxxxx</value></property> <property><name>fs.s3n.awsAccessKeyId</name><value>AKIAIXxxx</value></property> <property><name>fs.s3n.awsSecretAccessKey</name><value>Hdne1k/2c90Ixxxxxx</value></property> </configuration> ~~~~~~~~~~~~~~~~~分界線~~~~~~~~~~~~~~~~~~~
vim /etc/hadoop/conf/mapred-site.xml <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <!-- 用於執行MapReduce做業的運行時框架,能夠是local, classic or yarn,默認是local --> <property><name>mapreduce.framework.name</name><value>yarn</value></property> <!-- MapReduce JobHistory服務器地址--> <property><name>mapreduce.jobhistory.address</name><value>10.10.103.15:10020</value></property> <!--MapReduce JobHistory服務器Web地址 --> <property><name>mapreduce.jobhistory.webapp.address</name><value>10.10.103.15:19888</value></property> <!-- 提交做業時使用的目錄 --> <property><name>yarn.app.mapreduce.am.staging-dir</name><value>/user</value></property> <!-- 每一個map任務的調度程序請求的內存量。若是沒有指定,則從mapreduce.map.java.opts和mapreduce.job.heap.memory-mb.ratio推斷出來。若是尚未指定java-opts,咱們將其設置爲1024 --> <property><name>mapreduce.map.memory.mb</name><value>1536</value></property> <!--每一個reduce任務的調度程序請求的內存量 --> <property><name>mapreduce.reduce.memory.mb</name><value>2880</value></property> <!--MR AppMaster須要的內存量 --> <property><name>yarn.app.mapreduce.am.resource.mb</name><value>3072</value></property> <!--map的java最大內存配置 --> <property><name>mapreduce.map.java.opts</name><value>-Xmx1228m</value></property> <!--reducejava最大內存配置 --> <property><name>mapreduce.reduce.java.opts</name><value>-Xmx2456m</value></property> <!-- --> <property><name>yarn.app.mapreduce.am.command-opts</name><value>-Xmx2457m</value></property> <!--JobTracker的服務器線程數 --> <property><name>mapreduce.jobtracker.handler.count</name><value>128</value></property> <!--namenode用於處理RPC的線程數,默認64 --> <property><name>dfs.namenode.handler.count</name><value>128</value></property> <!--每一個map任務須要的虛擬cpu核數 --> <property><name>mapreduce.map.cpu.vcores</name><value>1</value></property> <!--個reduce任務須要的虛擬cpu核數 --> <property><name>mapreduce.reduce.cpu.vcores</name><value>1</value></property> <!--MR AppMaster須要的虛擬CPU核數量 --> <property><name>yarn.app.mapreduce.am.resource.cpu-vcores</name><value>1</value></property> <!-- --> <property><name>mapred.output.direct.EmrFileSystem</name><value>true</value></property> <!--在排序文件時一次合併的數量。這決定了打開文件句柄的數量,默認10 --> <property><name>mapreduce.task.io.sort.factor</name><value>48</value></property> <!--做業完成後,用戶日誌將被保留的最長時間(以小時爲單位 --> <property><name>mapreduce.job.userlog.retain.hours</name><value>48</value></property> <!--reuduce shuffle階段並行傳輸數據的數量,默認5 --> <property><name>mapreduce.reduce.shuffle.parallelcopies</name><value>20</value></property> <!-- --> <property><name>hadoop.job.history.user.location</name><value>none</value></property> <!--是否對Map Task啓用推測執行機制 --> <property><name>mapreduce.map.speculative</name><value>true</value></property> <!--是否對Reduce Task啓用推測執行機制 --> <property><name>mapreduce.reduce.speculative</name><value>true</value></property> <!--啓用Map 輸出到aws s3的支持 --> <property><name>mapred.output.direct.NativeS3FileSystem</name><value>true</value></property> <!--在經過網絡發送以前,應該對映射的輸出進行壓縮。使用SequenceFile壓縮 --> <property><name>mapreduce.map.output.compress</name><value>true</value></property> <!--用於從遠程任務處理MR AppMaster中的RPC調用的線程數,默認30 --> <property><name>yarn.app.mapreduce.am.job.task.listener.thread-count</name><value>60</value></property> <!--每一個jvm運行多少個任務。若是設置爲-1,則沒有限制,默認1 --> <property><name>mapreduce.job.jvm.numtasks</name><value>20</value></property> <!--定義map任務輸出壓縮的方式,可使用lzo或者Snappy --> <property><name>mapreduce.map.output.compress.codec</name><value>org.apache.hadoop.io.compress.SnappyCodec</value></property> </configuration> ~~~~~~~~~~~~~~~~~分界線~~~~~~~~~~~~~~~~~~~
vim /etc/hadoop/conf/yarn-env.sh #!/bin/bash export HADOOP_YARN_USER=${HADOOP_YARN_USER:-yarn} export YARN_CONF_DIR="${YARN_CONF_DIR:-$HADOOP_YARN_HOME/conf}" if [ "$JAVA_HOME" != "" ]; then #echo "run java in $JAVA_HOME" JAVA_HOME=$JAVA_HOME fi if [ "$JAVA_HOME" = "" ]; then echo "Error: JAVA_HOME is not set." exit 1 fi JAVA=$JAVA_HOME/bin/java JAVA_HEAP_MAX=-Xmx1000m if [ "$YARN_HEAPSIZE" != "" ]; then JAVA_HEAP_MAX="-Xmx""$YARN_HEAPSIZE""m" fi IFS= if [ "$YARN_LOG_DIR" = "" ]; then YARN_LOG_DIR="$HADOOP_YARN_HOME/logs" fi if [ "$YARN_LOGFILE" = "" ]; then YARN_LOGFILE='yarn.log' fi if [ "$YARN_POLICYFILE" = "" ]; then YARN_POLICYFILE="hadoop-policy.xml" fi unset IFS YARN_OPTS="$YARN_OPTS -Dhadoop.log.dir=$YARN_LOG_DIR" YARN_OPTS="$YARN_OPTS -Dyarn.log.dir=$YARN_LOG_DIR" YARN_OPTS="$YARN_OPTS -Dhadoop.log.file=$YARN_LOGFILE" YARN_OPTS="$YARN_OPTS -Dyarn.log.file=$YARN_LOGFILE" YARN_OPTS="$YARN_OPTS -Dyarn.home.dir=$YARN_COMMON_HOME" YARN_OPTS="$YARN_OPTS -Dyarn.id.str=$YARN_IDENT_STRING" YARN_OPTS="$YARN_OPTS -Dhadoop.root.logger=${YARN_ROOT_LOGGER:-INFO,console}" YARN_OPTS="$YARN_OPTS -Dyarn.root.logger=${YARN_ROOT_LOGGER:-INFO,console}" if [ "x$JAVA_LIBRARY_PATH" != "x" ]; then YARN_OPTS="$YARN_OPTS -Djava.library.path=$JAVA_LIBRARY_PATH" fi YARN_OPTS="$YARN_OPTS -Dyarn.policy.file=$YARN_POLICYFILE" ~~~~~~~~~~~~~~~~~分界線~~~~~~~~~~~~~~~~~~~
vim /etc/hadoop/conf/yarn-site.xml <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <!-- the most important properties --> <property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property> <property><name>yarn.nodemanager.aux-services.spark_shuffle.class</name><value>org.apache.spark.network.yarn.YarnShuffleService</value></property> <property><name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name><value>org.apache.hadoop.mapred.ShuffleHandler</value></property> <!--用做資源調度程序的類,咱們使用capacity作資源管理 --> <property><name>yarn.resourcemanager.scheduler.class</name><value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value></property> <!--用於YARN應用程序的CLASSPATH,以逗號分隔的CLASSPATH條目列表 --> <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> <!-- specify the directories --> <!--用於存儲本地化文件的目錄列表,包括任務臨時生產的文件以及緩存等等 -- > <property><name>yarn.nodemanager.local-dirs</name><value>/data/hadoop/yarn/local</value></property> <property><name>yarn.nodemanager.log-dirs</name><value>/data/hadoop/yarn/logs</value></property> <!--是否啓用日誌聚合。日誌聚合收集每一個任務的日誌,並在應用程序完成後將這些日誌移動到hhdfs上,經過yarn.nodemanager.remote-app-log-dir參數 指定hdfs的存放路徑 --> <property><name>yarn.log-aggregation-enable</name><value>true</value></property> <property><name>yarn.nodemanager.remote-app-log-dir</name><value>hdfs://mycluster/var/log/hadoop-yarn/apps</value></property> <!--設置任務內存限制時,虛擬內存與物理內存的比例。任務分配以物理內存表示,而且經過此比例容許虛擬內存使用超過此分配。任務每使用1MB物理內存,最多可以使用虛擬內存量,默認是2.1 --> <property><name>yarn.nodemanager.vmem-pmem-ratio</name><value>10</value></property> <!--該節點的物理內存大小,默認是8192,具體設置該參數時,建議給系統預留1-2G --> <property><name>yarn.nodemanager.resource.memory-mb</name><value>10360</value></property> <!--能夠爲任務分配的cpu虛擬核數。RM分配資源用於任務時使用。這個參數不是用來限制YARN任務使用的物理內核的數量.--> <property><name>yarn.nodemanager.resource.cpu-vcores</name><value>4</value></property> <!--否檢查任務正在使用的虛擬內存量--> <property><name>yarn.nodemanager.pmem-check-enabled</name><value>true</value></property> <!--是否檢查任務正在使用的虛擬內存量 --> <property><name>yarn.nodemanager.vmem-check-enabled</name><value>true</value></property> <!--RM處理調度器接口的線程數,默認50個--> <property><name>yarn.resourcemanager.scheduler.client.thread-count</name><value>64</value></property> <!--NM用於container管理的線程數,默認20個--> <property><name>yarn.nodemanager.container-manager.thread-count</name><value>64</value></property> <!--處理資源跟蹤器調用的線程數,默認50個--> <property><name>yarn.resourcemanager.resource-tracker.client.thread-count</name><value>64</value></property> <!--用於處理應用程序管理器請求的線程數,默認50個--> <property><name>yarn.resourcemanager.client.thread-count</name><value>64</value></property> <!--處理本地請求的線程數,默認5個--> <property><name>yarn.nodemanager.localizer.client.thread-count</name><value>20</value></property> <!--用於本地化獲取的線程數,默認4個--> <property><name>yarn.nodemanager.localizer.fetch.thread-count</name><value>20</value></property> <!-- 單個任務可申請的最少物理內存量,默認是1024(MB),若是一個任務申請的物理內存量少於該值,則該對應的值改成這個數--> <property><name>yarn.scheduler.minimum-allocation-mb</name><value>1536</value></property> <!--單個任務可申請的最多物理內存量,默認是8192(MB)。 默認狀況下,YARN採用了線程監控的方法判斷任務是否超量使用內存,一旦發現超量,則直接將其殺死。因爲Cgroups對內存的控制缺少靈活性(即任務任什麼時候刻不能超過內存上限,若是超過,則直接將其殺死或者報OOM),而Java進程在建立瞬間內存將翻倍,以後驟降到正常值,這種狀況下,採用線程監控的方式更加靈活(當發現進程樹內存瞬間翻倍超過設定值時,可認爲是正常現象,不會將任務殺死),所以YARN未提供Cgroups內存隔離機制 --> <property><name>yarn.scheduler.maximum-allocation-mb</name><value>9192</value></property> <!--是否開啓日誌聚合功能 --> <property><name>yarn.log-aggregation-enable</name><value>true</value></property> <!-- 是否開啓label功能 --> <property><name>yarn.label.enabled</name><value>true</value></property> <!-- enable resource manager HA --> <!--重試的時間間隔,默認是30000 --> <property><name>yarn.resourcemanager.connect.retry-interval.ms</name><value>2000</value></property> <!--是否啓用RM高可用 -- > <property><name>yarn.resourcemanager.ha.enabled</name><value>true</value></property> <!--啓用自動故障切換 -- > <property><name>yarn.resourcemanager.ha.automatic-failover.enabled</name><value>true</value></property> <!--啓用RM後恢復狀態。若是爲true,則必須指定yarn.resourcemanager.store.class-- > <property><name>yarn.resourcemanager.recovery.enabled</name><value>true</value></property> <!--集羣名稱。在HA設置中,這用於確保RM參與此羣集的首選,並確保其不影響其餘羣集 -- > <property><name>yarn.resourcemanager.cluster-id</name><value>my-cluster</value></property> <!--啓用HA時,羣集中的RM節點列表 -- > <property><name>yarn.resourcemanager.ha.rm-ids</name><value>10.10.103.15,10.10.30.83</value></property> <!--當前RM的id,咱們常常部署集羣會把一臺服務器的配置問題同步到全部服務器上,另外一臺RM記得修改這個ID爲本身的IP地址 -- > <property><name>yarn.resourcemanager.ha.id</name><value>10.10.103.15</value></property> <!--配合yarn.resourcemanager.recovery.enabled參數一塊兒使用 -- > <property><name>yarn.resourcemanager.store.class</name><value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value></property> <!-- yarn proxyserver 的地址 --> <property><name>yarn.web-proxy.address</name><value>10.10.103.15:8100</value></property> <!--jobhistor的地址 --> <property><name>yarn.log.server.url</name><value>http://10.10.103.15:19888/jobhistory/logs/</value></property> <!--RM的地址--> <property><name>yarn.resourcemanager.hostname.10.10.103.15</name><value>10.10.103.15</value></property> <property><name>yarn.resourcemanager.hostname.10.10.30.83</name><value>10.10.30.83</value></property> <!--由RM使用的ZooKeeper服務器的端口。當在HA設置中使用基於ZooKeeper的RM狀態存儲和自動故障切換時,必須提供此功能 --> <property><name>yarn.resourcemanager.zk-address</name><value>10.10.20.64:2181,10.10.40.212:2181,10.10.102.207:2181</value></property> <!--RM中應用程序管理器界面的地址 --> <property><name>yarn.resourcemanager.address.10.10.103.15</name><value>10.10.103.15:23140</value></property> <!--調度器接口的地址 --> <property><name>yarn.resourcemanager.scheduler.address.10.10.103.15</name><value>10.10.103.15:23130</value></property> <!--RM Web應用程序的https adddress --> <property><name>yarn.resourcemanager.webapp.https.address.10.10.103.15</name><value>10.10.103.15:23189</value></property> <!--RM Web應用程序的http地址 --> <property><name>yarn.resourcemanager.webapp.address.10.10.103.15</name><value>10.10.103.15:8088</value></property> <!-- --> <property><name>yarn.resourcemanager.resource-tracker.address.10.10.103.15</name><value>10.10.103.15:23125</value></property> <!--M管理界面的地址--> <property><name>yarn.resourcemanager.admin.address.10.10.103.15</name><value>10.10.103.15:23141</value></property> <property><name>yarn.resourcemanager.address.10.10.30.83</name><value>10.10.30.83:23140</value></property> <property><name>yarn.resourcemanager.scheduler.address.10.10.30.83</name><value>10.10.30.83:23130</value></property> <property><name>yarn.resourcemanager.webapp.https.address.10.10.30.83</name><value>10.10.30.83:23189</value></property> <property><name>yarn.resourcemanager.webapp.address.10.10.30.83</name><value>10.10.30.83:8088</value></property> <property><name>yarn.resourcemanager.resource-tracker.address.10.10.30.83</name><value>10.10.30.83:23125</value></property> <property><name>yarn.resourcemanager.admin.address.10.10.30.83</name><value>10.10.30.83:23141</value></property> <property><name>yarn.nodemanager.localizer.address</name><value>0.0.0.0:23344</value></property> <!--NM Webapp地址--> <property><name>yarn.nodemanager.webapp.address</name><value>0.0.0.0:23999</value></property> <property><name>mapreduce.shuffle.port</name><value>23080</value></property> <!--啓用RM工做保留恢復。此配置對YARN是私有的--> <property><name>yarn.resourcemanager.work-preserving-recovery.enabled</name><value>true</value></property> </configuration> ~~~~~~~~~~~~~~~~~分界線~~~~~~~~~~~~~~~~~~~
PS:配置參數解釋參考下面連接
https://archive.cloudera.com/cdh5/cdh/5/hadoop/hadoop-yarn/hadoop-yarn-common/yarn-default.xml
https://archive.cloudera.com/cdh5/cdh/5/hadoop/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
https://archive.cloudera.com/cdh5/cdh/5/hadoop/hadoop-project-dist/hadoop-common/core-default.xml
http://dongxicheng.org/mapreduce-nextgen/hadoop-yarn-configurations-capacity-scheduler/
五、服務啓動
a、啓動journalnode(三臺服務器上都啓動)
/etc/init.d/hadoop-hdfs-journalnode start
b、格式化namenode(在其中一臺namenode10.10.103.246上操做)
sudo -u hdfs hadoop namenode -format
c、初始化zk中HA的狀態(在其中一臺namenode10.10.103.246上操做)
sudo -u hdfs hdfs zkfc -formatZK
d、初始化共享Edits文件(在其中一臺namenode10.10.103.246上操做)
sudo -u hdfs hdfs namenode -initializeSharedEdits
e、啓動10.10.103.246上namenode
/etc/init.d/hadoop-hdfs-namenode start
f、同步源數據並啓動10.10.103.144上namenode
sudo -u hdfs hdfs namenode -bootstrapStandby /etc/init.d/hadoop-hdfs-namenode start
g、在兩臺namenode上啓動zkfc
/etc/init.d/hadoop-hdfs-zkfc start
h、啓動datanode(全部機器上操做)
/etc/init.d/hadoop-hdfs-journalnode start
i、在10.10.103.246上啓動WebAppProxyServer、JobHistoryServer、httpfs
/etc/init.d/hadoop-yarn-proxyserver start /etc/init.d/hadoop-mapreduce-historyserver start /etc/init.d/hadoop-httpfs start
j、在全部機器上啓動nodemanager
/etc/init.d/hadoop-yarn-nodemanager restart
4、功能驗證
一、hadoop功能
a、查看hdfs根目錄
[root@ip-10-10-103-246 ~]# hadoop fs -ls / Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0 Found 3 items drwxr-xr-x - hdfs hdfs 0 2017-05-11 11:40 /tmp drwxrwx--- - mapred hdfs 0 2017-05-11 11:28 /user drwxr-xr-x - yarn hdfs 0 2017-05-11 11:28 /var
b、上傳一個文件到根目錄
[root@ip-10-10-103-246 ~]# hadoop fs -put /tmp/test.txt / Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0 [root@ip-10-10-103-246 ~]# hadoop fs -ls / Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0 Found 4 items -rw-r--r-- 2 root hdfs 22 2017-05-11 15:47 /test.txt drwxr-xr-x - hdfs hdfs 0 2017-05-11 11:40 /tmp drwxrwx--- - mapred hdfs 0 2017-05-11 11:28 /user drwxr-xr-x - yarn hdfs 0 2017-05-11 11:28 /var
c、直接刪除文件不放回收站
[root@ip-10-10-103-246 ~]# hadoop fs -rm -skipTrash /test.txt Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0 Deleted /test.txt
d、跑一個wordcount用例
[root@ip-10-10-103-246 ~]# hadoop fs -put /tmp/test.txt /user/hdfs/rand/ Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0 [root@ip-10-10-103-246 conf]# sudo -u hdfs hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.11.0.jar wordcount /user/hdfs/rand/ /tmp OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0 17/05/11 11:40:08 INFO client.ConfiguredRMFailoverProxyProvider: Failing over to 10.10.103.246 17/05/11 11:40:09 INFO input.FileInputFormat: Total input paths to process : 1 17/05/11 11:40:09 INFO lzo.GPLNativeCodeLoader: Loaded native gpl library 17/05/11 11:40:09 INFO lzo.LzoCodec: Successfully loaded & initialized native-lzo library [hadoop-lzo rev 674c65bbf0f779edc3e00a00c953b121f1988fe1] 17/05/11 11:40:09 INFO mapreduce.JobSubmitter: number of splits:1 17/05/11 11:40:09 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1494472050574_0003 17/05/11 11:40:09 INFO impl.YarnClientImpl: Submitted application application_1494472050574_0003 17/05/11 11:40:09 INFO mapreduce.Job: The url to track the job: http://10.10.103.246:8100/proxy/application_1494472050574_0003/ 17/05/11 11:40:09 INFO mapreduce.Job: Running job: job_1494472050574_0003 17/05/11 11:40:15 INFO mapreduce.Job: Job job_1494472050574_0003 running in uber mode : false 17/05/11 11:40:15 INFO mapreduce.Job: map 0% reduce 0% 17/05/11 11:40:20 INFO mapreduce.Job: map 100% reduce 0% 17/05/11 11:40:25 INFO mapreduce.Job: map 100% reduce 100% 17/05/11 11:40:25 INFO mapreduce.Job: Job job_1494472050574_0003 completed successfully 17/05/11 11:40:25 INFO mapreduce.Job: Counters: 53 File System Counters FILE: Number of bytes read=1897 FILE: Number of bytes written=262703 FILE: Number of read operations=0 FILE: Number of large read operations=0 FILE: Number of write operations=0 HDFS: Number of bytes read=6431 HDFS: Number of bytes written=6219 HDFS: Number of read operations=6 HDFS: Number of large read operations=0 HDFS: Number of write operations=2 Job Counters Launched map tasks=1 Launched reduce tasks=1 Data-local map tasks=1 Total time spent by all maps in occupied slots (ms)=2592 Total time spent by all reduces in occupied slots (ms)=5360 Total time spent by all map tasks (ms)=2592 Total time spent by all reduce tasks (ms)=2680 Total vcore-milliseconds taken by all map tasks=2592 Total vcore-milliseconds taken by all reduce tasks=2680 Total megabyte-milliseconds taken by all map tasks=3981312 Total megabyte-milliseconds taken by all reduce tasks=8232960 Map-Reduce Framework Map input records=102 Map output records=96 Map output bytes=6586 Map output materialized bytes=1893 Input split bytes=110 Combine input records=96 Combine output records=82 Reduce input groups=82 Reduce shuffle bytes=1893 Reduce input records=82 Reduce output records=82 Spilled Records=164 Shuffled Maps =1 Failed Shuffles=0 Merged Map outputs=1 GC time elapsed (ms)=120 CPU time spent (ms)=1570 Physical memory (bytes) snapshot=501379072 Virtual memory (bytes) snapshot=7842639872 Total committed heap usage (bytes)=525860864 Peak Map Physical memory (bytes)=300183552 Peak Map Virtual memory (bytes)=3244224512 Peak Reduce Physical memory (bytes)=201195520 Peak Reduce Virtual memory (bytes)=4598415360 Shuffle Errors BAD_ID=0 CONNECTION=0 IO_ERROR=0 WRONG_LENGTH=0 WRONG_MAP=0 WRONG_REDUCE=0 File Input Format Counters Bytes Read=6321 File Output Format Counters Bytes Written=6219 [root@ip-10-10-103-246 conf]#
二、namenode高可用驗證
查看http://10.10.103.246:50070
查看http://10.10.103.144:50070
停掉10.10.103.246節點的namenode進程,查看10.10.103.144節點是否會提高爲active節點
三、resourcemanager高可用驗證
查看http://10.10.103.246:8088
查看http://10.10.103.144:8088
在瀏覽器輸入http://10.10.103.144:8088,會跳轉到http://ip-10-10-103-246.ec2.internal:8088/,ip-10-10-103-246.ec2.internal是10.10.103.246的主機名,說明resourcemanager高可用配置ok,停掉10.10.103.144的
resourcemanager進程,在瀏覽器輸入http://10.10.103.144:8088,就不會在跳轉了,說明10.10.103.144已經切成了master。
5、總結
一、hadoop集羣能成本部署完成,這纔是開始,後期的維護,業務方問題的解決這些經驗須要一點一點積累,多出差多折騰老是好的。
二、對應上面部署的集羣后期須要擴容,直接把10.10.103.62這臺機器作個鏡像,用鏡像啓動服務器便可,服務會自動啓動而且加入到集羣
三、雲上hadoop集羣的成本優化,這裏只針對aws而言
a、冷數據存在在s3上,hdfs能夠直接支持s3,在hdfs-site.xml裏面添加s3的key參數(fs.s3n.awsAccessKeyId和fs.s3n.awsSecretAccessKey)便可,須要注意的是程序上傳、下載的邏輯須要多加幾個重試機制,s3有時候不穩定會致使上傳或者下載不成功
b、使用Auto Scaling服務結合競價實例,配置擴展策略,好比當cpu大於50%的時候就擴容5臺服務器,當cpu小於10%的時候就縮容5臺服務器,固然你能夠配置更多階梯級的擴容、縮容策略,Auto Scaling還有一個計劃任務的功能,你能夠向設置crontab同樣設置,讓Auto Scaling幫你擴容、縮容服務器