使用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
请解释为什么第一次连接需要更多时间?
提前致谢
答案 0 :(得分:0)
确实如此,当您第一次连接到数据库时,HBase正在为连接创建对象,绑定端口等等。这可能需要几毫秒。
但是,HBase reference guide连接中指定的连接是重量级的,因此最佳做法是在应用开始时只创建一个连接,并使其在整个过程中保持运行。
你会告诉我,你确实在每个循环中创建一个新的,但我认为HBase已经有了创建一个新连接的必要条件,而你刚刚删除了一个并重新创建它,它就没有了。重新创造一切。
这是我的观点,我认为这是最合乎逻辑的方式。尝试在循环之前创建一个连接,并让它在所有过程中保持运行,并且你应该在put中保持一致。