2013-04-19 2 views
4

У меня есть веб-приложение, которое взаимодействует с Hadoop. (Cloudera cdh3u6) Отдельная операция пользователя должна запустить новое задание по сокращению карты в кластере.Запуск карты уменьшить работу как другой пользователь

Кластер не является безопасным кластером, но использует простую групповую аутентификацию - поэтому, если я схожу к нему как к себе, я могу запустить задания MR из командной строки.

В веб-приложение, я использую ToolRunner запустить свою работу:

MyMapReduceWrapperClass mr = new MyMapReduceWrapperClass(); 
ToolRunner.run(mr, null); 


// inside the run implementation of my wrapper class : 
Job job = new Job(conf, "job title"); 
//set up stuff removed 
job.submit(); 

В настоящее время эта работа представляется как пользователь, который запустил сервер веб-приложений процесса (Tomcat), и пользователь специальную локальную учетную запись на этом веб-сервере, которая не имеет разрешений на отправку заданий в кластер.

В идеале я хотел бы получить от пользователя личную идентификацию и передать ее, так что, когда разные пользователи взаимодействуют с веб-приложением/службой, мы можем видеть, кто ссылается на какие задания. Пропуская вопросы о том, как фактически координировать эти учетные данные, я даже не понимаю, куда это пойдет.

Я вижу, что на Job у меня есть getCredentials() вариант, но от чтения о маркере материала/Kerberos там у меня сложилось впечатление, что это для обеспеченных кластеров (который я думаю, что мы не) - не говоря уже о I не думаю, что у моего веб-сервера установлен Kerberos. Это может быть исправлено. Но это также звучит так, как предполагаемый прецедент - это добавить секреты, которые могут потребоваться при сокращении задания на карту при работе для доступа к другим службам, - а не о выполнении задания как кого-то другого.

Я также вижу, что на классе (старше?) JobConf у меня есть возможность setUser(String name), который кажется многообещающим - хотя я не знаю, где он потребует пароль или что-то в этом роде, но я не могу найти много информации или документации по этой функции. Я попробовал это, и это не повлияло - работа все еще была представлена ​​как пользователь Tomcat.

Есть ли другие пути для изучения или исследования? Я не говорю о ключевых словах для Google. Я бы предпочел, чтобы у меня не было опции «Просто дайте права пользователя tomcat пользователю на кластер» - я не управляю этим активом, и я не ожидаю, что этот запрос будет летать. Если, однако, это единственный мой вариант, я бы хотел понять, почему это так, поэтому я могу утверждать, что нужно иметь правильную информацию.

+1

Я считаю, что вы ищете что-то похожее на то, что называется безопасным олицетворение: http://hadoop.apache.org/docs/stable /Secure_Impersonation.html - это отправная точка –

ответ

4

Вы можете использовать UserGroupInformation класс вроде этого:

UserGroupInformation ugi = UserGroupInformation.createRemoteUser(username); 
ugi.doAs(new PrivilegedExceptionAction<MyMapReduceWrapperClass>() { 
    public Object run() throws Exception { 
     MyMapReduceWrapperClass mr = new MyMapReduceWrapperClass(); 
     ToolRunner.run(mr, null); 
     return mr; 
    } 
}); 
+0

Это действительно сработало. Я не понимаю, почему мне не нужно (по-видимому) предоставлять какие-либо учетные данные для имени пользователя, которое я выбрал. Я также попытался использовать 'createRemoteProxy', но это породило ошибки, связанные с тем, что я не мог олицетворять моего пользователя из моего пользователя tomcat. Тем не менее, прогресс - это прогресс, спасибо! – Mikeb

+0

@Mikeb, @ highcaffeinated это требует каких-либо дополнительных изменений конфигурации? Это не работает в моем случае. –

+0

@AkashMahajan, как это не работает? как ваш кластер обеспечен? вы должны открыть новый вопрос со спецификой вашей проблемы, чтобы мы могли помочь. – highlycaffeinated

Смежные вопросы