使用 Apache Sqoop 在 Apache Hadoop on HDInsight 与 Azure SQL 数据库之间导入和导出数据
了解如何使用 Apache Sqoop 在 Azure HDInsight 中的 Apache Hadoop 群集与 Azure SQL 数据库或 Microsoft SQL Server 之间进行导入和导出。 本文档中的步骤直接从 Hadoop 群集的头节点使用 sqoop
命令。 可以使用 SSH 连接到头节点并运行本文档中的命令。 本文是在 HDInsight 中将 Apache Sqoop 与 Hadoop 配合使用的续篇。
先决条件
SSH 客户端。 有关详细信息,请参阅使用 SSH 连接到 HDInsight (Apache Hadoop)。
熟悉 Sqoop。 有关详细信息,请参阅 Sqoop 用户指南。
设置
使用 ssh 命令连接到群集。 编辑以下命令(将 CLUSTERNAME 替换为群集的名称),然后输入该命令:
ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.cn
为了便于使用,请设置变量。 将
PASSWORD
、MYSQLSERVER
和MYDATABASE
替换为相关值,然后输入以下命令:export PASSWORD='PASSWORD' export SQL_SERVER="MYSQLSERVER" export DATABASE="MYDATABASE" export SERVER_CONNECT="jdbc:sqlserver://$SQL_SERVER.database.chinacloudapi.cn:1433;user=sqluser;password=$PASSWORD" export SERVER_DB_CONNECT="jdbc:sqlserver://$SQL_SERVER.database.chinacloudapi.cn:1433;user=sqluser;password=$PASSWORD;database=$DABATASE"
Sqoop 导出
从 Hive 到 SQL。
若要验证 Sqoop 是否可以查看数据库,请在打开的 SSH 连接中输入以下命令。 此命令会返回数据库列表。
sqoop list-databases --connect $SERVER_CONNECT
输入以下命令以查看指定数据库的表列表:
sqoop list-tables --connect $SERVER_DB_CONNECT
若要将数据从 Hive
hivesampletable
表导出到数据库中的mobiledata
表,请在打开的 SSH 连接中输入以下命令:sqoop export --connect $SERVER_DB_CONNECT \ -table mobiledata \ --hcatalog-table hivesampletable
若要验证数据是否已导出,请通过 SSH 连接使用以下查询来查看导出的数据:
sqoop eval --connect $SERVER_DB_CONNECT \ --query "SELECT COUNT(*) from dbo.mobiledata WITH (NOLOCK)" sqoop eval --connect $SERVER_DB_CONNECT \ --query "SELECT TOP(10) * from dbo.mobiledata WITH (NOLOCK)"
Sqoop 导入
从 SQL 到 Azure 存储。
在打开的 SSH 连接中输入以下命令,以将数据从 SQL 中的
mobiledata
表导入到 HDInsight 上的wasbs:///tutorials/usesqoop/importeddata
目录。 数据中的字段将通过制表符分隔,并且相关行由换行符终止。sqoop import --connect $SERVER_DB_CONNECT \ --table mobiledata \ --target-dir 'wasb:///tutorials/usesqoop/importeddata' \ --fields-terminated-by '\t' \ --lines-terminated-by '\n' -m 1
此外,还可以指定 Hive 表:
sqoop import --connect $SERVER_DB_CONNECT \ --table mobiledata \ --target-dir 'wasb:///tutorials/usesqoop/importeddata2' \ --fields-terminated-by '\t' \ --lines-terminated-by '\n' \ --create-hive-table \ --hive-table mobiledata_imported2 \ --hive-import -m 1
在导入完成后,请在打开的 SSH 连接中输入以下命令,以列出新目录中的数据:
hadoop fs -tail /tutorials/usesqoop/importeddata/part-m-00000
使用 beeline 验证该表是否已在 Hive 中创建。
连接
beeline -u 'jdbc:hive2://headnodehost:10001/;transportMode=http'
每次执行下面的一个查询并查看输出:
show tables; describe mobiledata_imported2; SELECT COUNT(*) FROM mobiledata_imported2; SELECT * FROM mobiledata_imported2 LIMIT 10;
使用
!exit
退出 beeline。
限制
批量导出 - 在基于 Linux 的 HDInsight 上,用于将数据导出到 SQL 的 Sqoop 连接器不支持批量插入。
批处理 - 在基于 Linux 的 HDInsight 上,如果在执行插入时使用
-batch
开关,Sqoop 将进行多次插入而不是批处理插入操作。
重要注意事项
HDInsight 和 SQL Server 必须位于同一 Azure 虚拟网络上。
有关示例,请参阅将 HDInsight 连接到本地网络文档。
有关通过 Azure 虚拟网络使用 HDInsight 的详细信息,请参阅使用 Azure 虚拟网络扩展 HDInsight 文档。 有关 Azure 虚拟网络的详细信息,请参阅虚拟网络概述文档。
必须将 SQL Server 配置为允许 SQL 身份验证。 有关详细信息,请参阅选择身份验证模式文档。
可能需要将 SQL Server 配置为接受远程连接。 有关详细信息,请参阅如何解决 SQL Server 数据库引擎的连接问题文档。
后续步骤
现在,你已了解了如何使用 Sqoop。 若要了解更多信息,请参阅以下文章:
- 将 Apache Oozie 和 HDInsight 配合使用:在 Oozie 工作流中使用 Sqoop 操作。
- 使用 HDInsight 分析航班延误数据:使用 Interactive Query 分析航班延误数据,然后使用 Sqoop 将数据导出到 Azure 中的数据库。
- 将数据上传到 HDInsight:了解将数据上传到 HDInsight/Azure Blob 存储的其他方法。