2016-07-21 4 views
0

Java APIを使用して、Hbaseサーバーに接続しようとしました。テーブルへの最初の接続を取得している間、それは置く、スキャンするまたはgetoperationsにかかわらず600ミリ秒より多くかかりました。Java APIを使用してHBaseにアクセスすると、最初の接続は非常に遅いです。それは普通ですか?

その後の接続では、10ms未満でした。なぜ最初に接続するための巨大な遅延がありますか?

最初の接続にorg.apache.hadoop.hbase.client.HTableまたはorg.apache.hadoop.hbase.client.ConnectionFactoryを使用するかどうかは、後続の接続に比べて時間がかかりました。それは普通ですか?

以下は、私が使用したサンプルコードです。

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; 
    } 
} 

出力:

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 

、それは最初の接続のためのより多くの時間を要した理由を私に教えてください?あなたが最初にデータベースに接続するときには、確かに正常であり、事前

答えて

0

おかげで、HBaseのは数msを取ることができますポートなどなどを結合し、接続のためのオブジェクトを作成しています。

しかし、HBase reference guide接続で指定されているように、接続は重量が多いので、アプリケーションの先頭に1つしか作成せず、すべてのプロセスを長く実行しておくことをお勧めします。

あなたは新しいループを実際に作成していると言いますが、HBaseはすでに新しいConnectionを作成するために必要なものをすでに持っていると思います。ただ削除して再作成するだけですべてを再現する。

これは私の見解であり、最も論理的な方法だと思います。ループの前に接続を作成して、すべてのプロセスを実行し続けるようにしてください。そして、あなたはputsに一貫性を持たせるべきです。

関連する問題