使用Apache Sqoop与Dataproc从SQL Server导入数据到GCS报错
问题根因说明
你的核心报错是Dataproc集群无法和SQL Server实例建立TCP网络连接,后续的No columns to generate for ClassWriter只是连接失败后的衍生报错,和Sqoop本身的配置、JDBC依赖无关。
排查&解决步骤
- 第一步确认网络可达性:
你之前仅检查了SQL Server本身的TCP配置,还需要确认Dataproc集群所在的Google Cloud VPC和SQL Server所在的网络是打通的:- 如果SQL Server部署在本地IDC,需要先配置云专线或者VPN打通本地网络和Google Cloud VPC,或者给SQL Server配置公网可访问的固定IP
- 如果你用主机名
RUKSQLRS01访问SQL Server,需要确认Dataproc集群所在VPC的DNS服务可以正确解析这个主机名,建议先把JDBC连接串里的主机名替换为SQL Server的固定IP做测试
- 第二步检查防火墙规则:
- 确认SQL Server所在服务器的本地防火墙放行1433端口的入站请求,源地址范围包含Dataproc集群的节点IP段
- 确认Google Cloud VPC的出口防火墙规则没有禁止到1433端口的出站请求
- 第三步验证连通性:
先登录Dataproc集群的主节点,执行telnet <SQL Server IP> 1433或者nc -zv <SQL Server IP> 1433测试网络连通性,如果这一步失败,说明是网络层面的问题,先解决网络问题再调试Sqoop作业 - 第四步修正JDBC连接参数:
如果网络连通正常,建议在JDBC连接串中增加encrypt=false参数,避免高版本SQL Server JDBC驱动默认要求加密连接导致连接失败。
测试命令示例
CLUSTERNAME="sqoop-cluster" BUCKET="gs://sqoop-bucket-20092021" libs=`gsutil ls $BUCKET/jars | paste -sd, --` # 替换尖括号内容为你的SQL Server实际IP JDBC_STR="jdbc:sqlserver://<SQL Server固定IP>:1433;databaseName=RUKDataWarehouse;encrypt=false" SQL_USER="RUKSQLDataWarehouse_Reporting" SQL_PASS="gs://sqoop-bucket-20092021/creds/sqoop.password" TABLE="LBD_Task" SCHEMA="dbo" gcloud dataproc jobs submit hadoop \ --region europe-west2 \ --cluster="$CLUSTERNAME" \ --jars=$libs \ --class=org.apache.sqoop.Sqoop \ -- \ import \ -Dorg.apache.sqoop.splitter.allow_text_splitter=true \ -Dmapreduce.job.user.classpath.first=true \ --connect "$JDBC_STR" \ --username "$SQL_USER" \ --password-file "$SQL_PASS" \ --table "$SCHEMA.$TABLE" \ --warehouse-dir "$BUCKET/output/$TABLE" \ --num-mappers 1 \ --as-avrodatafile
内容的提问来源于stack exchange,提问作者Muntasir Tusher
相关产品推荐
相关产品推荐

