¿Cómo me aseguro de que RegexSerDe esté disponible para mis nodos Hadoop?
hive classnotfoundexception (3)
La manera más fácil de arreglar esto es agregar todos estos archivos jar al directorio lib de hadoop en todos los rastreadores de tareas, lo hacemos con un montón de cosas:
scp library.jar task-tracker-1:~/<HADOOP_HOME>/lib/
o con EMR en el script bootstrap:
s3cmd get s3://path/to/lib.jar /home/hadoop/lib/
Cuando usamos EMR, acabamos de tener un directorio s3 lleno de jar que sincronizaríamos con el directorio de hadoop lib:
s3cmd sync s3://static/jars/ /home/hadoop/jars
cp jars/*.jar lib/
Si usa oozie, también puede colocar los archivos jar en el directorio oozie.share.lib.
Estoy tratando de atacar el problema de analizar los registros web con Hive, y he visto muchos ejemplos, pero parece que no puedo encontrar a nadie con este problema específico.
Aquí es donde estoy: configuré un clúster AWS ElasticMapReduce, puedo iniciar sesión y activar Hive. Me aseguro de add jar hive-contrib-0.8.1.jar
, y dice que está cargado. Creo una tabla llamada event_log_raw
, con algunas columnas de cadena y una expresión regular. load data inpath ''/user/hadoop/tmp overwrite into table event_log_raw
, y me voy a las carreras. select * from event_log_raw
funciona (creo que localmente, ya que no obtengo el mapa% y reduzco% outputs), y obtengo mis 10 registros de mis datos de muestra, analizados correctamente, todo está bien. select count(*) from event_log_raw
funciona, esta vez con un trabajo de mapreduce creado.
Quiero convertir mi campo request_url
a un mapa, así que ejecuto:
select elr.view_time as event_time, elr.ip as ip,
str_to_map(split(elr.request_url," ")[1],"&","=") as params
from event_log_raw elr
Mapreduce se dispara, espera, espera ... FALLÓ.
FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.MapRedTask
MapReduce Jobs Launched:
Job 0: Map: 1 HDFS Read: 0 HDFS Write: 0 FAIL
Compruebo los syslogs de los rastreadores de tareas y veo, entre otras cosas,
java.lang.RuntimeException: Error in configuring object
at org.apache.hadoop.util.ReflectionUtils.setJobConf(ReflectionUtils.java:93)
at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:64)
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:117)
<snip>
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.contrib.serde2.RegexSerDe
at org.apache.hadoop.hive.ql.exec.MapOperator.setChildren(MapOperator.java:406)
at org.apache.hadoop.hive.ql.exec.ExecMapper.configure(ExecMapper.java:90)
... 22 more
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.contrib.serde2.RegexSerDe
He googleado y SO''ed esto, pero creo que mi google-fu no está a la altura. Todo lo que he encontrado apunta a que la gente tiene problemas con esto y lo soluciona al ejecutar el comando add jar
. Lo intenté, intenté agregarlo a mi hive-site.xml
, intenté tenerlo localmente e intenté poner el contenedor en un contenedor s3. Intentó agregar un paso de arranque para agregarlo durante la fase de arranque (desastre).
¿Puede alguien ayudarme a encontrar un.) Por qué mis nodos de tareas no pueden encontrar RegexSerDe, yb) cómo hacer que esto funcione? Los enlaces son bienvenidos también, si pueden revelar algo más que solo ejecutar add jar
.
¡Gracias por adelantado!
Copié el archivo jar de serde al
hadoop/lib
directorio y también hizo un reinicio de la hadoop (o incluso el servidor) para realmente trabajar.
Supongo que todo lo que necesita es agregar este archivo jar a la variable HIVE_AUX_JARS_PATH
para, por ejemplo,
Si tu hive-contrib-0.8.1.jar
está en /usr/hive/lib
entonces ejecuta
export HIVE_AUX_JARS_PATH=/usr/hive/lib/hive-contrib-0.8.1.jar:$HIVE_AUX_JARS_PATH
o si HIVE_AUX_JARS_PATH
no existe, simplemente ejecuta
export HIVE_AUX_JARS_PATH=/usr/hive/lib/hive-contrib-0.8.1.jar
.
Después de eso, inicie la sesión de colmena y verá que todo funciona bien.
En caso de que necesite esta variable, .profile
permanente en el archivo .profile
o .bash_profile
según su sistema operativo