Importante | mr usa hcatalog para leer y escribir tablas de colmena
Hablando de big data
Este artículo habla principalmente sobre mapreduce usando HCatalog para leer y escribir tablas de colmena.
hcatalog hace que los metadatos de hive puedan ser utilizados por otras herramientas de hadoop, como pig, mr y hive.
Las tablas de HCatalog brindan a los usuarios una vista relacional de los datos en (HDFS) y aseguran que los usuarios no tengan que preocuparse por dónde se almacenan sus datos o en qué formato, por lo que los usuarios no necesitan saber si los datos están almacenados en RCFile formato, archivo de texto o archivo de secuencia.
También proporciona servicios de notificación para notificar a las herramientas de flujo de trabajo (como Oozie) cuando hay nuevos datos disponibles en el almacén.
HCatalog proporciona HCatInputFormat / HCatOutputFormat para permitir a los usuarios de MapReduce leer / escribir datos en el almacén de datos de Hive. Permite a los usuarios leer solo las particiones de las tablas y columnas que necesitan. El formato de registro devuelto es un formato de lista conveniente y el usuario no necesita analizarlos.
A continuación damos un ejemplo sencillo.
En la clase del asignador, obtenemos el esquema de la tabla y usamos esta información de esquema para obtener las columnas requeridas y sus valores.
A continuación se muestra la clase de mapa.
public class onTimeMapper extends Mapper {
@Override
protected void map(WritableComparable key, HCatRecord value,
org.apache.hadoop.mapreduce.Mapper.Context context)
throws IOException, InterruptedException {
// Get table schema
HCatSchema schema = HCatBaseInputFormat.getTableSchema(context);
Integer year = new Integer(value.getString("year", schema));
Integer month = new Integer(value.getString("month", schema));
Integer DayofMonth = value.getInteger("dayofmonth", schema);
context.write(new IntPair(year, month), new IntWritable(DayofMonth));
}
}
En la clase reducida, se crea un esquema para que los datos se escriban en la tabla de colmena.
public class onTimeReducer extends Reducer {
public void reduce (IntPair key, Iterable value, Context context)
throws IOException, InterruptedException{
int count = 0; // records counter for particular year-month
for (IntWritable s:value) {
count++;
}
// define output record schema
List columns = new ArrayList(3);
columns.add(new HCatFieldSchema("year", HCatFieldSchema.Type.INT, ""));
columns.add(new HCatFieldSchema("month", HCatFieldSchema.Type.INT, ""));
columns.add(new HCatFieldSchema("flightCount", HCatFieldSchema.Type.INT,""));
HCatSchema schema = new HCatSchema(columns);
HCatRecord record = new DefaultHCatRecord(3);
record.setInteger("year", schema, key.getFirstInt());
record.set("month", schema, key.getSecondInt());
record.set("flightCount", schema, count);
context.write(null, record);
}
}
Finalmente, cree la clase de controlador e indique el esquema de entrada y salida y la información de la tabla.
public class onTimeDriver extends Configured implements Tool{
private static final Log log = LogFactory.getLog( onTimeDriver.class );
public int run( String[] args ) throws Exception{
Configuration conf = new Configuration();
Job job = new Job(conf, "OnTimeCount");
job.setJarByClass(onTimeDriver.class);
job.setMapperClass(onTimeMapper.class);
job.setReducerClass(onTimeReducer.class);
HCatInputFormat.setInput(job, "airline", "ontimeperf");
job.setInputFormatClass(HCatInputFormat.class);
job.setMapOutputKeyClass(IntPair.class);
job.setMapOutputValueClass(IntWritable.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(DefaultHCatRecord.class);
job.setOutputFormatClass(HCatOutputFormat.class);
HCatOutputFormat.setOutput(job, OutputJobInfo.create("airline", "flight_count", null));
HCatSchema s = HCatOutputFormat.getTableSchema(job);
HCatOutputFormat.setSchema(job, s);
return (job.waitForCompletion(true)? 0:1);
}
public static void main(String[] args) throws Exception{
int exitCode = ToolRunner.run(new onTimeDriver(), args);
System.exit(exitCode);
}
}
Por supuesto, antes de ejecutar el código escrito anteriormente, debe crear una tabla de salida en Hive.
create table airline.flight_count
(Year INT ,
Month INT ,
flightCount INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
El lugar que puede causar un error es que $ HIVE_HOME no está configurado.
[Fin]