Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在多个map reduce作业之间传递DB连接对象_Java_Database_Postgresql_Hadoop_Mapreduce - Fatal编程技术网

Java 在多个map reduce作业之间传递DB连接对象

Java 在多个map reduce作业之间传递DB连接对象,java,database,postgresql,hadoop,mapreduce,Java,Database,Postgresql,Hadoop,Mapreduce,从根本上讲,这个问题是关于:同一个DB连接能否跨多个进程使用(因为不同的map reduce作业在实际不同的独立进程中) 我知道这是一个很小的问题,但如果有人也能回答这个问题,那就太好了:如果到数据库的最大连接数(在托管数据库的服务器上预配置)已用尽,并且一个新进程尝试获得新连接,会发生什么情况?它是否等待某个时间,如果是,是否有办法为此等待时间设置超时。在这个特殊的例子中,我是用PostGres DB的术语来讨论的,用于与DB对话的语言是java 为了让您了解问题的背景,我有多个并行运行的ma

从根本上讲,这个问题是关于:同一个DB连接能否跨多个进程使用(因为不同的map reduce作业在实际不同的独立进程中)

我知道这是一个很小的问题,但如果有人也能回答这个问题,那就太好了:如果到数据库的最大连接数(在托管数据库的服务器上预配置)已用尽,并且一个新进程尝试获得新连接,会发生什么情况?它是否等待某个时间,如果是,是否有办法为此等待时间设置超时。在这个特殊的例子中,我是用PostGres DB的术语来讨论的,用于与DB对话的语言是java

为了让您了解问题的背景,我有多个并行运行的map reduce作业(大约40个reducer),每个作业都希望更新一个PostGres数据库。如何有效地管理这些进程中的数据库读/写操作。注意:数据库托管在独立于map reduce作业运行位置的单独计算机上

连接池是一种选择,但有时效率非常低,特别是对于每秒几次读/写操作

同一个DB连接可以跨多个进程使用吗

不,不是以任何理智或可靠的方式。您可以使用代理进程,但无论如何,您离发明连接池还有一步之遥

如果连接到服务器的最大连接数 数据库(在承载数据库的服务器上预配置)已耗尽 一个新的进程试图获得一个新的连接

连接尝试失败,SQLSTATE
53300连接太多
。如果等待,服务器可能会耗尽其他限制,并开始出现服务现有客户端的问题


对于这样的问题,您通常会使用像C3P0或DBCP这样的工具,它们在JVM池中起作用,但当您有多个JVM时,这将不起作用

您需要做的是使用一个外部连接池,比如或维护一组来自工作人员的轻量级连接。然后,池器具有较少数量的真实服务器连接,并在来自客户端的轻量级连接之间共享这些连接

连接池通常比不连接池更有效,因为它允许您优化硬件和工作负载的活动PostgreSQL工作进程数量,从而提供工作许可控制

另一种方法是使用一个具有一个或多个线程(每个线程一个连接)的writer进程,该进程从reduce worker获取已完成的工作并写入DB,这样reduce worker就可以继续进行下一个工作单元。如果作者落后太多,你需要有一种方法告诉减员等待。有几种Java排队系统实现适合于此,或者您可以使用JMS

还值得优化如何尽可能多地编写PostgreSQL,使用:

  • 准备好的发言
  • 提交延迟
  • synchronous\u commit='off'
    如果服务器崩溃时您可以承受一些事务的损失
  • 将工作批处理到更大的事务中
  • 复制
    或多值
    插入
    s以插入数据块
  • 具有有用磁盘子系统的体面硬件,而不是具有糟糕I/O的Amazon EC2实例或具有5400rpm磁盘的RAID 5机箱
  • 一个适当的RAID控制器,带有电池支持的写回缓存,以降低fsync()的成本。最重要的是,如果你不能做大批量的工作或使用提交延迟;如果由于批处理和组提交,fsync速率较低,则影响较小
见:

同一个DB连接可以跨多个进程使用吗

不,不是以任何理智或可靠的方式。您可以使用代理进程,但无论如何,您离发明连接池还有一步之遥

如果连接到服务器的最大连接数 数据库(在承载数据库的服务器上预配置)已耗尽 一个新的进程试图获得一个新的连接

连接尝试失败,SQLSTATE
53300连接太多
。如果等待,服务器可能会耗尽其他限制,并开始出现服务现有客户端的问题


对于这样的问题,您通常会使用像C3P0或DBCP这样的工具,它们在JVM池中起作用,但当您有多个JVM时,这将不起作用

您需要做的是使用一个外部连接池,比如或维护一组来自工作人员的轻量级连接。然后,池器具有较少数量的真实服务器连接,并在来自客户端的轻量级连接之间共享这些连接

连接池通常比不连接池更有效,因为它允许您优化硬件和工作负载的活动PostgreSQL工作进程数量,从而提供工作许可控制

另一种方法是使用一个具有一个或多个线程(每个线程一个连接)的writer进程,该进程从reduce worker获取已完成的工作并写入DB,这样reduce worker就可以继续进行下一个工作单元。如果作者落后太多,你需要有一种方法告诉减员等待。有几种Java排队系统实现适合于此,或者您可以使用JMS

还值得尽可能优化您编写PostgreSQL的方式,使用:

  • 准备好的发言
  • 提交延迟
  • synchronous\u commit='off'
    如果服务器崩溃时您可以承受一些事务的损失
  • 将工作批量化为更大的事务
  • 复制
    或多值
    插入
    s以插入数据块
  • 具有有用磁盘子系统的体面硬件,而不是具有糟糕I/O或RAID的Amazon EC2实例