隨着平臺業務的發展,依賴於Portal(Web)構建的服務架構已逐漸不能知足現有的一些複雜需求(如:使用Hive SQL沒法完成計算邏輯),並且對於一些具有編程能力的程序員或數據分析師而言,可以自主控制任務的訴求愈來愈多,這就要求咱們必須把平臺的計算能力開放出去,主要涉及如下三個問題:
(1)用戶能夠經過前端機(Gateway)訪問Hadoop線下集羣(Offline Cluster)、Hadoop線上集羣(Online Cluster),並在二者之間作切換;
(2)HDFS權限控制:用戶僅僅能夠訪問或操做本身有權限的目錄或文件;
(3)Yarn資源隔離:用戶的任務僅僅能提交給特定的隊列,且隊列的資源配額、同時運行的任務數等須要受到嚴格控制;
如下逐一介紹咱們是如何解決上述三個問題的。
1.前端機(Gateway)、線下集羣(Hadoop Offline Cluster)、線上集羣(Hadoop Online Cluster)
集羣就是Hadoop集羣,先介紹下三者的概念,
線下集羣:測試環境中的Hadoop集羣,規模很小,用於用戶開發測試使用;
線上集羣:生產環境中的Hadoop集羣,用於用戶部署正式應用;
前端機:集羣入口,用戶登陸以後能夠操做HDFS、提交MapReduce或Spark任務,能夠簡單理解爲一個Hadoop Client;
其中,線下集羣與線上集羣的數據須要定時同步(考慮到線下集羣存儲資源有限,目前的策略是僅選取少許數據同步)。
前端機目前僅有一個實例,用戶操做(HDFS、MapReduce、Spark)時須要支持能夠在線下集羣與線上集羣之間做切換。
(1)HDFS
Hadoop集羣(線下、線上)構建於版本hadoop-2.5.0-cdh5.3.2之上,前端機安裝同版本的Hadoop Client,Hadoop Client鏈接的集羣是依靠配置文件指定的,配置文件存儲目錄爲「/etc/hadoop/conf」,默認指向Hadoop線下集羣。
能夠看出,訪問HDFS須要經過「hadoop fs」,而hadoop命令選項「--config」支持指定配置文件目錄,從而實現多個Hadoop HDFS集羣之間的切換。咱們的操做步驟以下:
a.創建Hadoop線上集羣配置文件目錄:mkdir -p /etc/hadoop-online/conf;
b.拷貝Hadoop線上集羣配置文件至目錄「/etc/hadoop-online/conf」;
c.創建Hadoop線下集羣配置文件目錄軟連接,強化線下、線上屬性:ln -s /etc/hadoop /etc/hadoop-offline;
訪問Hadoop線下HDFS示例以下:
訪問Hadoop線上HDFS示例以下:
總結:經過hadoop命令的選項「--config」能夠指定不一樣的Hadoop集羣配置文件,從而實現多個Hadoop集羣之間的切換。
(2)MapReduce
用戶提交MapReduce任務時,也能夠經過指定配置文件目錄的方式實現Hadoop線下集羣與線上集羣的切換,配置文件目錄的創建方式與(1)同,再也不贅述。
MapReduce任務的提交一般有如下兩種方式,咱們分別介紹。
a.使用hadoop jar的方式提交MapReduce任務;
提交MapReduce任務至Hadoop線下集羣示例:
hadoop jar wordcount.jar --D mapreduce.job.name=wordcount_example_yurun -D mapreduce.job.queuename=hive -D mapreduce.job.reduces=3
hadoop
--config /etc/hadoop-offline/conf jar wordcount.jar --D mapreduce.job.name=wordcount_example_yurun -D mapreduce.job.queuename=hive -D mapreduce.job.reduces=3
提交MapReduce任務至Hadoop線上集羣示例:
hadoop
--config /etc/hadoop-online/conf jar wordcount.jar --D mapreduce.job.name=wordcount_example_yurun -D mapreduce.job.queuename=hive -D mapreduce.job.reduces=3
b.使用java命令行的方式提交MapReduce任務;
提交MapReduce任務至Hadoop線下集羣示例:
java -cp ./wordcount.jar:
/etc/hadoop-offline/conf:/usr/lib/hadoop/lib/*:/usr/lib/hadoop/.//*:/usr/lib/hadoop-hdfs/./:/usr/lib/hadoop-hdfs/lib/*:/usr/lib/hadoop-hdfs/.//*:/usr/lib/hadoop-yarn/lib/*:/usr/lib/hadoop-yarn/.//*:/usr/lib/hadoop-mapreduce/lib/*:/usr/lib/hadoop-mapreduce/.//* com.weibo.dip.mr.WordCountExampleMain --D mapreduce.job.name=wordcount_example_yurun -D mapreduce.job.queuename=hive -D mapreduce.job.reduces=3
提交MapReduce任務至Hadoop線上集羣示例:
java -cp ./wordcount.jar:
/etc/hadoop-online/conf:/usr/lib/hadoop/lib/*:/usr/lib/hadoop/.//*:/usr/lib/hadoop-hdfs/./:/usr/lib/hadoop-hdfs/lib/*:/usr/lib/hadoop-hdfs/.//*:/usr/lib/hadoop-yarn/lib/*:/usr/lib/hadoop-yarn/.//*:/usr/lib/hadoop-mapreduce/lib/*:/usr/lib/hadoop-mapreduce/.//* com.weibo.dip.mr.WordCountExampleMain --D mapreduce.job.name=wordcount_example_yurun -D mapreduce.job.queuename=hive -D mapreduce.job.reduces=3
注意:提交MapReduce任務時須要將相關代碼及依賴編譯打包爲一個Jar(Java,Hadoop相關依賴除外),爲了不可能出現的異常狀況,不要在Jar中包含Hadoop相關的任何配置文件。
(3)Spark
Hadoop集羣目前支持的Spark版本有兩個:spark-1.2.0-cdh5.3.二、spark-1.5.1,均須要支持Hadoop集羣線上環境與線下環境的切換。
Spark任務(這裏僅討論離線任務或批處理任務)的提交是經過「spark-submit」進行的,提交過程涉及到兩個重要的環境變量:HADOOP_CONF_DIR、SPARK_CONF_DIR,分別用於指定Hadoop配置文件目錄和Spark配置文件目錄,實際上咱們也是經過變動這兩個環境變量的值實現Hadoop(Spark)集羣之間的切換的。
由於spark-1.2.0-cdh5.3.2與spark-1.5.1之間的安裝部署方式不一樣,二者集羣之間的切換操做也略有不一樣。
spark-1.2.0-cdh5.3.2操做步驟以下:
注:spark-1.2.0-cdh5.3.2默認安裝時的配置文件目錄(SPARK_CONF_DIR)爲「/etc/spark/conf」。
a.創建Spark線上環境配置文件目錄:mkdir -p /etc/spark-online/conf;
b.拷貝Spark線上環境配置文件至目錄:/etc/spark-online/conf;
c.創建/usr/bin/spark-submit軟連接:ln -s /usr/bin/spark-submit /usr/bin/spark-1.2.0-offline-submit;
d.拷貝/usr/bin/spark-submit:cp /usr/bin/spark-submit /usr/bin/spark-1.2.0-online-submit;
e.修改/usr/bin/spark-1.2.0-online-submit,以下:
. /usr/lib/bigtop-utils/bigtop-detect-javahome
export HADOOP_CONF_DIR=/etc/hadoop-online/conf
export SPARK_CONF_DIR=/etc/spark-online/conf
exec /usr/lib/spark/bin/spark-submit "$@"
總結:spark-1.2.0-cdh5.3.2安裝時已經將其指向Hadoop線下集羣,這裏僅僅須要爲其創建一個軟連接「/usr/bin/spark-1.2.0-offline-submit」,強化一下線下屬性便可;/usr/bin/spark-1.2.0-online-submit則須要顯示設置環境變量:HADOOP_CONF_DIR、SPARK_CONF_DIR,其中HADOOP_CONF_DIR指向Hadoop線上集羣配置文件目錄,SPARK_CONF_DIR指向Spark線上集羣配置文件目錄。
spark-1.2.0-cdh5.3.2提交任務至Hadoop線下集羣示例:
spark-submit --master yarn-client --num-executors 3 --executor-memory 2g --driver-memory 1G --queue spark.app /usr/home/yurun/workspace/pyspark/1.2.0/examples/app/spark_app_min.py
spark-1.2.0-offline-submit --master yarn-client --num-executors 3 --executor-memory 2g --driver-memory 1G --queue spark.app /usr/home/yurun/workspace/pyspark/1.2.0/examples/app/spark_app_min.py
spark-1.2.0-cdh5.3.2提交任務至Hadoop線上集羣示例:
spark-1.2.0-online-submit --master yarn-client --num-executors 3 --executor-memory 2g --driver-memory 1G --queue spark.app /usr/home/yurun/workspace/pyspark/1.2.0/examples/app/spark_app_min.py
spark-1.5.1操做步驟以下:
注:spark-1.5.1默認安裝時的配置文件目錄(SPARK_CONF_DIR)爲「/usr/lib/spark-1.5.1-bin-2.5.0-cdh5.3.2/conf」。
a.創建/usr/lib/spark-1.5.1-bin-2.5.0-cdh5.3.2/bin/spark-submit的軟連接:ln -s /usr/lib/spark-1.5.1-bin-2.5.0-cdh5.3.2/bin/spark-submit /usr/lib/spark-1.5.1-bin-2.5.0-cdh5.3.2/bin/spark-1.5.1-offline-submit;
b.修改/usr/lib/spark-1.5.1-bin-2.5.0-cdh5.3.2/bin/spark-submit,以下:
SPARK_HOME=/usr/lib/spark-1.5.1-bin-2.5.0-cdh5.3.2
# disable randomized hash for string in Python 3.3+
export PYTHONHASHSEED=0
exec "$SPARK_HOME"/bin/spark-class org.apache.spark.deploy.SparkSubmit "$@"
c.創建/usr/lib/spark-1.5.1-bin-2.5.0-cdh5.3.2/bin/spark-1.5.1-offline-submit的軟連接:ln -s /usr/lib/spark-1.5.1-bin-2.5.0-cdh5.3.2/bin/spark-1.5.1-offline-submit /usr/bin/spark-1.5.1-offline-submit;
d.創建Spark線上環境目錄:mkdir -p /usr/lib/spark-1.5.1-bin-2.5.0-cdh5.3.2/online-conf/;
e.拷貝Spark線上環境配置文件至目錄:/usr/lib/spark-1.5.1-bin-2.5.0-cdh5.3.2/online-conf/;
f.拷貝/usr/lib/spark-1.5.1-bin-2.5.0-cdh5.3.2/bin/spark-submit:cp /usr/lib/spark-1.5.1-bin-2.5.0-cdh5.3.2/bin/spark-submit /usr/lib/spark-1.5.1-bin-2.5.0-cdh5.3.2/bin/spark-1.5.1-online-submit
g.修改/usr/lib/spark-1.5.1-bin-2.5.0-cdh5.3.2/bin/spark-1.5.1-online-submit,以下:
SPARK_HOME=/usr/lib/spark-1.5.1-bin-2.5.0-cdh5.3.2
export HADOOP_CONF_DIR=/etc/hadoop-online/conf
export SPARK_CONF_DIR=/usr/lib/spark-1.5.1-bin-2.5.0-cdh5.3.2/online-conf
# disable randomized hash for string in Python 3.3+
export PYTHONHASHSEED=0
exec "$SPARK_HOME"/bin/spark-class org.apache.spark.deploy.SparkSubmit "$@"
h.創建/usr/lib/spark-1.5.1-bin-2.5.0-cdh5.3.2/bin/spark-1.5.1-online-submit的軟連接:ln -s /usr/lib/spark-1.5.1-bin-2.5.0-cdh5.3.2/bin/spark-1.5.1-online-submit /usr/bin/spark-1.5.1-online-submit。
spark-1.5.1提交任務至Hadoop線下集羣示例:
spark-1.5.1-offline-submit --master yarn-client --num-executors 3 --executor-memory 2g --driver-memory 1G --queue spark.app /usr/home/yurun/workspace/pyspark/1.2.0/examples/app/spark_app_min.py
spark-1.5.1提交任務至Hadoop線上集羣示例:
spark-1.5.1-online-submit --master yarn-client --num-executors 3 --executor-memory 2g --driver-memory 1G --queue hive /usr/home/yurun/workspace/pyspark/1.2.0/examples/app/spark_app_min.py
總結:spark-1.5.1實現集羣環境之間的切換是經過設置三個環境變量實現的:SPARK_HOME、HADOOP_CONF_DIR、SPARK_CONF_DIR。
2.HDFS權限控制;
HDFS權限控制相似於Linux文件系統的權限控制,也是經過用戶、用戶組實現的。
用戶須要以團隊(組)爲單位申請前端機的登陸權限,如:
用戶組:dip
用戶名:yurun、tongwei
權限申請經過以後,須要執行如下三步:
(1)須要由管理員在前端機爲其創建用戶組,並將上述用戶添加至該用戶組,如:
sudo -s
groupadd dip;
usermod -a -G dip yurun;
usermod -a -G dip tongwei;
(2)須要由管理員在Hadoop線下集羣與線上集羣的Namenode、ResourceManager節點添加用戶帳號,如:
groupadd dip;
useradd yurun -s /sbin/nologin;
useradd tongwei -s /sbin/nologin;
usermod -a -G dip yurun;
usermod -a -G dip tongwei;
(3)須要由管理員在Hadoop(HDFS)線下集羣與線上集羣中以用戶組爲單位創建工做目錄,如:
su hdfs
hadoop fs -mkdir /user/dip
hadoop fs -chown -R yurun:dip /user/dip
hadoop fs -chmod -R 770 /user/dip
經過上述三步,用戶(組)擁有一個獨立的工做目錄(/user/dip),用戶(組)可自行管理目錄中的內容。
3.YARN資源隔離;
YARN資源隔離是經過YARN Scheduler Queue實現的,以用戶組爲單位建立隊列,並設置該隊列容許提交任務的用戶、最大資源使用量、最多同時運行的任務數等。
咱們在Hadoop集羣資源中開闢隊列「thirdparty」用於開放計算,而後以用戶組爲單位創建相應的子隊列,如用戶組topweibo、datacubic的子隊列分別爲thirdparty.topweibo、thirdparty.datacubic,分別爲這兩個子隊列設置最小資源、最大資源、容許同時運行的任務數、容許提交應用的用戶(組)、容許管理應用的用戶(組)等,以下:
<queue name="thirdparty">
<minResources>2080768 mb, 1166 vcores</minResources>
<maxResources>2080768 mb, 1166 vcores</maxResources>
<minSharePreemptionTimeout>60</minSharePreemptionTimeout>
<weight>10.0</weight>
<schedulingPolicy>fair</schedulingPolicy>
<queue name="topweibo">
<minResources>416153 mb, 233 vcores</minResources>
<maxResources>416153 mb, 233 vcores</maxResources>
<maxRunningApps>50</maxRunningApps>
<aclSubmitApps> topweibo</aclSubmitApps>
<aclAdministerApps>hdfs topweibo</aclAdministerApps>
</queue>
<queue name="datacubic">
<minResources>1248460 mb, 699 vcores</minResources>
<maxResources>1248460 mb, 699 vcores</maxResources>
<maxRunningApps>50</maxRunningApps>
<aclSubmitApps>xinqi datacubic</aclSubmitApps>
<aclAdministerApps>hdfs datacubic</aclAdministerApps>
</queue>
</queue>
通過上述配置以後,用戶提交應用(MapReduce、Spark)時均須要指定提交的隊列,如:
hadoop --config /etc/hadoop-offline/conf jar wordcount.jar --D mapreduce.job.name=wordcount_example_yurun -D
mapreduce.job.queuename=thirdparty.topweibo -D mapreduce.job.reduces=3
java -cp ./wordcount.jar:/etc/hadoop-online/conf:/usr/lib/hadoop/lib/*:/usr/lib/hadoop/.//*:/usr/lib/hadoop-hdfs/./:/usr/lib/hadoop-hdfs/lib/*:/usr/lib/hadoop-hdfs/.//*:/usr/lib/hadoop-yarn/lib/*:/usr/lib/hadoop-yarn/.//*:/usr/lib/hadoop-mapreduce/lib/*:/usr/lib/hadoop-mapreduce/.//* com.weibo.dip.mr.WordCountExampleMain --D mapreduce.job.name=wordcount_example_yurun -D
mapreduce.job.queuename=hive -D mapreduce.job.reduces=3
spark-1.5.1-offline-submit --master yarn-client --num-executors 3 --executor-memory 2g --driver-memory 1G --
queue thirdparty.topweibo /usr/home/yurun/workspace/pyspark/1.2.0/examples/app/spark_app_min.py
解決這三個問題以後,能夠認爲已基本知足開放計算的基本條件,目前已經開始投入實際環境中使用,後續會根據業務場景不斷完善。