martes, 27 de mayo de 2014

[SQOOP] ERROR org.apache.sqoop.core.SqoopServer: Server startup failure

Tras las repetidas caídas del servicio HiveServer2, puerto por defecto 10000, en cuanto ejecutaba un par de consultas y a veces ni eso, me dispuse como es lógico a solucionarlo.

Lo primero que detecté es el siguiente mensaje de aviso y curiosamente al mismo tiempo de error:

# more /var/log/hive/hadoop-cmf-hive-HIVESERVER2-server.log.out
...
WARN org.apache.hive.service.cli.thrift.ThriftCLIService: Error getting catalogs: 
org.apache.hive.service.cli.HiveSQLException: Invalid SessionHandle: SessionHandle [be14ad52-85bd-42d7-83e2-da5051a8136f]
at org.apache.hive.service.cli.session.SessionManager.getSession(SessionManager.java:157)
at org.apache.hive.service.cli.CLIService.getSchemas(CLIService.java:222)
at org.apache.hive.service.cli.thrift.ThriftCLIService.GetSchemas(ThriftCLIService.java:360)
at org.apache.hive.service.cli.thrift.TCLIService$Processor$GetSchemas.getResult(TCLIService.java:1433)
at org.apache.hive.service.cli.thrift.TCLIService$Processor$GetSchemas.getResult(TCLIService.java:1418)
at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:39)
at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:39)
at org.apache.hive.service.auth.TSetIpAddressProcessor.process(TSetIpAddressProcessor.java:57)
at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:244)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
...

Finalmente acabé encontrando que era un bug conocido de Cloudera Manager y de su versión CDH-5.0.0, exactamente la mía, y que se solucionaba con la actualización a la versión CDH-5.0.1

Pues nada, manos a la obra y a actualizar primero mi entorno de desarrollo. Descargo el parcel desde el propio Cloudera Manager, lo distribuyo y por último lo activo. Pero es durante este último paso cuando me topo con que el servicio Sqoop no se inicia satisfactoriamente.

# more /var/log/sqoop2/sqoop-cmf-sqoop-SQOOP_SERVER-server.log.out
...
ERROR org.apache.sqoop.core.SqoopServer: Server startup failure
org.apache.sqoop.common.SqoopException: CONN_0007:Connector registration failed
at org.apache.sqoop.connector.ConnectorManager.registerConnectors(ConnectorManager.java:236)
at org.apache.sqoop.connector.ConnectorManager.initialize(ConnectorManager.java:197)
at org.apache.sqoop.connector.ConnectorManager.initialize(ConnectorManager.java:145)
at org.apache.sqoop.core.SqoopServer.initialize(SqoopServer.java:51)
at org.apache.sqoop.server.ServerInitializer.contextInitialized(ServerInitializer.java:38)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4206)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4705)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:943)
at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:778)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:504)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1317)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1065)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:840)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
at org.apache.catalina.core.StandardService.start(StandardService.java:525)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: org.apache.sqoop.common.SqoopException: JDBCREPO_0026:Upgrade required but not allowed - Connector: generic-jdbc-connector
at org.apache.sqoop.repository.JdbcRepository$3.doIt(JdbcRepository.java:190)
at org.apache.sqoop.repository.JdbcRepository.doWithConnection(JdbcRepository.java:90)
at org.apache.sqoop.repository.JdbcRepository.doWithConnection(JdbcRepository.java:61)
at org.apache.sqoop.repository.JdbcRepository.registerConnector(JdbcRepository.java:156)
at org.apache.sqoop.connector.ConnectorManager.registerConnectors(ConnectorManager.java:216)
... 28 more
...

En seguida me encuentro con la solución de configurar las siguientes dos líneas del fichero sqoop.properties:
org.apache.sqoop.connector.autoupgrade=true
org.apache.sqoop.framework.autoupgrade=true

Pero esto no resulta suficiente, o como más tarde me daría cuenta incorrecto, y no resuelve el problema.

El tema es que por lo visto Cloudera Manager (CM) siempre va a crear su propia versión de los archivos de configuración en función de su propia configuración al iniciar un servicio y por lo tanto los cambios locales serán ignorados. Es necesario por lo tanto configurar estas propiedades dentro de la pestaña de configuración de dicha herramienta del ecosistema.
Cloudera Manager - Sqoop => Configuración => Sqoop Server Default Group => Avanzada
Cloudera Manager - Sqoop => Configuración => Sqoop Server Default Group => Avanzada

Fragmento de configuración avanzada Sqoop Server (válvula de seguridad) para sqoop.properties
Fragmento de configuración avanzada Sqoop Server (válvula de seguridad) para sqoop.properties
Guardamos los cambios y volvemos a tratar de iniciar el servicio y ¡voilà!