Recopilación de problemas de análisis de datos fuera de línea basados en hadoop y hive

1. Combine archivos pequeños. La arquitectura nginx + flume + hdfs recopila y almacena registros, pero los registros recopilados por flume eventualmente tendrán muchos archivos pequeños almacenados en hdfs. Lo que es incómodo es que hdfs no es adecuado para procesar una gran cantidad de archivos pequeños, pero afortunadamente, mapreduce de hadoop proporciona Para fusionar archivos pequeños en lotes, aquí está el código de productos secos:

在这里插入代码片
package baobei.data.etl;
import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.CombineTextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

/**
 * flume会产生多个文件到hdfs,这里设置将小文件聚合为一个大文件,
 * 方便后面的数据处理
 * 
 */
public class SmallFileCombiner {
	
	static class SmallFileCombinerMapper extends Mapper<LongWritable, Text, Text, NullWritable>{
		NullWritable v = NullWritable.get();
		@Override
		protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
			//通过这种方式相当于是直接把值打印到磁盘文件中。value其实就是每一样的的文件内容
			context.write(value, v);
		}
		
	}
	
	/**
	 * 如果生产环境中,小文件的数量太多,那么累计起来的数量也是很庞大的,那么这时候就要设置切片的大小了。
	 * 
	 * 即使用:CombineTextInputFormat.setMaxInputSplitSize(job, 1024*1024*150);
	 */
	public static void main(String[] args) throws Exception {
		Configuration conf = new Configuration();
		Job job = Job.getInstance(conf);		
		job.setJarByClass(SmallFileCombiner.class);	
		job.setMapperClass(SmallFileCombinerMapper.class);		
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(NullWritable.class);	
		//下面的方式将小文件划分为一个切片。
		job.setInputFormatClass(CombineTextInputFormat.class);
		//如果小文件的总和为224M,将setMaxInputSplitSize中的第二个参数设置成300M的时候,在
		//hdfs://master:9000/output下只会生成一个part-m-00000这种文件
		//如果将setMaxInputSplitSize中的第二个参数设置成150M的时候,在
		//hdfs://master:9000/output下会生成part-m-00000 和 part-m-00001 两个文件
		CombineTextInputFormat.setMaxInputSplitSize(job, 1024*1024*150);
		CombineTextInputFormat.setInputPaths(job, new Path("hdfs://maoyunchao:9000/in/"));
		FileOutputFormat.setOutputPath(job, new Path("hdfs://maoyunchao:9000/output/"));
//		job.setNumReduceTasks(0);		
		job.waitForCompletion(true);
	}
}

2. La memoria del clúster es insuficiente. Realice la expansión del clúster y aumente Datanode.
3. Al escribir scripts de shell, es mejor agregar la fuente / etc / profile delante del script, de modo que se identifiquen las variables de entorno; de lo contrario, hive -f, hive -e y otras instrucciones del script se ejecutarán regularmente usando crontab No existe tal instrucción por error.
4. Use hive -e '' en la terminal con comillas simples, pero la instrucción después de hive -e "" en el script de shell necesita usar comillas dobles.
5. Se informa un error cuando sqoop exporta datos de hive a mysql, consulte el manual que corresponde a la versión de su servidor MySQL para conocer la sintaxis correcta para usar near . Después del análisis y la consulta, se encontró que era un problema de versión reportado por mysql jar. Al principio, usé la versión 5.1.6. Es mejor usar la versión 5.1.32 para el paquete mysql jar, que es relativamente estable y no tiene errores.
6. La velocidad de consulta es demasiado lenta. 12 máquinas (16G + 8 núcleos), 14 Gs y un volumen de datos de aproximadamente 20 millones. Al principio, toma alrededor de 1 40 minutos completar el negocio. Finalmente, después de varios ajustes, como: reutilización de Jvm, ejecución de trabajos en paralelo , El cierre de la ejecución especulativa, la configuración del número de reductores, la optimización del sesgo y la salificación de datos (operación de sufijo aleatorio de doble grupo) y la optimización de la combinación (la combinación de reducción se convierte en combinación de mapa, combinación SMB), y el tiempo de ejecución final se puede completar en aproximadamente 1 hora. Entre ellos, la velocidad de ejecución más lenta es que los datos del análisis de la cadena externa están inclinados, lo que tarda unos 15 minutos y unos 10 minutos después de la optimización.
7. Al escribir la declaración hql, agregue el nombre de la base de datos, por ejemplo: seleccione * de baobei.pv delante de la tabla; de lo contrario, buscará la tabla en la biblioteca predeterminada predeterminada.
8. Escriba algunos udf y alguna configuración en el archivo .hiverc en $ HIVE_HOME / bin, y ejecútelo de forma predeterminada cada vez que se ejecute la instrucción de hive.
9. Al depurar, algunas tareas zombies a veces se usan para matar. Cuando eliminas tareas de mapreduce, puedes usar hadoop job -kill jobID y yarn application -kill ApplicationId.
10. Cuando utilice métodos de almacenamiento como orcFile, parquet, etc., cree directamente una tabla y luego importe los datos, de modo que se notifique un error durante la consulta y se deben insertar algunos datos de otra tabla. por ejemplo: insertar tabla de sobrescritura xxx seleccionar ... no se puede usar la ruta de entrada de datos de carga ... directamente.

Supongo que te gusta

Origin blog.csdn.net/qq_39719415/article/details/90523122
Recomendado
Clasificación