El diseño actual y práctica de lectura y escritura escena HBase

fondo

Este proyecto abordará cheque y dictamen2 Hoja Zhang Historia (datos históricos se refiere a todo el proceso y los resultados intermedios de los datos del proceso cuando se produce el negocio en línea) consulta. Sobre la base de la consulta original de Oracle proporciona servicios de almacenamiento, con la creciente cantidad de datos, los problemas de rendimiento se enfrentaron en el proceso de la escritura y la lectura, y los datos históricos para consultas comerciales y no afecta a los procesos reales en la estructura del sistema de la misma, negocio aguas arriba colocado cadena pesada. Este elemento colocado aguas abajo Hadoop distribuye procesamiento de datos plataforma para lograr este requisito. Se enumeran a continuación algunos indicadores de demanda específica:

  1. La cantidad de datos: la cantidad total actual de tabla de verificación de datos de la línea de + 5000w, 11GB, el importe acumulado de las tablas de datos opinión + 300 millones de dólares, alrededor de 100 GB. la subasta diaria de alrededor de 500 000 + por fila de la tabla, sólo el inserto, no actualizar.
  2. La búsqueda para: tabla de verificación de clave principal es id (Oracle identificación global), la clave de consulta es check_id, un check_id correspondiente a varios registros, por lo que la necesidad de volver a la lista el registro correspondiente; mesa de opinión clave principal es la identificación, la clave de la investigación es bussiness_no y buss_type, con Li lista devuelta. Lista única consulta devuelve el tamaño de alrededor de 50 o menos, la frecuencia de consulta de alrededor de 100 / día, de respuesta a consultas 2s tiempo t.

Selección de la tecnología

La cantidad de datos y consultas requiere visión, con gran cantidad de datos almacenados en las plataformas distribuidas, y proporciona en tiempo real capacidad de consulta del componente de elección para HBase. De acuerdo con la demanda realizada tras una investigación preliminar y la evaluación, más o menos determinar HBase como el componente de almacenamiento primario. La demanda para el desmantelamiento de la escritura y la lectura de HBase dos partes.

programa de comparación de HBase leer relativamente determinada, de acuerdo con los requisitos básicos de diseño rowKey, y después de leer los datos de acuerdo con una API (obtener, exploración, etc.) proporcionados HBase, para cumplir con los requisitos de rendimiento.

HBase es un método de escritura en general tienen la siguiente:

  1. Java llama HBase API nativa, HTable.add (Lista (Put)).
  2. trabajos de MapReduce, TableOutputFormat utilizan como salida.
  3. Carga a granel, lo que genera un primer archivo de datos de acuerdo con el formato de datos interno persistencia HFILE HBase, y luego se copia en la ubicación adecuada y notifica RegionServer, almacenamiento masivo de datos se ha completado. Que genera HFILE este paso se puede seleccionar MapReduce o chispa.

En este trabajo, las terceras vías, Spark + carga masiva de escritura HBase. Este método es relativamente los otros dos métodos son las siguientes ventajas:

  1. Bulkload no escribir WAL, que no produce ras y dividida.
  2. Si llamamos a un gran número de interfaz de PUT para insertar datos, podría dar lugar a un gran número de operaciones de GC. Además de afectar el rendimiento, el tiempo podría tener graves e incluso afectar a la estabilidad del nodo HBase, utilizando bulkload no tales preocupaciones.
  3. Proceso sin un montón de interfaz llama el rendimiento del consumo.
  4. Chispa puede aprovechar la potencia de cálculo.

Se ilustra de la siguiente manera:

Diseño de consulta de datos grande y práctica de lectura y escritura --HBase

diseño

Información ambiental

Hadoop 2.5 - 2.7 
hbase 0,98 . 6 
Spark 2.0 . 0 - 2.1 . 1 
Sqoop 1.4 . 6

mesa de diseño

Este segmento se centra en la mesa de diseño HBase, donde rowKey es la parte más importante. Para facilitar la ilustración, vamos a echar un vistazo en el formato de datos. Para comprobar el siguiente ejemplo, la empatía opinión.

tabla de verificación (campo de tabla original 18, para la conveniencia de la descripción, en el presente documento cinco campos son seleccionados de una sección transversal esquemática)

Diseño de consulta de datos grande y práctica de lectura y escritura --HBaseDiseño de consulta de datos grande y práctica de lectura y escritura --HBase

Como se muestra anteriormente, la clave principal es el id, 32 letras y números de la composición al azar, un check_id campo de consulta de servicio es un campo de longitud variable (no más de 32), letras y números, la misma check_id puede corresponder a una pluralidad de registros, otro campo de negocio relevantes . Como todos sabemos, rowKey HBase se basa facilitar el acceso a, y requieren rowKey es único. RowKey diseñar la consideración principal es cómo se accede a los datos. vista preliminar, tenemos dos clases de diseño.

  1. Dividir en dos tablas, una ID de tabla como el rowKey, como columnas de verificación correspondientes a la tabla; tabla de índice a otra mesa, como el check_id rowKey, uno para cada ID de columna. Consulta, se encontró por primera vez la lista de identificación de check_id correspondiente, a continuación, los registros correspondientes en función del ID encontrados. HBase son la operación de obtención.
  2. Esta demanda será visto como una consultas de rango, en lugar de una sola consulta. El rowKey check_id como un prefijo, seguido con el ID. Configuración de escaneo y la consulta startRow stopRow, encontrar la lista de registro correspondiente.

El primer método es la ventaja de una estructura de tabla simple, fácil de diseñar rowKey inconveniente es 1) una inscripción de datos, las necesidades de datos originales que se escriben en la línea de un 2 mesas, y la tabla de índice escanea requerido antes de escribir el rowKey existe, si está presente a continuación, la adición de una otra manera crear una nueva fila, 2) cuando se lee, incluso el uso de la lista, también tienen que leer por lo menos dos veces la tabla. El segundo método de diseño, diseño rowKey es más complejo, pero la escritura y la lectura son desechables. Tomados en conjunto, usamos el segundo diseño.

rowKey Diseño

Temas candentes

HBase está en línea especie lexicográfico de rowKey, que es un tema candente por lo general ocurre en un gran número de clientes de acceso directo a los nodos del clúster, o muy pocos. Por defecto, en el inicio de la construcción de la tabla, la tabla será una sola región, y aumenta a medida que la división de la región en más regiones, la región puede ser distribuido a través de múltiples regionserver para que el reparto de carga. Para nuestras necesidades de negocio, tiene un gran stock de los datos, es necesario en la carga HBase principio por partes iguales a cada regionserver, es decir, hacer pre-split. La sal común es un método de enfoque de control, de hash de hash, la parte de auto-energizante (por ejemplo, una marca de tiempo) voltea.

rowKey Diseño

Paso 1: determinar el número de pre-partición, crear HBase Tabla

Diferentes escenarios de negocio para determinar el número y características de los datos de una manera diferente, yo personalmente creo que debemos considerar la cantidad de tamaño de los datos, y el tamaño del clúster y otros factores. Por ejemplo sobre 11G tamaño de la tabla de verificación, tamaño de clúster de 10 máquina de prueba, hbase.hregion.max.filesize = 3G (cuando este número supera el tamaño de la región, dividida en dos), es posible que una inicialización región tamaño de 1 ~ 2G (no arriba en un split), datos de región asignados 11G / 2G = 6º, pero con el fin de hacer pleno uso de los recursos de clúster, en el presente documento de comprobación de tabla se divide en 10 particiones. Si la cantidad de datos 100G, y en crecimiento, la agrupación sin cambios, aumentando el número de la región a 100G / 2G = 50 o más apropiado. tabla de verificación hbase construida comunicado tabla como sigue:

crear ' tinawang: cheque ' , 
{NOMBRE => ' f ' , compresión => ' SNAPPY ' , DATA_BLOCK_ENCODING => ' FAST_DIFF ' , BLOOMFILTER => ' ROW ' }, 
{SPLITS => [ ' 1 ' , ' 2 ' , ' 3 ' , ' 4 ' , ' 5 ' , ' 6 ' , '7 ' ,' 8 ' , ' 9 ' ]}

En donde, Columna Familia = 'f', más corto es el mejor.

COMPRESIÓN => 'SNAPPY', HBase soporta tres compresión LZO, GZIP y ágil. GZIP tasa de compresión, pero consumen CPU. Después de casi dos, el Snappy poco de ganar que consume menos de GZIP CPU. En general IO y CPU equilibrio, seleccione Snappy.

DATA_BLOCK_ENCODING => 'FAST_DIFF', rowKey más cerca este caso, la longitud de la clave para ver un valor relativamente largo con el siguiente comando.

./hbase org.apache.hadoop.hbase.io.hfile.HFile -m -f / aplicaciones / hbase / data / datos / tinawang / verificación / a661f0f95598662a53b3d8b1ae469fdf / f / a5fefc880f87492d908672e1634f2eed_SeqId_2_

 

 

Paso 2: composición rowKey

sal

Así que una distribución equilibrada de los datos a cada región, combinado con pre-split, check_id clave para comprobar nuestra tabla de consulta en busca de código hash valor, entonces el módulo (numRegions) como prefijo, nota que los datos rellenados.

StringUtils.leftPad (Integer.toString (Math.abs (check_id.hashCode ()% numRegion)), 1 , ' 0 ')

Nota: Si los datos ascendieron a más de un centenar G, los numRegions naturales a 2 dígitos, la sal también dos.

Hash Hash

Debido check_id en sí es una cadena de longitud variable de caracteres de dígitos, como el hash de los datos, y relativamente fácil consulta rowKey, utilizamos hash SHA1 a check_id, y la tecnología de longitud fija de 32 bits.

MD5Hash.getMD5AsHex (Bytes.toBytes (check_id))

unicidad

Dado lo anterior queda picadillo sal + prefijo rowKey más la principal clave de la tabla Identificación del cheque rowKey a la singularidad de garantía. En resumen, la tabla rowKey comprobación de diseño es el siguiente: (check_id = A208849559)

Diseño de consulta de datos grande y práctica de lectura y escritura --HBase

Para mejorar la legibilidad, el intermedio también se puede añadir un delimitador personalizado, como '+', '|' similares.

7 + 7c9498b4a83974da56b252122b9752bf + 56B63AB98C2E00B4E053C501380709AD

Más diseñado para asegurar que cada consulta, se determina su valor + prefijo hash de sal, y caer en la misma región. Tenga en cuenta que cada fila de la tabla de verificación hbase misma fuente de datos de verificación en las tablas de Oracle almacenados en cada columna.

diseño de la consulta WEB

rowKey diseño y consulta estrechamente relacionados, la consulta decidieron diseño rowKey, rowKey contrario base en lo anterior, proporcionando la consulta a Scan [startRow, stopRow], para completar el análisis. Para comprobar check_id = A208849559 ejemplo, de acuerdo con los principios de diseño rowKey de su cálculo sal + de hash, también prefijo.

startRow = 7 + 7c9498b4a83974da56b252122b9752bf 
stopRow = 7 + 7c9498b4a83974da56b252122b9752bg

 

la implementación del código de los procesos clave

Chispa de escritura a HBase

Step0: preparación de los trabajos

Dado que el sistema de recepción de tráfico de aguas arriba de los datos, los datos de saldos utilizando Sqoop bombeados HDFS; diariamente en la forma de datos incrementales obtenidos desde el archivo de sitio ftp. Debido a que el campo de datos de tráfico contiene una serie de saltos de línea y sqoop1.4.6 actualmente sólo es compatible con un solo byte, por lo que esta elección '0x01' como separador de columna, '0x10' como un delimitador de línea.

Paso 1: Spark leer hdfs archivo de texto

Diseño de consulta de datos grande y práctica de lectura y escritura --HBaseDiseño de consulta de datos grande y práctica de lectura y escritura --HBase

SparkContext.textfile () separador de línea por defecto es "\ n", donde utilizamos "0x10", es necesario configurar en la configuración. configuración de la aplicación, que llamamos método newAPIHadoopFile hdfs para leer el archivo, volver JavaPairRDD, que LongWritable y texto están en letra Hadoop cadena larga y tipo (todos los tipos de datos y los datos de Hadoop java tipos son muy similares, excepto que son para la secuencia de la Red y hacer la optimización de especial). Necesitamos los archivos de datos en pairRDD de valor, que hacen referencia al texto. Para la posterior facilidad de manejo, se pueden convertir a JavaPairRDD JavaRDD <String>.

Paso 2: Transferencia y tipo RDD

① convertir avaRDD <String> a JavaPairRDD <tuple2, String>, en el que los parámetros se expresaron como, rowKey, col, valor. La conversión se hace así porque el principio básico se basa HBase rowKey ordenó, y cuando se ordena el modo de carga a granel usando una pluralidad de datos de pre-escritura a la partición (región), cada chispa partición requiere datos, rowKey, familia columna ( cf), nombre col requiere ordenada. En este caso, ya que sólo un conglomerado de la columna, por lo que el rowKey organización y nombre de col a formato de clave Tuple2. Tenga en cuenta que una fila (n campo) de la base de datos original, a continuación, se dividen en n filas.

② secundaria tipo rowKey, JavaPairRDD basado col <tuple2, String>. Si no lo hace la clase, se reportó la siguiente excepción:

java.io.IOException: Añadido una clave notlexically más grande que la anterior clave

③ organizar los datos en requisitos JavaPairRDDhfileRDD HFILE.

Paso 3: crear hfile y la carga a granel a HBase

① llamar a métodos principales saveAsNewAPIHadoopFile:

hfileRdd.saveAsNewAPIHadoopFile (hfilePath, ImmutableBytesWritable.class, 
KeyValue.class, HFileOutputFormat2.class, config);

② carga hfilebulk a HBase

Trabajo trabajo final = Job.getInstance (); 
job.setMapOutputKeyClass (ImmutableBytesWritable.class); 
job.setMapOutputValueClass (KeyValue.class); 
HFileOutputFormat2.configureIncrementalLoad (trabajo, htable); 
LoadIncrementalHFiles bulkLoader = newLoadIncrementalHFiles (config); 
bulkLoader.doBulkLoad (newpath (hfilePath), htable);

NOTA: método Si el clúster volvió Kerberos, necesidades Paso 4 para ser colocados ugi.doAs (), ejecutado después de realizar la siguiente verificación

UserGroupInformation también = UserGroupInformation.loginUserFromKeytabAndReturnUGI (keyUser, keytabPath); 
UserGroupInformation.setLoginUser (también);

60010 puerto web de acceso cúmulo HBase, se puede ver la distribución de la región.

 

 

Leer de HBase

En este documento el acceso de cliente web para desarrollar los datos basadas en el marco de inicio de primavera HBase.

agrupación de conexiones utilización (agrupación de conexiones)

Crear una conexión es una operación relativamente pesado, en el proyecto de HBase real, se introduce la agrupación de conexiones a ZK acción, que conecta la meta información en la memoria caché, servidor de la región y el maestro.

Conexión HConnection = HConnectionManager.createConnection (config); 
Tabla HTableInterface = connection.getTable ( " tabla1 " ); 
try { 
    // Uso de la mesa, según sea necesario, para una sola operación y un solo hilo 
} finally { 
    table.close (); 
}

Los siguientes métodos también pueden anular el grupo de subprocesos predeterminado

HConnection CreateConnection (conf org.apache.hadoop.conf.Configuration, piscina ExecutorService);

consulta proceso

Paso 1: De acuerdo con la consulta, el prefijo es determinado rowKey

Según la presentación del diseño 3.3 rowKey, HBase de escritura y lectura seguir las reglas de diseño. Aquí se utiliza el mismo método, la consulta de llamadas entrantes web, convertirse en los correspondientes prefijo rowKey. Por ejemplo, una consulta transmitida a través de la tabla de verificación check_id = A208849559, generado prefijo 7 + 7c9498b4a83974da56b252122b9752bf.

Paso 2: determinar el intervalo de exploración

A208849559 datos correspondientes al resultado rowKey consulta es decir, 7 + 7c9498b4a83974da56b252122b9752bf prefijo y el valor correspondiente en rowKey.

scan.setStartRow (Bytes.toBytes (rowkey_pre)); // exploración, 7 + 7c9498b4a83974da56b252122b9752bf 
byte [] stopRow = Bytes.toBytes (rowkey_pre); 
stopRow [stopRow.length - 1 ] ++ ; 
scan.setStopRow (stopRow); // 7 + 7c9498b4a83974da56b252122b9752bg

Paso 3: resultados de la consulta devuelve un objeto compuesto de

ResultScanner que atraviesa el objeto, cada línea de datos se encapsula en entidad mesa, la composición de la lista devuelta correspondiente.

prueba

Fetch datos de la original al azar 1.000 check_id, para las pruebas de simulación, tres solicitudes consecutivas se inicia 2000 (200 hilos concurrentes, 10 ciclos), el tiempo medio de respuesta de 51ms, la tasa de error es cero.

Diseño de consulta de datos grande y práctica de lectura y escritura --HBaseDiseño de consulta de datos grande y práctica de lectura y escritura --HBase

Diseño de consulta de datos grande y práctica de lectura y escritura --HBaseDiseño de consulta de datos grande y práctica de lectura y escritura --HBase

Después de lo anterior, N veces la experiencia acumulada de las pruebas, el número de solicitudes en cada región están más cerca en línea con balanceo de carga a partir del diseño.

Grabar un paso a cielo

1, Kerberos problema de autenticación

Si el clúster abrir una autenticación de seguridad, por lo que se presenta Trabajo de la chispa y cuando el acceso HBase, tanto la necesidad de autenticación Kerberos.

En este documento, el modo de clúster hilo, tal como se presentó a las operaciones ordinarias, ya que puede informar del error siguiente.

ERROR startApp: fallas en el trabajo, 
java.lang.NullPointerException 
    en com.tinawang.spark.hbase.utils.HbaseKerberos. <init> (HbaseKerberos.java: 18 ) 
    en com.tinawang.spark.hbase.job.SparkWriteHbaseJob.run (SparkWriteHbaseJob.java: 60 )

Orientación HbaseKerberos.java:18, el código es el siguiente:

this.keytabPath = (. Thread.currentThread () getContextClassLoader () getResource (prop.getProperty (. " hbase.keytab " ))) getPath ().;

Esto se debe a que el ejecutor de hacer la conexión HBase, tiene que re-certificación por --keytab Subida tina.keytab no ha sido bloque de programa de certificación HBase de conseguir, por lo que la tabla de claves requiere una certificación adicional por --files carga. Esquemáticamente como sigue

--keytab / ruta / tina.keytab \
 - director [email protected] \
 --files " /path/tina.keytab.hbase "

Tina.keytab.hbase que es tina.keytab copiar y renombrar derivada. Debido a que la chispa no permite carga duplicada del mismo archivo.

2, la secuencia de

org.apache.spark.SparkException: Tarea no serializable 
    en org.apache.spark.util.ClosureCleaner $ .ensureSerializable (ClosureCleaner.scala: 298 ) 
    en org.apache.spark.util.ClosureCleaner $ .org $ Apache $ chispa $ util $ $$ ClosureCleaner limpia (ClosureCleaner.scala: 288 ) 
    en org.apache.spark.util.ClosureCleaner $ .clean (ClosureCleaner.scala: 108 ) 
    en org.apache.spark.SparkContext.clean (SparkContext.scala: 2101 ) 
    en org.apache.spark.rdd.RDD $$ anonfun $ mapa $ 1 .apply (RDD.scala: 370 ) 
    en org.apache.spark.rdd.RDD $$ anonfun $ mapa $ 1 .apply (RDD.scala: 369 ) 
    ...
org.apache.spark.deploy.yarn.ApplicationMaster $$ anon $ 2 .run (ApplicationMaster.scala: 637 ) 
ocasionados por: java.io.NotSerializableException: org.apache.spark.api.java.JavaSparkContext 
pila serialización:
     - objeto no serializable (clase: org.apache.spark.api.java.JavaSparkContext, valor: org.apache.spark.api.java.JavaSparkContext@24a16d8c)
     - campo (clase: com.tinawang.spark.hbase.processor.SparkReadFileRDD, nombre: sc, tipo: clase org.apache.spark.api.java.JavaSparkContext) 
...

Solución uno:

Si la clase sc como una variable miembro se hace referencia en el proceso, a continuación, añadir palabras clave transitoria, a fin de no ser serializado.

sc JavaSparkContext transitoria privado;

Solución dos:

El sc pasa como un parámetro, mientras que los implementos de clase Serializable refiere operación RDD. Código, el segundo método. Consulte el código.

3, solicitar un lote de prueba

Excepción en hilo " http-nio-8091-aceptor-0 " java.lang.NoClassDefFoundError: org / Apache / Tomcat / util / ExceptionUtils

o

Excepción en hilo " http-nio-8091-exec-34 " java.lang.NoClassDefFoundError: ch / QoS / logback / classic / SPI / ThrowableProxy

Revisar el problema siguiente, y solucionar problemas de un proceso que puede ser abrir el archivo supera el límite.

https://github.com/spring-projects/spring-boot/issues/1106

http://mp.weixin.qq.com/s/34GVlaYDOdY1OQ9eZs-iXg

Utilizar ulimit-a para ver el número predeterminado de cada usuario de archivos abiertos es 1024.

Modificar los archivos del sistema /etc/security/limits.conf en esta cantidad, añadir lo siguiente en el archivo, se puede resolver el problema.

  • nofile suave 65536
  • nofile dura 65536

Los autores introducen

Wang Ting, ingeniero de desarrollo de China Minsheng Banking grandes volúmenes de datos, que se especializa en el procesamiento de datos a gran escala y el sistema hbase chispa diseño.

referencias

http://hbase.apache.org/book.html#perf.writing

http://www.opencore.com/blog/2016/10/efficient-bulk-load-of-hbase-using-spark/  http://hbasefly.com/2016/03/23/hbase_writer/  https: // github.com/spring-projects/spring-boot/issues/1106  http://mp.weixin.qq.com/s/34GVlaYDOdY1OQ9eZs-iXg

 

Supongo que te gusta

Origin www.cnblogs.com/zz-ksw/p/12522184.html
Recomendado
Clasificación