将数百万条记录从 Spark 数据帧插入到 Postgres 表的最有效方法是 5000 万条记录。过去,我通过使用批量复制和批量大小选项从 spark 到MSSQL做到了这一点, 这也很成功。
Postgres 是否有类似的东西?
添加我尝试过的代码以及运行该过程所需的时间:
def inserter():
start = timer()
sql_res.write.format("jdbc").option("numPartitions","5").option("batchsize","200000")\
.option("url", "jdbc:postgresql://xyz.com:5435/abc_db") \
.option("dbtable", "public.full_load").option("user", "root").option("password", "password").save()
end = timer()
print(timedelta(seconds=end-start))
inserter()
Run Code Online (Sandbox Code Playgroud)
因此,我对 1000 万条记录执行了上述方法,并按照 中指定的numPartitions方式进行了 5 个并行连接,并且还尝试了 200k 的批量大小。
该过程花费的总时间为0:14:05.760926(十四分五秒)。
有没有其他有效的方法可以减少时间?
我可以使用的有效或最佳批量大小是多少?增加我的批量大小会更快地完成工作吗?或者打开多个连接,即> 5 帮助我加快进程?
1000 万条记录的平均 14 分钟还不错,但正在寻找以前会这样做的人来帮助回答这个问题。
我在PostgreSQL 9.1中使用了一个数据库,其中的条目是从另一个程序不断进入的.我在6秒后从Ajax发送请求以获取最新的entry.tomcat输出窗口显示异常---
Arval SQLException: FATAL: sorry, too many clients already
Run Code Online (Sandbox Code Playgroud)
并且程序在此之后也正常工作.当我用查询检查我的postgres ---
select count(*) from pg_stat_activity;
Run Code Online (Sandbox Code Playgroud)
它显示连接正在不断增加,但我在每次请求后关闭连接.我正在使用netbeans和struts 1.3.
long previousSNO = Long.parseLong(request.getParameter("previousSNO"));
if(previousSNO == 0)
{
sb.append("SELECT sno,search_type,search_value,search_date FROM log_temp ORDER BY search_date DESC LIMIT 20");
prest = cb.executeSQLQuery(sb.toString());
rs = prest.executeQuery();
}
else
{
sb.append("SELECT sno,search_type,search_value,search_date FROM log_temp WHERE sno > ? ORDER BY search_date DESC");
prest = cb.executeSQLQuery(sb.toString());
prest.setLong(1, previousSNO);
rs = prest.executeQuery();
}
rs.last();
int c = rs.getRow();
rs.beforeFirst();
if(rs!=null && c>0)
{
//code for making json …Run Code Online (Sandbox Code Playgroud) 我们有一个托管的 PostgreSQL,无法访问系统或 *.conf 文件。
我确实有管理员访问权限,可以使用 Oracle SQL 开发人员连接到它。我可以运行任何命令来增加 max_connections。所有其他参数似乎都可以共享内存并且缓冲区可以容纳更多连接,因此那里没有问题。
我正在努力使用, &NpgsqlConnection()中的多个连接字符串注册 DI 。ASP.NET Core 3.1Dapper v2.0.78Postgres v11
我将提供当前状态并修复以下代码:
步骤1。Startup.cs --> ConfigureServices()
services.AddTransient<IDbConnectionFactory, DapperDbConnectionFactory>(sp =>
{
var connectionDict = new Dictionary<DatabaseConnectionName, string>
{
{ DatabaseConnectionName.Cnn1, "Connectionstring 1"},
{ DatabaseConnectionName.Cnn2, "Connectionstring 2"}
};
return new DapperDbConnectionFactory(connectionDict);
});
Run Code Online (Sandbox Code Playgroud)
第2步。DapperDbConnectionFactory看起来像这样:
public class DapperDbConnectionFactory : IDbConnectionFactory
{
private readonly IDictionary<DatabaseConnectionName, string> _connectionDict;
public DapperDbConnectionFactory(IDictionary<DatabaseConnectionName, string> connectionDict)
{
_connectionDict = connectionDict;
}
public IDbConnection CreateDbConnection(DatabaseConnectionName connectionName)
{
string connectionString = null;
if …Run Code Online (Sandbox Code Playgroud) c# postgresql dependency-injection connection-pooling asp.net-core
在 Kubernetes 中,来自 ConfigMap 的环境变量不会更改 PostgreSql pod 中的 max_connections 属性。您如何通过 Kubernetes 中的环境变量更改 Postgres max_connections 配置?
我尝试使用以下参数来配置 Postgres。
问题是,我可以按预期使用 DB、USER 和 PASSWORD 参数和值。但我需要更改 max_connections 配置。我做了相关研究,看来 PGOPTIONS 是发送配置更改的正确选择。即使我尝试了 PGOPTIONS 和其他变体,对 max_connections 值也没有影响。我正在连接 postgresql 并且我正在执行 SHOW MAX_CONNECTIONS 查询,即使我在环境配置值中指定了 1000,它也会显示 100。
我在 digitalocean 中使用 Kubernetes 1.14。
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-config-demo
labels:
app: postgres
data:
POSTGRES_DB: demopostgresdb
POSTGRES_USER: demopostgresadmin
POSTGRES_PASSWORD: demopostgrespwd
PGOPTIONS: "-c max_connections=1000 -c shared_buffers=1024MB"
POSTGRES_OPTIONS: "-c max_connections=1000 -c shared_buffers=1024MB"
PG_OPTIONS: "-c max_connections=1000 -c shared_buffers=1024MB"
MAX_CONNECTIONS: "1000"
Run Code Online (Sandbox Code Playgroud)
apiVersion: apps/v1 …Run Code Online (Sandbox Code Playgroud) postgresql ×5
apache-spark ×1
asp.net-core ×1
bigdata ×1
c# ×1
java ×1
kubernetes ×1
linux ×1
pyspark ×1