英文:
Glue Custom Visual Script Running indefinitely
问题
I am trying to create a Custom Visual Transform but unfortunately facing some issues.
Here my motive is to Truncate a MySQL Table before loading the data into it and I want to do it with the help of Visual Transforms not by changing the auto-generated script.
My job is running continuously with the same log:
23/05/14 04:25:00 INFO MultipartUploadOutputStream: close closed:false s3://aws-glue-assets-849950158560-ap-south-1/sparkHistoryLogs/spark-application-1684037765713.inprogress
However, removing all the code except this code is working:
from awsglue import DynamicFrame
def truncate_mysql_table(self, database_name, table_name, connection_name):
return self.filter(lambda row: row['age'] == '21')
DynamicFrame.truncate_mysql_table = truncate_mysql_table
This is the code I am using:
import pymysql
import boto3
import json
from awsglue import DynamicFrame
def truncate_mysql_table(self, database_name, table_name, connection_name):
client = boto3.client('glue')
response = client.get_connection(Name=connection_name, HidePassword=False)
connection_props = response.get("Connection").get("ConnectionProperties")
host_name = connection_props.get("JDBC_CONNECTION_URL").rsplit(":", 1)[0].split("//")[1]
port = int(connection_props.get("JDBC_CONNECTION_URL").rsplit(":", 1)[1].split("/", 1)[0])
secret_id = connection_props.get("SECRET_ID")
client = boto3.client('secretsmanager')
response = client.get_secret_value(SecretId=secret_id)
secret_data = json.loads(response.get("SecretString"))
username = secret_data.get("username")
password = secret_data.get("password")
con = pymysql.connect(host=host_name,
user=username,
passwd=password,
db=database_name,
port=port,
connect_timeout=60)
with con.cursor() as cur:
cur.execute(f"TRUNCATE TABLE {database_name.strip()}.{table_name.strip()}")
con.commit()
con.close()
# print("Table Truncated")
return self
DynamicFrame.truncate_mysql_table = truncate_mysql_table
My Glue Connection and MySQL RDS are in the same VPC also I am having VPC endpoints for S3 and secret manager. This shouldn't be a problem because after changing (or simplifying) the code it is giving the expected output.
英文:
I am trying to create a Custom Visual Transform but unfortunately facing some issues.
Here my motive is to Truncate a MySQL Table before loading the data into it and I want to do it with the help of Visual Tranforms not by changing the auto generated script.
My job is running continueously with the same log:
23/05/14 04:25:00 INFO MultipartUploadOutputStream: close closed:false s3://aws-glue-assets-849950158560-ap-south-1/sparkHistoryLogs/spark-application-1684037765713.inprogress
However removing all the code except this code is working:
from awsglue import DynamicFrame
def truncate_mysql_table(self, database_name, table_name, connection_name):
return self.filter(lambda row: row['age'] == '21')
DynamicFrame.truncate_mysql_table = truncate_mysql_table
This the code I am using:
import pymysql
import boto3
import json
from awsglue import DynamicFrame
def truncate_mysql_table(self, database_name, table_name, connection_name):
client = boto3.client('glue')
response = client.get_connection(Name=connection_name, HidePassword=False)
connection_props = response.get("Connection").get("ConnectionProperties")
host_name = connection_props.get("JDBC_CONNECTION_URL").rsplit(":", 1)[0].split("//")[1]
port = int(connection_props.get("JDBC_CONNECTION_URL").rsplit(":", 1)[1].split("/", 1)[0])
secret_id = connection_props.get("SECRET_ID")
client = boto3.client('secretsmanager')
response = client.get_secret_value(SecretId=secret_id)
secret_data = json.loads(response.get("SecretString"))
username = secret_data.get("username")
password = secret_data.get("password")
con = pymysql.connect(host=host_name,
user=username,
passwd=password,
db=database_name,
port=port,
connect_timeout=60)
with con.cursor() as cur:
cur.execute(f"TRUNCATE TABLE {database_name.strip()}.{table_name.strip()}")
con.commit()
con.close()
# print("Table Truncated")
return self
DynamicFrame.truncate_mysql_table = truncate_mysql_table
My Glue Connection and MySQL RDS is in the same VPC also I am having VPC endpoints for s3 and secret manager.
This shouldn't be a problem becuase after changing (or simplifying) the code it is giving the expected output.
答案1
得分: 0
我在进行这个更改后,使得这个脚本能够正常运行:
在我的情况下,Lambda 函数 和 RDS 实例 都存在于 VPC 的私有子网中,而我的 VPC 中没有任何 Glue 服务端点。
我的 Lambda 函数 正试图使用 boto3 库向 Glue 发送请求以获取连接信息,但它无法通信。
我为我的 VPC 添加了一个 Glue 服务端点,然后,哇哦!它就像魔法般地运行了。
最终,我可以在将数据加载到表中之前截断 MySQL 表。
英文:
I got this script working after this change:
In my case both Lambda Function and RDS Instance is present in the private subnet of a VPC and my VPC don't have any Glue service endpoint.
My Lambda Function is trying to make a request using boto3 library to Glue to get the connection information, but it wasn't able to communicate.
I added a Glue service endpoint to my VPC and voila!!! it works like a charm.
Finally I can Truncate a MySQL Table before loading data into it.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论