for - Establecer el usuario del sistema hadoop para el cliente integrado en la aplicación web Java
hdfs (3)
El siguiente código funciona igual para mí
System.setProperty("HADOOP_USER_NAME", "hduser")
UserGroupInformation ugi = UserGroupInformation.createRemoteUser("hduser");
ugi.doAs(new PrivilegedExceptionAction<Void>() {
public Void run() throws Exception {
Configuration configuration = new Configuration();
configuration.set("hadoop.job.ugi", "hduser");
int res = ToolRunner.run(configuration, new YourTool(), args);
return null;
}
});
Me gustaría enviar trabajos de MapReduce desde una aplicación web Java a un clúster de Hadoop remoto, pero no puedo especificar para qué usuario se debe enviar el trabajo. Me gustaría configurar y usar un usuario del sistema que se debe usar para todos los trabajos de MapReduce.
Actualmente no puedo especificar ningún usuario y no importa lo que el trabajo de hadoop se ejecute con el nombre de usuario del usuario actualmente conectado del sistema cliente. Esto causa un error con el mensaje
Permission denied: user=alice, access=WRITE, inode="staging":hduser:supergroup:rwxr-xr-x
... donde "alice" es el usuario local que inició sesión en la máquina del cliente.
Yo he tratado
- varias combinaciones de crear instancias de
UserGroupInformation
(tanto proxies como usuario normal) y - estableciendo la propiedad del sistema Java con
-Duser.name=hduser
, cambiando el envar deUSER
y como una llamada codificada deSystem.setProperty("user.name", "hduser")
.
... en vano. En cuanto a 1), confieso que no tengo ni idea de cómo se supone que se utilizarán estas clases. También tenga en cuenta que cambiar la propiedad del sistema Java obviamente no es una solución real para usar en la aplicación web.
¿Alguien sabe cómo se especifica qué usuario utiliza Hadoop para conectarse a un sistema remoto?
PS / Hadoop está utilizando la configuración predeterminada, lo que significa que no se utiliza autenticación al conectarse al clúster y que Kerberos no se usa para comunicarse con las máquinas remotas.
Finalmente tropecé con la constante
static final String HADOOP_USER_NAME = "HADOOP_USER_NAME";`
en la UserGroupInformation class
.
Estableciendo esto como una variable de entorno, como una propiedad del sistema Java al inicio (usando -D
) o programáticamente con System.setProperty("HADOOP_USER_NAME", "hduser");
hace que Hadoop use cualquier nombre de usuario que desee para conectarse al clúster Hadoop remoto.
Puedo resolver un problema similar mediante el uso de la función de suplantación segura http://hadoop.apache.org/docs/stable1/Secure_Impersonation.html
siguiente es un fragmento de código
UserGroupInformation ugi = UserGroupInformation.createProxyUser("hduser", UserGroupInformation.getLoginUser());
ugi.doAs(new PrivilegedExceptionAction() {
public Void run() throws Exception {
Configuration jobconf = new Configuration();
jobconf.set("fs.default.name", "hdfs://server:hdfsport");
jobconf.set("hadoop.job.ugi", "hduser");
jobconf.set("mapred.job.tracker", "server:jobtracker port");
String[] args = new String[] { "data/input", "data/output" };
ToolRunner.run(jobconf, WordCount.class.newInstance(), args);
return null;
} });
El ID de usuario de inicio de sesión remoto (host de escritorio de Windows en mi caso) debe agregarse en core-site.xml como se menciona en la URL mencionada anteriormente.