Guía de programación de Hive-Notes-2

Nota: "La colmena práctica de combate real de Hive es una guía para el sistema de almacenamiento de datos de hadoop", en lo sucesivo denominado combate real de la colmena, se le han agregado algunos.
Capítulo 7 Vista
7.1
de ()
una selección de una;
- Esta redacción no está en Oracle, es similar a tomarla prestada. En con --create
view
crear vista si no existe stock_basic_test_view (stock_id, stock_name) comentario'stock
view '
tblproperties (' creator '=' zhangyt ')
como seleccionar stock_id, stock_name de stock_basic_test; - los campos de la
vista se pueden omitir

create view if not exists stock_basic_partition_view  
comment '股票视图'
tblproperties('creator'='zhangyt')
as 
select 
stock_id,
stock_name ,
count(*)  
from  stock_basic_partition 
group by  stock_id,stock_name ;
-- 如果属性字段没有指定列名会是cN这个样式

describe  stock_basic_test_view ;

使用like  创建视图
create  view   stock_basic_test_view2 as select  * from  stock_basic_test_view;

删除视图
drop  view  stock_basic_test_view2;

Capítulo VII índice
8.1 para crear un índice Índice
general:
Crear índice stock_basic_index
EN la Tabla stock_basic_test (STOCK_ID)
AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
con reconstrucción diferida
en la Tabla index_table
el Comentario 'stock_basic_partition indexado por STOCK_ID' ;

    说明:as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' 是指定了索引处理器,也就是一个java类  大小写严格一致
    in table 表示 不一定需要在新标中保留索引数据。 
    注意 但是每个索引只能用一次这个表 下次就报错表已经存在 建议不加这个
    partition by (stock_id) 表示索引分区了
    其实在 comment 之前可以加上 stored as , row format, location 等字段。 

    create  index stock_basic_index_map 
    on table stock_basic_test(stock_id)
    as 'bitmap'
    with deferred rebuild 
    in  table  index_table2  
    comment 'stock_basic_partition indexed  by  stock_id ';
    bitmap索引
    只需要 将     as 'org.apache.hadoop.hive.ql.index.compact.compactindexhandler' 替换为 as  'bitmap' 和 in table 
8.2-8.4重建索引和删除索引 
    show  formatted index  on stock_basic_test;

    alter  index stock_basic_index_map on     stock_basic_test   rebuild;

    drop  index  stock_basic_index_map on  stock_basic_test;

    /**
    分区索引  --报错后续研究下    
    create  index stock_basic_partition_index 
    on table stock_basic_partition(stock_id)
    as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
    with deferred rebuild 
    in  table  index_table partitioned  by (stock_id)
    comment 'stock_basic_partition indexed  by  stock_id '
    alter  index stock_basic_partition_index on  table  stock_basic_partition partition(stock_id=) rebuild;
    **/

Capítulo 9 Diseño de modo
9.2 Acerca del
mapa de particiones Reducir convertirá una tarea (trabajo) en múltiples tareas. De forma predeterminada, cada tarea es una nueva instancia de jvm, que requiere la sobrecarga de abrir y destruir. Cada archivo pequeño corresponde a
una tarea. . En algunos casos, el tiempo para abrir y destruir la JVM puede ser mayor que el tiempo real de procesamiento de datos.
9.4 Procesamiento múltiple de los mismos datos:
la función de insertar de una tabla a múltiples tablas
desde table_all
insertar sobrescribir tabla table_a seleccionar donde table_all.column_name_id = '1'
insertar sobrescribir tabla table_b seleccionar
donde table_all.column_name_id = '1';
9.6 puntos Almacenamiento de datos de la tabla de depósitos:
si se utiliza una tabla de particiones para el almacenamiento, y la partición de primer nivel es la fecha y la partición de segundo nivel es para la codificación del usuario, hay demasiadas particiones de segundo nivel, lo que provocará una gran cantidad de archivos pequeños. Puede construir una partición en el primer nivel y construir un cubo en el segundo nivel.
crear tabla stock_basic_par_clust (
stock_name cadena comentario 'nombre de stock'
, stock_date cadena comentario 'fecha de stock'
, stock_start_price DECIMAL (15,3) comentario 'precio de apertura'
, stock_max_price DECIMAL (15,3) comentario 'precio más alto'
, stock_min_price DECIMAL (15,3) comentario 'precio más bajo'
, stock_end_price DECIMAL (15,3) comentario 'precio de cierre'
, stock_volume DECIMAL (15,3) comentario 'volumen'
, stock_amount DECIMAL (15,3) comentario'transacción Amount '
) particionado por (stock_id string) agrupado por (stock_date) en 10 depósitos; # Tenga en cuenta
que la partición es diferente de la agrupación. El campo del depósito todavía está en la declaración de creación de la tabla, pero la partición no.

    from  stock_basic 
    insert overwrite  table stock_basic_par_clust partition (stock_id='000001') select  
     stock_name   
    ,stock_date   
    ,stock_start_price
    ,stock_max_price
    ,stock_min_price
    ,stock_end_price
    ,stock_volume   
    ,stock_amount   
    where  stock_id='000001';
    注意:书中虽然说了要设置 set hive.enforce.bucketing=true 才能执行插入语句,但实际没设置也可以  该参数已经被移除了
    《hive实战》分桶表注意事项
    选择唯一值的个数比较多的桶键,这样会减少出现倾斜的可能
    如果桶键中数据是倾斜的,为倾斜的值单独创建桶,这可以通过列表分桶来实现
    使用质数作为桶的编号
    分桶对于常用链接在一起的事实表很有用
    需要连接在一起的分桶表,其桶的个数必须一致,或者一个桶的个数是另外一个的因子
    等等
9.8 使用列存储表
    具体等到15.3.2 看

Capítulo 10 Optimización
10.1 Uso de EXPLAIN
Una tarea de colmena contendrá varias etapas y las diferentes etapas tendrán dependencias.
Una etapa puede ser una tarea de reducción de mapas, una etapa de muestreo, una etapa de fusión o una etapa límite.
Hive generalmente ejecuta una etapa a la vez. A menos que exista un requisito de ejecución paralela.
10.2 Utilice explicar extendido
Tenga en cuenta que explicar extendido tiene más datos que explicar. A primera vista, ¿hay demasiadas ubicaciones de archivos?
10.3 El ajuste del límite
es similar al límite para evitar que todos los resultados se devuelvan en el cli.
set hive.limit.optimize.enable = true;
set hive.limit.row.max.size = 100; #Esto es inútil y el sistema predeterminado es 10000. Todavía muestra muchos cambios.
set hive.limit.optimize.limit.file = 10;
Pero esto no es nada. Usa
10.4join para optimizar mapjoin. Se siente mal.
10.5 Modo local
10.6 La ejecución en paralelo de
una tarea de colmena tendrá varias etapas. Si son diferentes, las tareas sin dependencias se pueden ejecutar en
conjunto paralelo hive.exec.parallel = true;
10.7 Modo estricto
conjunto hive.exec.dynamic.partition.mode = estricto;
set hive.exec.dynamic.partition.mode = nonstrict;
Beneficios: 1. La tabla de particiones debe estar particionada, de lo contrario no funcionará
2. Ordenar por límite debe agregarse

  1. Prohibir el producto cartesiano de una consulta
    verdad: se pueden ejecutar el modo estricto 1 y 2, que sin el modo estricto de partición y se puede realizar sin límite
    pero no se puede realizar el producto cartesiano de
    atención incluso si el conjunto hive.exec. dynamic.partition.mode = nonstrict;
    tampoco puede realizar un producto cartesiano, pero también establecer los siguientes parámetros en falso, de modo que pueda
    establecer hive.strict.checks.cartesian.product = false;
    10.8 Ajustar el número de mapeadores y reductores para
    mantener un equilibrio Es necesario. Demasiados mapeadores y reductores causan una sobrecarga excesiva durante la fase de inicio, la programación y la ejecución de JOB. Si el número de mapeadores y reductores es demasiado pequeño,
    no se muestra el paralelismo de hadoop.
    CLI puede ver el número aproximado de reductores necesarios:
    Número de tareas de reducción determinadas en tiempo de compilación: 10
    Número de tareas de reducción no especificadas. Estimado a partir del tamaño de los datos de entrada: 3
    Número de mapeadores: 3; Número de reductores: 1
    Hive controla el número de ruducers por el tamaño de los datos de entrada. Puede utilizar el siguiente comando para calcular el tamaño de entrada
    hdfs dfs -count hdfs: // master: 9000 / hive_dir / stock_basic / stock_info2020414.txt Nota: el valor es 760035648B

    属性 hive.exec.reducers.bytes.per.reducer 默认为 1GB(课本值) 256000000B(查得值)      通过设置这个值进而可以reducer数量调整
    (不知道是书上说的不准还是实际的有变化,并不是两个除的值)
    一个系统的插槽数(map reduce 个数)是固定的。可以设置属性 hive.exec.reducers.max防止某些大的job消耗完所有插槽。 建议值:reduce槽位个数*1.5/执行中的查询的平均个数

    Reutilización de 10.9jvm:
    comprensión personal: cuando hay muchos archivos pequeños, debe activar jvm. Causará mucha sobrecarga.A través de la reutilización de jvm, el jvm bajo el mismo trabajo se puede usar n veces. El valor de n está controlado por el parámetro mapred.job.reuse.jvm.num.tasks.
    Pero esta característica tiene una desventaja: la JVM abierta siempre ocupará el espacio de tarea utilizado. Sepa que la tarea está por encima de
    10.10 El índice es levemente
    10.11 Ajuste dinámico de la partición, vea arriba
    10.12 Ejecución especulativa: Comprensión: Es regresar para detectar algunas tareas de ejecución lenta y agregarlas a la lista negra, y luego activar algunas nuevas tareas repetitivas. Por lo tanto, consumirá más recursos debido a los cálculos de datos repetidos.
    Por maped.map.tasks.speculative.execution y maped.reduce.tasks.speculative.execution
    10.13 Agrupar múltiples en un solo mp: coloque la consulta con varios grupos en una sola tarea mp: (pero no Lo encontré, debería haber sido cambiado)
    set hive.multigroupby.singlemr = false
    10.14 Columna virtual: De hecho, cuando se muestran los datos, no es desordenado, pero se muestra prolijamente: (Me siento inútil)
    set hive.exec.rowoffset = true;
    Capítulo 11: Formato de archivo y método de compresión
    11.1 Determine el
    conjunto de códecs de instalación io.compression.codecs; #Sin uso, sin búsqueda
    11.2 Elija un código / decodificador de
    compresión.Una tasa de compresión alta aumentará la CPU. Categoría aérea: GZIP, BZip2, snappy, LZO
    BZip2 tiene la tasa de compresión más alta y GZIP es la mejor opción para la relación de compresión / velocidad de descompresión.
    Rápido, la tasa de compresión LZO no es tan buena como las dos primeras, pero la velocidad de descompresión
    es otra consideración para la compresión: si el archivo se puede dividir, mapreduce necesita dividir un archivo de entrada muy grande (por lo general, un bloque de archivo tiene múltiplos de 64M).
    Si no se puede dividir, aparecerá una tarea separada para leer el archivo completo.
    GZIP y snappy son indivisibles porque la información de límites está enmascarada. BZip2 y LZO proporcionan compresión a nivel de bloque.
    11.3 Habilitar el
    conjunto de compresión intermedio hive.exec.compress.intermediate = true El
    códec de compresión predeterminado de hive es DefaultCodec, es decir, org.apache.hadoop.io.compress.DefaultCodec se puede configurar a través de mapred.map.output.compression.codec para establecer el
    conjunto SnappyCodec recomendado mapred.map.output.compression.codec = org.apache.hadoop.io.compress.SnappyCodec;
    11.4 Compresión del resultado de salida final:
    set hive.exec.compress.output = true El
    modo de compresión se puede configurar mediante mapred.output.compression.codec Se recomienda GZIP, pero tenga en cuenta que GZIP es indivisible.
    establecer mapred.output.compression.codec = org.apache.hadoop.io.compress.GzipCodec
    11.5 el archivo de secuencia admite tres niveles de compresión ningún registro (predeterminado) el bloque se puede dividir
    crear una tabla xxxx (a int) almacenada como un archivo de secuencia;
    puede establecer el nivel de compresión: set mapred.output.compression.type = BLOCK;
    11.6 la práctica de la compresión solo da como resultado la compresión El 1/4 original es de hecho efectivo.
    11.7. Para la partición de archivo, consulte el
    Capítulo 12. Desarrollo (omitido). Es inútil
    . Capítulo 13 Funciones (omitido). Necesita desarrollar código java para escribir funciones udf personalizadas. No quiero cubrir el
    Capítulo 14 Streaming.
    De manera similar a la transmisión de hadoop, puede llamar a los scripts escritos de Python y Linux para procesar datos y luego regresar. La eficiencia es un poco más lenta que la función UDF. Pero puede evitar escribir código Java. Haha
    14.1 Transformación de identidad seleccione transformar (stock_id, stock_name) usando '/ bin / cat' como (a, b) de stock_basic_bak límite 100; - Tenga en cuenta que puede
    cambiar el tipo con o sin paréntesis. 14.2 Cambie el tipo select transform ( stock_id, stock_name) usando '/ bin / cat' como doble, b de stock_basic_bak;
    14.3 Transformación de proyección seleccione transform (stock_id, stock_name) usando '/ bin / cut -f1' como a, b de stock_basic_bak límite 100;
    14.4 Transformación de operación seleccione transform (stock_id, stock_name, stock_max_price) usando '/ bin / sed s / 0 / tt / g' como a, b, c de stock_basic_bak límite 100;
    seleccione transform (stock_id, stock_name) usando '/ bin / sed s / 0 / tt / 'as a, b from stock_basic_bak limit 100;
    Divergencia: ¿Ha cambiado el formato de datos de diferentes tipos de campos después de la conversión? Conclusión: el tipo de campo también se ha cambiado después de la conversión.
    14.5-14.7 Usar memoria distribuida para generar múltiples líneas a partir de una línea:
    Agregar archivos a la caché distribuida: Esto solo permite que la tarea de transformación use directamente el script sin determinar dónde encontrar estos archivos.
    agregue el archivo /tmp/python_hive_code/hive_test_1.py # Tenga en cuenta que esta es la ruta local
    seleccione transformar (línea) usando 'python hive_test_1.py' como a, b, c desde test_stream_split;
    de hecho, lo siguiente también se puede ejecutar directamente:
    seleccione transformar (línea) usando 'python /tmp/python_hive_code/hive_test_1.py' como a, b, c de test_stream_split;
    No hay python después del script que se usa en el libro. Puede ser que la versión sea diferente y la sintaxis sea diferente. Aquí debe agregar python y
    adjuntar el código hive_test_1 de la siguiente manera:

    - - codificación: utf-8 - -

    SYS Import
    # sys.stdout.write (': \ n-')
    para la línea en sys.stdin.readlines ():
    OUT = line.split (',')
    Print ('\ t'.join (OUT))
    have Problema restante: hay líneas
    en blanco 14.7-8 en los datos de salida, que están reservadas para un estudio posterior, que continuará

Capítulo 15: Formato de archivo y registro
15.1-15.2 Formato de archivo y registro El propietario de la tabla de colmena es un usuario del sistema linux en lugar del predeterminado, y el predeterminado es dbname.15.3
Formato de archivo:
1. archivo de secuencia: un archivo binario que contiene pares clave-valor,
2. rcfile, la relación de compresión es relativamente alta y no es necesario almacenar físicamente algunas columnas vacías.
3. la
colmena del archivo de texto puede especificar un formato de entrada y un tipo de formato de salida diferentes: sigue siendo el mismo, el nombre del paquete debe distinguir entre mayúsculas y minúsculas. Create
table tt (a int)
ROW FORMAT SERDE'org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe '
almacenado como
inputformat'org.apache.hadoop.hive.ql.io.RCFileInputFormat '
outputformat'org.apache.hadoop.hive.ql.io.RCFileOutputFormat';

    注意必须要  ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe' 否则用text类的表插入数据会报错,建表不会报错。。很奇怪.
    hdfs dfs -cat 命令无法查看rcfile  不过 hive --service  rcfilecat可以查看rcfile文件
    hive --service  rcfilecat  hdfs://master:9000/hive_dir/tt/000000_0 虽然可以看 但是和查出来的数字类数据不一样,可能是序列化的问题.中文不受影响

    附:自定义输入格式:
15.4 记录格式:serde是序列化和反序列化的简写。 引用见15.3        
15.5 csv 和tsv serde
create  table  stock( stock_id string ,stock_name string) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
STORED AS TEXTFILE;
#待验证,又是csv 又是STORED AS TEXTFILE不知道是什么意思。
15.6-15.8略
15.9 xpath 相关函数:百度吧
15.10 验证了  with serdeproperties 没啥用
     json serde:  org.apache.hive.hcatalog.data.JsonSerDe   org.apache.hadoop.hive.contrib.serde2.JsonSerde
    drop  table test_json_t;
    create   table  test_json_t
    (
    id string,
    index string ,
    guid string ,
    balance string  
    ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
    with serdeproperties
    (
    "id"="s._id",
    "index"="s.index",
    "guid"= "s.guid",
    "balance"= "s.balance"
    )
    stored as textfile;

    load data local  inpath '/tmp/json_data/'  overwrite  into  table test_json_t ;
《hive实战》 提取json数据
    1.使用udf查询:CREATE TABLE json_table (json string);
        load data local  inpath '/tmp/json_data/' into    table json_table;
        SELECT get_json_object(json_table.json, '$')   as json FROM json_table; 
        select get_json_object(json_table.json,'$.balance') as balance,
            get_json_object(json_table.json, '$.gender') as gender,
            get_json_object(json_table.json, '$.phone') as phone,
            get_json_object(json_table.json, '$.friends.name') as friendname
            from json_table;
    2.使用Serde查询
        先增加jar包:hive自带
        add  jar  /opt/tools/apache-hive-2.3.6-bin/hcatalog/share/hcatalog/hive-hcatalog-core-2.3.6.jar

        drop table json_serde_table;
        CREATE TABLE json_serde_table (
        id string,
        index string,
        guid string,
        balance string 
        )
        ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
        WITH SERDEPROPERTIES ( "mapping._id" = "id" );
        load data local  inpath '/tmp/json_data/' into    table json_serde_table;
        带下划线的暂时不知道怎么搞

《hive实战》 orc file  也是列式存储
create table stock_test_orc_file stored as orc  as select  * from  stock_basic limit  200000;  --10.59M
create table stock_test_normal_file  as select  * from  stock_basic limit  200000;     --1.68M
create  table  stock_test_rc_file                                                     --9.28 感觉效果不明显 还是用 orc file 吧 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe'  
stored as 
inputformat 'org.apache.hadoop.hive.ql.io.RCFileInputFormat'
outputformat 'org.apache.hadoop.hive.ql.io.RCFileOutputFormat' 
as   select  * from  stock_basic limit  200000;

对比的确压缩了很多
orc 或者rc  file 的小文件合并: alter table  stock_test_orc_file concatenate;

hdfs dfs -cat   hdfs://master:9000/hive_dir/stock_test_normal_file/000000_0
hive --service  rcfilecat  hdfs://master:9000/hive_dir/stock_test_rc_file/000000_0
rcfilecat  看不了orc file    百度下怎么看

Capítulo 16: Servicio de ahorro de Hive:
16.1 Inicie el servidor de ahorro de
Hive --service hiveserver2 y
compruebe si la supervisión se inició correctamente
netstat -nl | grep 10000
16.2 Configure groovy Utilice la versión jdk de HiveServer no es apropiada. Renunciar al
Capítulo XVII: seguridad (No)
18.2 colmena verificar el
nuevo archivo para establecer los permisos predeterminados umask valor
establecer hive.files.umask.value = 0002; # no
al mismo tiempo establecer lo siguiente verdadero (predeterminado falso) si el usuario no tiene permiso para eliminar tablas datos subyacentes, hive evitará que el usuario elimine la tabla:
sET hive.metastore.authorization.storage.checks = true;
18.3hive la administración de derechos
solo el valor más bajo se establece en verdadero antes de iniciar la función de permisos por defecto es falso
el sET Hive .security.authorization.enabled
18.3.1 usuarios, grupos y roles
set hive.security.authorization.enabled = true; ya no se puede configurar en tiempo de ejecución y poner en hive-site.xml para configurarlo, pero no funciona.
Ver el sistema de conjunto de nombres de usuario : nombre.usuario;
no funciona completamente. . Más adelante, consulte el
Capítulo 18 Bloqueos:
19.1 Hive y zookeeper admiten la función de bloqueo
Primero instale zookeeper de acuerdo con el método instalado zookeeper,
y luego agregue la configuración en hive-site.xml para agregar los siguientes atributos

    <property>
    <name>hive.zookeeper.quorum</name>
    <value>master,slaves1,slaves2</value>
    </property>

    <property>
    <name>hive.support.concurrency</name>
    <value>true</value>
    </property>

    在hive中 show locks; 查看锁
19.2 显式锁和独占锁
    lock table  stock_basic exclusive;

    select * from  stock_basic  limit 10 ;
    执行极慢在本身的窗口执行也很慢 应该都被锁了 :疑问,如果本身的窗口都不能进行操作,锁表他有什么意义呢
     解锁表 解锁后马上查询就有结果
    unlock table stock_basic;

"Hive Actual Combat": No
es posible informar de errores establecer hive.execution.engine; ver el motor de colmena predeterminado mr [mr, tez, spark]
seleccionar recuento (*) de stock_basic; - 69,859 segundos
establecer hive.execution.engine = tez;
configurar hive .prewarm.enabled = true;
establecer hive.prewarm.numcontainers = 10;

Formato de almacenamiento: orc y parquet y parquet de consulta vectorizada
: también es otro formato de almacenamiento columnar. Almacene todos los datos de cada columna de forma continua en el disco, por lo que tiene las ventajas de rendimiento similares a las de orc
drop table stock_test_orc_file;
cree la tabla stock_test_orc_file almacenada como orc como select from stock_basic;
seleccione count (
) from stock_test_orc_file; --0,98s

Consulta vectorizada: el motor de ejecución de consultas predeterminado de Hive procesa una fila a la vez, por lo que se requieren múltiples llamadas a métodos virtuales en bucles anidados, lo cual es muy ineficiente desde la perspectiva de la CPU.
Una característica de Hive durante la consulta vectorizada. Su propósito es leer datos de acuerdo a 1024 filas en cada lote y operar en el conjunto de registros completo cada vez, eliminando así esos problemas ineficientes.
Para operaciones de consulta típicas: escaneo, filtrado, totalización y vinculación han demostrado que la velocidad de ejecución del vector ha aumentado en un orden de magnitud,
pero las consultas vectorizadas requieren un
conjunto de almacenamiento en formato orc hive.vectorized.execution.enabled = true;

Supongo que te gusta

Origin blog.51cto.com/9990261/2551665
Recomendado
Clasificación