使用 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/