DIP开放计算平台介绍

随着平台业务的发展,依赖于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
 
解决这三个问题以后,能够认为已基本知足开放计算的基本条件,目前已经开始投入实际环境中使用,后续会根据业务场景不断完善。 
相关文章
相关标签/搜索