我有一张大桌子(大约300gb),内存大约为(50Gb),内存为8 cpus。
我想使用spark和jdbc连接将psql表移动到Google云存储中。非常类似于:How to convert an 500GB SQL table into Apache Parquet?。
我知道我的连接有效,因为我能够移动一个小桌子。但是用大表我会遇到内存问题。我该如何优化呢?
import pyspark
from pyspark.sql import SQLContext
from pyspark import SparkContext
from pyspark.sql import DataFrameReader
conf = pyspark.SparkConf().setAll([("spark.driver.extraClassPath", "/usr/local/bin/postgresql-42.2.5.jar:/usr/local/jar/gcs-connector-hadoop2-latest.jar")
,("spark.executor.instances", "8")
,("spark.executor.cores", "4")
,("spark.executor.memory", "1g")
,("spark.driver.memory", "6g")
,("spark.memory.offHeap.enabled","true")
,("spark.memory.offHeap.size","40g")])
sc = pyspark.SparkContext(conf=conf)
sc.getConf().getAll()
sc._jsc.hadoopConfiguration().set("google.cloud.auth.service.account.json.keyfile","/home/user/analytics/gcloud_key_name.json")
sqlContext = SQLContext(sc)
url = 'postgresql://address:port/db_name'
properties = {
'user': 'user',
'password': 'password'}
df_users = sqlContext.read.jdbc(
url='jdbc:%s' % url, table='users', properties=properties
)
gcloud_path= "gs://BUCKET/users"
df_users.write.mode('overwrite').parquet(gcloud_path)
奖金问题: 我现在可以分区吗?还是首先应该将其保存为镶木地板,然后读取并重新分区?
奖金问题2: 如果对红利问题1的回答是“是”,那么我现在可以对它进行排序吗?或者首先我应该将其保存为镶木地板,然后阅读并重新分区?