无法将5k / sec记录插入黑斑羚?

时间:2019-06-14 07:25:38

标签: java sql cloudera impala

我正在为Impal探索Impala,但是我看不到任何重要的性能。我不能插入5000条记录/秒,最大只能插入200条/秒。考虑到任何数据库性能,这确实很慢。

我尝试了两种不同的方法,但是都很慢:

  1. 使用Cloudera

    首先,我在系统上安装了Cloudera并添加了最新的CDH 6.2集群。我创建了一个Java客户端,以使用ImpalaJDBC41驱动程序插入数据。我可以插入记录,但是速度太差了。我尝试通过增加Impala守护程序限制和我的系统RAM来调整Impala,但这没有帮助。最终,我认为我的安装有问题或有什么问题,所以我切换到另一种方法。

  2. 使用Cloudera VM

    Cloudera还附带了准备就绪的VM以供测试。我试了一下,看看它是否可以提供更好的性能,但是并没有太大的改进。我仍然无法以5k / sec的速度插入数据。

我不知道需要改进什么。如果可以做任何改进,我已经在下面粘贴了我的代码。

达到(5k-10k /秒)速度的理想Impala配置是什么?这种速度仍然远远小于Impala所能提供的。

private static Connection connectViaDS() throws Exception {
    Connection connection = null;
    Class.forName("com.cloudera.impala.jdbc41.Driver");
    connection = DriverManager.getConnection(CONNECTION_URL);
    return connection;
}

private static void writeInABatchWithCompiledQuery(int records) {
    int protocol_no = 233,s_port=20,d_port=34,packet=46,volume=58,duration=39,pps=76,
            bps=65,bpp=89,i_vol=465,e_vol=345,i_pkt=5,e_pkt=54,s_i_ix=654,d_i_ix=444,_time=1000,flow=989;

    String s_city = "Mumbai",s_country = "India", s_latt = "12.165.34c", s_long = "39.56.32d",
            s_host="motadata",d_latt="29.25.43c",d_long="49.15.26c",d_city="Damouli",d_country="Nepal";

    long e_date= 1275822966, e_time= 1370517366;

    PreparedStatement preparedStatement;

    int total = 1000*1000;
    int counter =0;

    Connection connection = null;
    try {
        connection = connectViaDS();

        preparedStatement = connection.prepareStatement(sqlCompiledQuery);

        Timestamp ed = new Timestamp(e_date);
        Timestamp et = new Timestamp(e_time);

        while(counter <total) {
            for (int index = 1; index <= 5000; index++) {
                counter++;

                preparedStatement.setString(1, "s_ip" + String.valueOf(index));
                preparedStatement.setString(2, "d_ip" + String.valueOf(index));
                preparedStatement.setInt(3, protocol_no + index);
                preparedStatement.setInt(4, s_port + index);
                preparedStatement.setInt(5, d_port + index);
                preparedStatement.setInt(6, packet + index);
                preparedStatement.setInt(7, volume + index);
                preparedStatement.setInt(8, duration + index);
                preparedStatement.setInt(9, pps + index);
                preparedStatement.setInt(10, bps + index);
                preparedStatement.setInt(11, bpp + index);
                preparedStatement.setString(12, s_latt + String.valueOf(index));
                preparedStatement.setString(13, s_long + String.valueOf(index));
                preparedStatement.setString(14, s_city + String.valueOf(index));
                preparedStatement.setString(15, s_country + String.valueOf(index));
                preparedStatement.setString(16, d_latt + String.valueOf(index));
                preparedStatement.setString(17, d_long + String.valueOf(index));
                preparedStatement.setString(18, d_city + String.valueOf(index));
                preparedStatement.setString(19, d_country + String.valueOf(index));
                preparedStatement.setInt(20, i_vol + index);
                preparedStatement.setInt(21, e_vol + index);
                preparedStatement.setInt(22, i_pkt + index);
                preparedStatement.setInt(23, e_pkt + index);
                preparedStatement.setInt(24, s_i_ix + index);
                preparedStatement.setInt(25, d_i_ix + index);
                preparedStatement.setString(26, s_host + String.valueOf(index));
                preparedStatement.setTimestamp(27, ed);
                preparedStatement.setTimestamp(28, et);
                preparedStatement.setInt(29, _time);
                preparedStatement.setInt(30, flow + index);
                preparedStatement.addBatch();
            }
            preparedStatement.executeBatch();
            preparedStatement.clearBatch();
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

数据以蜗牛般的速度更新。我尝试增加批处理大小,但是却降低了速度。我不知道我的代码是否错误,或者我需要调整Impala以获得更好的性能。请指导。

我正在使用VM进行测试,这是其他详细信息:

System.

Os - Ubuntu 16
RAM - 12 gb
Cloudera - CDH 6.2
Impala daemon limit - 2 gb
Java heap size impala daemon - 500mb
HDFS Java Heap Size of NameNode in Bytes - 500mb.

如果需要更多详细信息,请告诉我。

1 个答案:

答案 0 :(得分:1)

您不能在12GB的VM上进行基准测试。查看Impala's hardware requirements,您会看到至少需要128GB的内存。

  
      
  • 内存
  •   
     推荐

128 GB或更多,理想的是256 GB或更多。如果在特定节点上进行查询处理期间的中间结果超出该节点上Impala可用的内存量,则查询会将临时工作数据写入磁盘,这可能导致较长的查询时间。请注意,由于工作是并行的,并且聚合查询的中间结果通常小于原始数据,因此Impala可以查询和联接比单个节点上可用内存大得多的表。

此外,VM还用于使您熟悉工具集,但它的功能甚至不足以成为开发环境。

参考文献