java - 使用Java API访问HBase,第一次连接很慢。正常吗?

标签 java hadoop hbase

使用 Java API,我尝试连接 Hbase 服务器。在获得与 Table 的第一个连接时,无论 put、scan 或 get 操作如何,它都花费了 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

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

提前致谢

最佳答案

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

但是,正如 HBase reference guide 中指定的那样连接是重量级的,所以最好在你的应用程序开始时只创建一个并让它在整个过程中长时间运行。

您会告诉我,您确实在每个循环中创建一个新连接,但我认为 HBase 已经具备创建新连接所必需的功能,并且当您删除并重新创建它时,它不会重新创建所有内容。

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

关于java - 使用Java API访问HBase,第一次连接很慢。正常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38495539/

相关文章:

Hadoop 生态系统 - 在我的场景中使用什么技术工具组合? (详情见内)

java - 在 java 中使用 phoenix 连接到 hbase 的正确 URL

java - '&quot ;' instead of normal quotes ("") 从 Jersey 返回 XML

hadoop - Spark中的mapreduce参数

sql-server - 使用jtds驱动程序从hdfs到SQL Server 2005的Sqoop导出失败

shell - 如何在 hbase shell 中指定一个带有选项卡的行键?

java - 在 JPA (Hibernate) 中保存非持久对象 ID

java - 在多线程中,getId方法如何确定任何线程的ID

java - 从服务器发送简单错误响应消息来调用 jQuery ajax 方法(例如,responseText)的最佳方法是什么?

java - Hadoop找不到我的输入文件