GCP/Python:在将 csv 从 Hive 导入 CloudSQL 时捕获 subprocess.popen() 中的实际错误

问题描述

我在 GCP 上的 GNU/Linux 3.10 上有 python 3.6.8,我正在尝试将数据从 Hive 加载到 Cloudsql

        gc_cmd_import_csv_p1 = subprocess.Popen(['gcloud','sql','import','csv','{}'.format(quote(cloudsql_instance)),'{}'.format(quote(load_csv_files)),'--database={}'.format(quote(cloudsql_db)),'--table={}'.format(quote(cloudsql_table_name)),'--user={}'.format(quote(db_user_name)),'--quiet'],stdout=subprocess.PIPE,stderr=subprocess.PIPE,universal_newlines=True)
    import_cmd_op,import_cmd_error = gc_cmd_import_csv_p1.communicate()
    import_cmd_return_code = gc_cmd_import_csv_p1.returncode
    if import_cmd_return_code:
        print("""[ERROR] Unable to import data from Hive to Cloudsql. 
        Error description: {}
        Error Code(s): {}
        Issue file name: {}
        """.format(import_cmd_error,import_cmd_return_code,load_csv_files))
        sys.exit(9)
print("[INFO] Data Import completed from HIVE to Cloudsql.")

如果出现上述任何错误,我会收到如下消息:

Error description: ERROR: (gcloud.sql.import.csv) HTTPError 403: The client is not authorized to make this request.Error Code(s): 1 

但是当我实际直接运行相同的导入命令时,如下所示:

gcloud sql import csv test-cloud-sql-instance  gs://test-server-12345/app1/data/lookup_table/000000_0 --database=test_db --table=name_lookup --user=test_user --quiet

我收到如下实际错误

ERROR: (gcloud.sql.import.csv) [ERROR_RDBMS] ERROR:  extra data after last expected column CONTEXT:  copY name_lookup,line 16902:

我想要这条消息

(最后一个预期列之后的额外数据...第 16902 行:)

在python脚本中显示而不是

HTTP 错误 403:

错误。如何捕捉它? 请注意:没有 HTTP 错误建议的身份验证问题。

解决方法

因此,经过与 GCP 管理员的长时间讨论,我们发现了问题。

我们尝试使用 os.system() 执行相同的导入命令,然后再次出现 HTTP 错误。然后,管理员重新访问了 GCP IAM 文档并为 P-SQL 用户创建了一个角色。问题现已解决。