Sword Finger Data Warehouse-Hive04

1. Repaso de la última lección.

Two, Hive03

Tercero, el uso de varias funciones en Hive

1. Repaso de la última lección.

  • https://blog.csdn.net/SparkOnYarn/article/details/105182082
  • Join se divide en conexión interna, conexión externa, conexión externa izquierda, conexión externa derecha, conexión completa; tres tipos de datos complejos: Map, Struct, Array, la definición de estos tres tipos, valor almacenado y valor; las funciones integradas solo necesitan Verifique la definición detallada; no se recomienda almacenar datos json en Hive, la función incorporada puede analizar la URL (parse_url_tuple)

2. Ordenar en big data (ordenar por, ordenar por, agrupar por)

El problema de clasificación no es un problema cuando la cantidad de datos es pequeña, pero tan pronto como la cantidad de datos es grande, surge el problema:

1, ordenar por (orden global)
  • Si desea implementar la clasificación global como se indicó anteriormente, debe haber solo una reducción; si hay varios reductores, hay un orden en reduce1 y un orden en reduce2, pero no se puede garantizar el orden global. Ordenar por se usa con precaución en la producción, la cantidad de datos es grande, pero solo hay una reducción,

seleccione * del orden emp por empno desc;

0: jdbc: hive2: // hadoop001: 10000 / ruozedata_hiv> set hive.mapred.mode = estricto;
No hay filas afectadas (0.004 segundos)
0: jdbc: hive2: // hadoop001: 10000 / ruozedata_hiv> select * from emp order by empno desc;
Error: Error al compilar la declaración: FALLIDO: SemanticException 1:27 En modo estricto, si se especifica ORDER BY, también debe especificarse LIMIT. Se encontró un error cerca del token 'empno' (estado = 42000, código = 40000)

Abra hive.configure.properties, preste atención al parámetro: hive.mapred.mode; en modo estricto, algunas consultas muy cargadas no pueden ejecutarse, por ejemplo: el escaneo completo de tablas está prohibido, si solo usa ordenar por, debe agregar Campo de límite superior:
Inserte la descripción de la imagen aquí
encontramos una tabla de partición para operar:
/ ruozedata_hiv> select * from order_partition donde event_month = '2020-01' ordene por order_no desc;
Error: Error al compilar la declaración: FALLIDO: SemanticException 1:67 en modo estricto, si se especifica ORDER BY, también se debe especificar LIMIT. Se encontró un error cerca del token 'order_no' (estado = 42000, código = 40000)

0: jdbc: hive2: // hadoop001: 10000 / ruozedata_hiv> set hive.mapred.mode = no estricto;
No hay filas afectadas (0.002 segundos)

0: jdbc: hive2: // hadoop001: 10000 / ruozedata_hiv> select * from order_partition donde event_month = '2020-01' ordenar por order_no desc;

En modo estricto:
si es una tabla normal: ordenar por + límite
tabla de partición: ordenar por + límite donde columna de partición

  • Ordenar por uso con precaución en la producción:
ordenar por
  • Puede garantizar que cada partición esté ordenada, tiene varias reducciones, y los resultados que produce están ordenados, pero no puede garantizar el orden global; ordenar por no se ve afectado por el modo estricto y el modo no estricto: la columna puede ser más , Tipo numérico-> número; tipo de cadena-> diccionario:
  • El orden lexicográfico se organiza en el orden de las letras abcd:
nombre valor descripción
mapred.reduce.tasks -1

Inserte la descripción de la imagen aquí
1
设置 设置reduce 数 :set mapred.redcue.tasks = 3; 设置 3 个 reducir
la información de trabajo de Hadoop para la Etapa-1: número de mapeadores: 1; cantidad de reductores: 3

2、select * from emp sort by empno;
结果在控制台上输出是没那么明显的直观的:

3、MR中有多少个reduce作业就对应输出多少个文件、spark中多少个task就对应输出多少个输出文件:

4、把输出文件放到本地liunux目录上再做决断:
insert overwrite local directory '/home/hadoop/tmp/hivetmp/sort/' select * from emp sort by empno;

5、自行去到输出目录中查看确实是有3个输出文件 --> 这就是所谓的分区有序:
[hadoop@hadoop001 sort]$ pwd
/home/hadoop/tmp/hivetmp/sort
[hadoop@hadoop001 sort]$ ll
total 12
-rw-r--r-- 1 hadoop hadoop 335 Apr  3 13:59 000000_0
-rw-r--r-- 1 hadoop hadoop 282 Apr  3 13:59 000001_0
-rw-r--r-- 1 hadoop hadoop  91 Apr  3 13:59 000002_0
  • La visualización de la declaración select en el sitio web oficial:
    https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select

¿Por qué se debe agregar el límite en modo estricto? El mecanismo de clasificación predeterminado asc ascendente, lexicográfico (lexicográfico),

Distribuir por :

Cómo usar: distribuir por + col: distribuir datos a diferentes reductores de acuerdo con los campos especificados; equivalente a Partitioner en MapReduce, generalmente utilizado junto con Ordenar por;

  • Hive usa las columnas en Distribuir por para distribuir las filas entre los reductores. Todas las filas con las mismas columnas Distribuir por irán al mismo reductor. Sin embargo, Distribuir por no garantiza las propiedades de agrupación o clasificación en las claves distribuidas.

1. Distribuya de acuerdo con la longitud del nombre, y ordene en orden ascendente del número de empleado dentro de la partición:
inserte sobrescribir el directorio local '/ home / hadoop / tmp / hivetmp / distribure' select * from emp distribuir por longitud (ename) ordenar por empno;

// La escena del sesgo de datos en Big Data debe depender de la distribución,

Grupo por:
  • cluster by es un atajo para Distribuir por y ordenar por: solo para distribución de datos:

  • inserte sobrescribir el directorio local '/ home / hadoop / tmp / hivetmp / distribution' select * from emp cluster by empno;

Resumen:

ordenar por: orden global, baja eficiencia bajo una gran reducción de datos
ordenar por: ordenar en cada reducción, no puede garantizar el orden global
distribuir por: es la distribución de datos de acuerdo con el campo especificado que
se usa a menudo junto con ordenar por, para garantizar que cada reducción
Cluster ordenado internamente por = distribuir por + cluster por

Pensamiento: la producción requiere resultados de estadísticas comerciales ordenadas, no se puede utilizar el orden por, y ordenar por no puede garantizar el orden global, ¿cómo se debe resolver?

Tres, el uso de Sqoop

3.1 Los antecedentes y la introducción de Sqoop

Escenarios:
1), los datos se almacenan en MySQL, desea usar Hive para procesar
2), use el análisis estadístico de Hive, los datos aún están en Hive, cómo exportar a MySQL:
-> Finalmente, el informe se visualiza, los resultados Cómo conectarse al informe: (1), HiveServer2 (2), los resultados estadísticos de Hive se exportan al RDBMS, los datos del informe se conectan directamente al RDBMS, los dos escenarios necesarios

Solución: MapReduce (demasiado complicado)
-> resumen en herramientas comunes

Sqoop es una herramienta de importación y exportación de datos:
similar al acceso de Hive a la información hx-site.xml de MySQL bajo $ HIVE_HOME / cong:
RDBMS requiere la siguiente información de enlace: contraseña de usuario de la tabla db del controlador url (información requerida) El
enlace a hdfs requiere: El
enlace de ruta a Hive requiere: partición de tabla de base de datos

-> Esto lleva al marco Sqoop: sqoop.apache, org

sqoop: sql to hadoop
hue: un marco visual, escriba SQL en él, los resultados se pueden usar en forma de informes: tan pronto como salgan los resultados de configuración de CDH.

Mire la compañía en el clúster de producción, primero conéctela al servidor a través del trampolín, ¿puede Dbeaver estar vinculado al servidor de producción?

Introducción a Sqoop:
  • Apache Sqoop ™ es una herramienta diseñada para transferir eficientemente datos masivos entre Apache Hadoop y almacenes de datos estructurados, como bases de datos relacionales.
  • sqoop es una herramienta utilizada para transferir datos de manera eficiente, una herramienta que interopera entre hadoop y bases de datos estructuradas, como RDBMS y Hadoop.

RDBMS <==> Hadoop, también puede importar los datos a Hbase y Hive.

Dos versiones principales:
sqoop1.x: sqoop1 *** (aproximadamente el 70% de las empresas usan esto)
sqoop1.99.x: sqoop2 (es muy problemático de usar)

  • Estamos utilizando sqoop1, y los dos marcos no tienen comparación.
Responsabilidades:
把数据从RDBMS和Hadoop之间记性导入导出操作,底层就是使用MapReduce来实现的。
Sqoop只有Map,它不需要Reduce;

Importación de Sqoop: basado en Hadoop como punto de referencia y punto de referencia:
RDBMS <==> Hadoop

Exportación de Sqoop: desde Hadoop como punto de partida hacia el exterior:
Hadoop <==> RDBMS
Inserte la descripción de la imagen aquí

3.2 Instalación y despliegue de Sqoop

1. Descargar:
wget http://archive.cloudera.com/cdh5/cdh/5/sqoop-1.4.6-cdh5.16.2.tar.gz

2. Descomprima y realice una conexión suave:
tar -zxvf sqoop-1.4.6-cdh5.16.2.tar.gz -C ~ / app /
ln -s sqoop-1.4.6-cdh5.16.2 sqoop

3. Configure las variables de entorno del sistema: vi ~ / .bashrc
export SQOOP_HOME = / home / hadoop / app / sqoop
export PATH = S Q El El P H O M E / b i n : SQOOP_HOME / bin: RUTA

4. Variables de entorno efectivas:
fuente ~ / .bashrc

5. Copie un archivo bajo $ SQOOP_HOME / conf, y luego configure los parámetros:
cp sqoop-env-template.sh sqoop-env.sh
export HADOOP_COMMON_HOME = / home / hadoop / app / hadoop
export HADOOP_MAPRED_HOME = / home / hadoop / app / hadoop
export HIVE_HOME = / home / hadoop / app / hive

6. Copie un paquete de controladores en el directorio $ SQOOP_HOME / lib:
cp mysql-connector-java-5.1.27-bin.jar $ SQOOP_HOME / lib /

3.3, uso simple de Sqoop

sqoop help Ver comando de ayuda, aprender sqoop es buscar el diccionario:

1. versión sqoop:
ver el número de versión

2. Enumere las bases de datos en mysql, vea el comando help: sqoop help list_databases

sqoop list-databases \
--connect jdbc:mysql://hadoop001:3306 \
--username root \
--password 960210

输出结果如下:
20/04/03 15:08:06 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
information_schema
mysql
performance_schema
ruozedata_hive
sqoop
sys
wordpress

3. Liste las tablas bajo la base de datos:

sqoop list-tables \
--connect jdbc:mysql://hadoop001:3306/sqoop \
--username root \
--password 960210

//运行结果如下:
20/04/03 15:39:54 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
dept
emp
salgrade

3.4 Uso detallado de la importación de Sqoop (desde MySQL–> hdfs)

importación de ayuda sqoop: Ver ayuda de comando:

参数先捋一遍:
--append
--columns <col,col,col...> 
--delete-target-dir     
-m,--num-mappers <n> 
--mapreduce-job-name <name>
--target-dir <dir>
Requisito 1: Importe la tabla de datos emp en sqoop a HDFS:
sqoop import \
--connect jdbc:mysql://hadoop001:3306/sqoop \
--username root \
--password 960210 \
--table emp \
-m 1

//出现如下报错:
Exception in thread "main" java.lang.NoClassDefFoundError: org/json/JSONObject
        at org.apache.sqoop.util.SqoopJsonUtil.getJsonStringforMap(SqoopJsonUtil.java:43)
        at org.apache.sqoop.SqoopOptions.writeProperties(SqoopOptions.java:784)
        at org.apache.sqoop.Sqoop.main(Sqoop.java:252)
Caused by: java.lang.ClassNotFoundException: org.json.JSONObject
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

//原因是缺少java-json.jar包,上传一个即可解决问题:
  • Esta instrucción sqoop ejecutará la tarea mapreduce, el nombre de la aplicación es emp.jar (el nombre predeterminado es emp.jar si no se especifica ningún nombre) y el resultado de salida está por defecto en / user / hadoop / emp
1、如下所示,顺利的把MySQL中的数据导入到了hdfs目录上:
[hadoop@hadoop001 bin]$ hdfs dfs -ls /user/hadoop/emp
20/04/03 16:10:18 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 2 items
-rw-r--r--   1 hadoop supergroup          0 2020-04-03 16:08 /user/hadoop/emp/_SUCCESS
-rw-r--r--   1 hadoop supergroup        282 2020-04-03 16:08 /user/hadoop/emp/part-m-00000

2、使用了一个map所以结果是一个文件
[hadoop@hadoop001 bin]$ hdfs dfs -text /user/hadoop/emp/part-m-00000
20/04/03 16:10:31 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
7369,SMITH,CLERK,7902,1980-12-17,800.0,20.0,40
7499,SMITH,CLERK,7902,1980-12-17,800.0,20.0,40
7499,SMITH,CLERK,7902,1980-12-17,800.0,20.0,40
7499,SMITH,CLERK,7902,1980-12-17,800.0,20.0,40
7499,SMITH,CLERK,7902,1980-12-17,800.0,20.0,40
7499,SMITH,CLERK,7902,1980-12-17,800.0,20.0,40

Inserte la descripción de la imagen aquí

Prueba:

Herramienta ERROR: FileAlreadyExist, el directorio de archivos ya existe; lo que significa que la tabla de destino debe eliminarse en el comando de importación:

1. La información de registro impresa en la consola cuando el comando se ejecuta en el directorio $ SQOOP_HOME / bin, por qué hay un límite1, principalmente para verificar si esta tabla existe:
20/04/03 16:21:09 administrador de información. SqlManager: Ejecutando instrucción SQL: SELECT t. * FROM empAS t LIMIT 1

2. Por qué
el mapa establecido por número de divisiones: 1 es 1

3. Cada importación de sqoop en el directorio $ SQOOP_HOME / bin generará un archivo .java:

El líder es: elimine la tabla de destino cada vez antes de ejecutar el comando de importación:
  • En este momento, agregamos el parámetro --delete-target-dir y especificamos el nombre del trabajo ejecutado desde mysql2hdfs a través del parámetro --mapreduce-job-name, y luego restauramos el número de mapa especificado al valor predeterminado de 4;
sqoop import \
--connect jdbc:mysql://hadoop001:3306/sqoop \
--username root \
--password 960210 \
--table emp \
--mapreduce-job-name frommysql2hdfs \
--delete-target-dir 
  • Eliminamos el número de mapas a 1, y el error se informa como se indica arriba: el motivo es muy claro. Si hay una clave primaria en la tabla emp, no se informará ningún error. El valor predeterminado es 4 mapas. Si no hay una clave primaria en la tabla emp, debe especificar el mapa. Numero:
  • 20/04/03 16:32:18 ERROR tool.ImportTool: Falló la importación: no se pudo encontrar la clave primaria para la tabla emp. Especifique uno con --split-by o realice una importación secuencial con '-m 1'
Requisito 2: al importar datos en hdfs, especifique las columnas usted mismo y cambie el directorio (target-dir)
sqoop import \
--connect jdbc:mysql://hadoop001:3306/sqoop \
--username root \
--password 960210 \
--table emp \
--mapreduce-job-name frommysql2hdfs2 \
--delete-target-dir \
--target-dir emp_column \
--columns "empno,ename,job,sal,comm" \
-m 1
Requisito 3: el divisor de datos exportado es, necesitamos modificarlo a '\ t' y reemplazar el valor nulo con 0;
sqoop import \
--connect jdbc:mysql://hadoop001:3306/sqoop \
--username root \
--password 960210 \
--table emp \
--mapreduce-job-name frommysql2hdfs2 \
--delete-target-dir \
--target-dir emp_column \
--columns "empno,ename,job,sal,comm" \
--fields-terminated-by '\t' \
-- null-string '' \
--null-non-string '0' \
-m 1

//--fields-terminated-by '\t'把导出数据的分割符换成\t,-- null-string '' \
--null-non-string '0' \ -->意思是把空的字符串值替换为0
Preguntas comunes de entrevista:

1. ¿Cuál es la diferencia entre Ordenar por y ordenar por?

  • Ordenar por es el orden de cada partición, ordenar por es garantizar el orden global:

2. ¿Cuál es la diferencia entre hadoop fs -ls y hadoop fs -ls /?
Sin barra significa: / usuario / hadoop-> / usuario / nombre de usuario actual Una
barra significa el directorio raíz de hdfs

Publicado 23 artículos originales · elogiado 0 · visitas 755

Supongo que te gusta

Origin blog.csdn.net/SparkOnYarn/article/details/105291173
Recomendado
Clasificación