在程序中指定Spark和Hadoop的用户

14 篇文章 0 订阅
8 篇文章 0 订阅

Spark和Hadoop都被设计为多用户共享使用,每个用户程序都关联一个用户,Spark和Hadoop根据该用户授予用户程序对集群相关资源的访问权限。如果是强认证方式,每个用户程序关联的用户不可随意指定,而至少需要提供必要的认证信息(如密码);如果是弱认证方式,则可以在用户程序中指定关联用户,而不需要提供认证信息。Spark(0.8.0版本)使用的是弱认证方式,Hadoop可以配置使用强认证方式(Kerberos)或弱认证方式,在日常开发中基本上都是使用以弱认证方式运行的Hadoop。

Spark和Hadoop都是集群运行环境,用户程序要么在客户端独立运行并通过网络与集群中的服务通信,如从客户端访问HDFS,要么在客户端被打包然后上传到集群的结点运行,如提交MapReduce作业或请求Spark的Worker执行App任务。在日常开发工作中经常需要一方面在客户端运行用户程序直接操作HDFS上的文件,另一方面将并行计算任务提交到集群(Spark或MapReduce)执行。这里的关键差异是前一种情况的用户程序在客户端运行,而后一种情况的用户程序却是在服务器端运行。

Spark和Hadoop的SDK默认将用户程序运行所在系统的当前登录用户作为用户程序的关联用户。由于客户端和服务器的当前登录用户往往不一致,这容易造成在客户端运行的用户程序和在服务器端运行的用户程序不能互访各自在集群中的资源(如HDFS上的文件)。解决这个问题的合理方法是将在客户端和服务器端运行的两类用户程序所关联的用户指定为同一个用户。

为Spark的用户程序指定关联用户,可以使用系统属性"user.name"。

USE CASE 1 为在客户端运行的Spark App指定关联用户为"ARCH",可以在程序向Master注册App之前设置系统属性。

System.setProperty("user.name", "ARCH");
JavaSparkContext sc = new JavaSparkContext(...);


在弱认证方式下,为Hadoop的用户程序指定关联用户,可以使用环境变量"HADOOP_USER_NAME"或系统属性"HADOOP_USER_NAME"。

USE CASE 1 为在客户端运行的访问HDFS的用户程序指定关联用户为"ARCH",可以在获取FileSystem实例之前设置系统属性。

System.setProperty("HADOOP_USER_NAME", "ARCH");
FileSystem fs = FileSystem.get(...);


USE CASE 2 为在服务器端做Map任务或Reduce任务的用户程序指定关联用户为"ARCH",可以在提交MapReduce作业之前设置系统属性。

System.setProperty("HADOOP_USER_NAME", "ARCH");
Job job = new Job(...);
...
job.waitForCompletion(true);


USE CASE 3 为在Spark的Worker结点运行、执行App任务的Executor指定关联用户为"ARCH",这实际上是USE CASE 1的特殊情况,访问目标也是HDFS,但是客户端却在Spark的Worker结点。对于这种情况,可以在程序向Master注册App时设置App的环境参数"HADOOP_USER_NAME",在客户端设置的环境参数将经由 App->Master->Worker->Executor传递到Executor,当Executor访问HDFS时该参数就会发生作用。

Map<String, String> envs = new HashMap<String, String>();
envs.put("HADOOP_USER_NAME", "ARCH");
JavaSparkContext sc = new JavaSparkContext(......, envs);



版权声明:本文为CSDN博主「wyc09」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wyc09/article/details/16338483/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值