GemfireXD - 如何为更大的数据大小并行化数据处理

时间:2015-06-17 20:37:33

标签: java gemfire

我正在使用JDBC来处理一些数据,我将gemfireXD用作数据库,这是一个InMemory数据网格和一个NewSQL解决方案。

Step1 - 我从表(Table1)

获取所有不同的键(field1)
Parallel.ForEach

Step2 - 我从上面的列表中查询每个键的同一个表。这应该为每个键返回2条记录。

我需要为每个密钥处理这两个记录,并从密钥的这两行中创建一个最终处理过的记录,最后需要存储在一个单独的表中(table2)。

             Statement stmt = conn.createStatement();
             stmt.execute("select distinct field1 from Table1");
             ResultSet rs = stmt.getResultSet();
             List<String> keyList = new ArrayList<String> ();
             while (rs.next()) {
                   keyList.add(rs.getString("field1"));
             }

由于表1中有数百万条记录,上述处理数据的方式非常耗时。

我需要在gemfireXD中并行化处理。

我可以使用他们的并行处理功能(创建元组/包记录和使用MR编程)在几小时内在PIG或SPARK中执行相同的处理。

我希望gemfireXD必须有一些工具来进行数据的并行处理,虽然我在gemfireXD中尝试了DATAAWARE程序并用它来并行化程序调用,但它对我不起作用。

我希望gemfire XD必须有其他方法用于此目的

有没有人可以建议gemfireXD中的任何实现方法来实现所需的结果?

3 个答案:

答案 0 :(得分:0)

我错过了你正在使用NoSQL数据库。不过,我的答案可能适用。

  

我需要在gemfireXD中并行化处理。

你(很可能)没有。您肯定需要有效地访问数据库:

  • 使用预备陈述(*)
  • 使用一些SQL权力

例如,使用语句

select * from Table1 order by field1

读取两行(或者更常见的是,读取直到field1更改)并处理它们。节省数以百万计的查询!

虽然ORDER BY对于NoSQL数据库来说可能效率低下,但你肯定会比数以百万计的查询更好,因为它们意味着数百万次往返等待和等待。例如,您可以发出1000个范围查询,每个查询将1000行加载到内存中。

(*)恕我直言,所有与where field1=" + keyList.get(i)类似的表现相关的问题应立即关闭。连接SQL是完全错误的。

答案 1 :(得分:0)

如果我正确理解您的要求,您可能正在研究如何仅处理可能是该节点本地的密钥,以便您可以使用分区表中的DAP(数据感知过程)分发处理。

分区将处理分片数据,然后您可以使用DAP查询本地数据(特定节点的本地数据)并将其插回到table2中来处理它。这里的另一个考虑因素是托管,因为您可能实际上需要一些托管,以便根据某些业务逻辑使两个表以某种方式并置。

请查看DAP合并排序示例。

如果您仍然遇到DAP问题,请分享您可能获得的详细信息或例外情况。

希望有所帮助。

参考文献:

答案 2 :(得分:0)

为什么不使用join而不是逐个处理它们?

GemfireXD可以在共存2个表时使用连接。

我建议您创建另一个表来存储您的第一个查询,并使用与您的表相同的分区键对其进行分区,然后将它们连接起来以获得结果。让我们将原始表作为table1调用,将临时表作为tmp调用。您可以使用以下查询获取结果。它应该比你的迭代方法快得多

select s.* from table1 s join tmp t on s.field1=t.field1