2016-07-21 19 views
0

Mit der Java-API habe ich versucht, den Hbase-Server zu verbinden. Während der ersten Verbindung mit der Tabelle dauerte es mehr als 600ms, unabhängig von den Operationen put, scan oder get.Zugriff auf HBase mit Java-API, die erste Verbindung ist sehr langsam. Es ist normal?

Für die nachfolgende Verbindung dauerte es weniger als 10 ms. Warum gibt es große Verzögerung für die erste Verbindung.

Ob ich org.apache.hadoop.hbase.client.HTable oder org.apache.hadoop.hbase.client.ConnectionFactory für die erste Verbindung verwende, dauerte es mehr Zeit im Vergleich zur nachfolgenden Verbindung. Es ist normal?

Unten ist Beispielcode, den ich verwendet habe.

package sample; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.hbase.HBaseConfiguration; 
import org.apache.hadoop.hbase.TableName; 
import org.apache.hadoop.hbase.client.Connection; 
import org.apache.hadoop.hbase.client.ConnectionFactory; 
import org.apache.hadoop.hbase.client.HTable; 
import org.apache.hadoop.hbase.client.Put; 
import org.apache.hadoop.hbase.client.Table; 
import org.apache.hadoop.hbase.util.Bytes; 

public class InsertData { 

    private static String TABLE_NAME = "DATA"; 
    private static Long Id = 2222L; 
    private static String COLUMN_FAMILY = "CF”; 

    public static void main(String[] args) throws IOException { 
     for (int j = 0; j < 2; j++) { 

      Configuration config = HBaseConfiguration.create(); 


      File folder = new File(“filename”); 
      File[] listOfFiles = folder.listFiles(); 

      for (int i = 0; i < listOfFiles.length; i++) { 
       if (listOfFiles[i].isFile()) { 
        String fileName = listOfFiles[i].getName(); 
        String[] fileSplit = fileName.split("_"); 
        byte[] content = readContentIntoByteArray(new File(fileName)); 
        long startTime = System.currentTimeMillis(); 
        Connection connection = ConnectionFactory.createConnection(config); 
        Table hTable = connection.getTable(TableName.valueOf(TABLE_NAME)); 


        Put put = new Put(Bytes.toBytes(Id + "_" + fileSplit[0])); 
        put.addColumn(Bytes.toBytes(COLUMN_FAMILY), Bytes.toBytes(fileSplit[1].substring(0, fileSplit[1].indexOf("."))), content); 

        HTable.validatePut(put, 10000000); 

        hTable.put(put); 

        System.out.println(System.currentTimeMillis() - startTime); 
        System.out.println("data inserted " + content.length + " filename " + fileName); 

        hTable.close(); 
        connection.close(); 
       } 
      } 
     } 

    } 

    private static byte[] readContentIntoByteArray(File file) { 
     FileInputStream fileInputStream = null; 
     byte[] bFile = new byte[(int) file.length()]; 
     try { 
      // convert file into array of bytes 
      fileInputStream = new FileInputStream(file); 
      fileInputStream.read(bFile); 
      fileInputStream.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return bFile; 
    } 
} 

Ausgang:

732 
    data inserted 14562 filename 15003_15005.txt 
    8 
    data inserted 14968 filename 15033_15035.txt 
    9 
    data inserted 14968 filename 16003_16005.txt 
    8 
    data inserted 24330 filename 16003_16061.txt 
    9 
    data inserted 3642 filename 16003_16082.txt 
    8 
    data inserted 119544 filename 16033_16035.txt 
    9 
    data inserted 14562 filename 15003_15005.txt 
    8 
    data inserted 14968 filename 15033_15035.txt 
    9 
    data inserted 14968 filename 16003_16005.txt 
    8 
    data inserted 24330 filename 16003_16061.txt 
    9 
    data inserted 3642 filename 16003_16082.txt 
    8 
    data inserted 119544 filename 16033_16035.txt 

Sie mir bitte erklären, warum es für die erste Verbindung mehr Zeit in Anspruch nahm?

Vielen Dank im Voraus

Antwort

0

Es ist normal in der Tat ist, wenn Sie zum ersten Mal mit der Datenbank verbinden, schafft HBase das Objekt für die Verbindung binden, um einen Port etc. etc., die ein paar ms dauern kann.

Wie jedoch in der HBase reference guide Verbindungen Schwergewicht angegeben, so ist es eine bewährte Vorgehensweise, nur eine am Anfang Ihrer App zu erstellen und halten Sie den gesamten Prozess lang.

Sie werden mir sagen, dass Sie in jeder Schleife eine neue erstellen, aber ich denke HBase hat bereits, was notwendig ist, um eine neue Verbindung zu erstellen, und wie Sie nur eine gelöscht und neu erstellen, tut es nicht alles neu erstellen.

Das ist mein Standpunkt und ich denke, es ist der logischste Weg. Versuchen Sie, eine Verbindung vor der Schleife zu erstellen, und führen Sie sie den gesamten Prozess aus, und Sie sollten Konsistenz in Ihren Puts haben.