使用Java API访问HBase,第一个连接非常慢。这是正常的吗?

时间:2016-07-21 05:28:31

标签: java hadoop hbase

使用Java API,我尝试连接Hbase服务器。在获得与桌面的第一次连接时,无论放置,扫描还是地理位置,它都需要超过600毫秒。

对于后续连接,花费的时间不到10毫秒。为什么第一次连接会有很大的延迟。

我是否使用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

请解释为什么第一次连接需要更多时间?

提前致谢

1 个答案:

答案 0 :(得分:0)

确实如此,当您第一次连接到数据库时,HBase正在为连接创建对象,绑定端口等等。这可能需要几毫秒。

但是,HBase reference guide连接中指定的连接是重量级的,因此最佳做法是在应用开始时只创建一个连接,并使其在整个过程中保持运行。

你会告诉我,你确实在每个循环中创建一个新的,但我认为HBase已经有了创建一个新连接的必要条件,而你刚刚删除了一个并重新创建它,它就没有了。重新创造一切。

这是我的观点,我认为这是最合乎逻辑的方式。尝试在循环之前创建一个连接,并让它在所有过程中保持运行,并且你应该在put中保持一致。