更新时间:2024-10-16 GMT+08:00
分享

导入导出Hive表/分区数据

操作场景

在大数据应用场景中,往往存在将Hive中的数据表迁移到另一个集群上,使用Hive的导入导出命令可以实现表级别数据迁移,即可使用Export命令将源集群的Hive表导出到目标集群的HDFS中,再在目标集群使用Import命令将导出的数据导入到相应的Hive表中。

本章节内容适用于MRS 3.2.0及之后版本。

Hive表导入导出功能目前不支持对加密表、HBase外部表、Hudi表、视图表、物化视图表进行导入导出操作。

前提条件

  • 如果是跨集群对Hive表或分区数据进行导入导出,且目标集群和源集群都开启了Kerberos认证,需配置跨集群互信。
  • 如果使用Import/Export命令导入导出其他用户创建的表或分区,需要授予用户对应表的权限:
  • 还需在源端集群和目标集群启用集群间复制功能。
  • 需配置源端集群访问目标集群HDFS服务地址参数。

    登录源端集群的FusionInsight Manager,选择“集群 > 服务 > Hive > 配置”,搜索“hdfs.site.customized.configs”,新增自定义参数“dfs.namenode.rpc-address.haclusterX”,值为“目标集群主NameNode实例节点业务IP:RPC端口”;新增自定义参数“dfs.namenode.rpc-address.haclusterX1”,值为“目标集群备NameNode实例节点的业务IP:RPC端口”,NameNode RPC端口默认为“25000”。保存配置后需滚动重启Hive服务。

操作步骤

  1. 以Hive客户端安装用户登录源端集群安装客户端的节点。
  2. 执行以下命令,切换到客户端安装目录,例如安装目录为“/opt/client”,请用户根据实际情况修改。

    cd /opt/client

  3. 执行以下命令配置环境变量。

    source bigdata_env

  4. 如果集群开启了Kerberos认证,执行以下命令认证用户,否则跳过此步骤。

    kinit Hive业务用户

  5. 执行以下命令登录源端集群的Hive客户端。

    beeline

  6. 执行以下命令创建表“export_test”。

    create table export_test(id int) ;

  7. 执行以下命令向表“export_test”中插入数据。

    insert into export_test values(123);

  8. 在目标集群重复执行1-4,并执行以下命令创建存放表“export_test”导出后的HDFS路径。

    dfs -mkdir /tmp/export

  9. 执行以下命令登录目标集群的Hive客户端。

    beeline

  10. 导入导出表“export_test”。

    使用Hive Import/Export对表数据迁移时,支持以下几种场景,可以根据实际情况选择合适的导入导出方式。

    • 场景一:简单导出导入
      1. 在源端集群执行以下命令将表“export_test”的元数据和业务数据导出到8创建的目录下。

        export table export_test to 'hdfs://haclusterX/tmp/export';

      2. 在目标集群执行以下命令将10.a导出的表数据导入到表“export_test”中。

        import from '/tmp/export';

    • 场景二 :在导入时重命名表
      1. 在源端集群执行以下命令将表“export_test”的元数据和业务数据导出到8创建的目录下。

        export table export_test to 'hdfs://haclusterX/tmp/export';

      2. 在目标集群执行以下命令将10.a导出的表数据导入到表“import_test”中。

        import table import_test from '/tmp/export';

    • 场景三:导出分区数据并导入
      1. 在源端集群执行以下命令将表“export_test”的pt1和pt2分区导出到8创建的目录下。

        export table export_test partition (pt1="in", pt2="ka") to 'hdfs://haclusterX/tmp/export';

      2. 在目标集群执行以下命令将10.a导出的表数据导入到表“export_test”中。

        import from '/tmp/export';

    • 场景四:导出表数据并且将该数据导入到分区中
      1. 在源端集群执行以下命令将表“export_test”的元数据和业务数据导出到8创建的目录下。

        export table export_test to 'hdfs://haclusterX/tmp/export';

      2. 在目标集群执行以下命令将10.a导出的表数据导入到表“import_test”的pt1和pt2分区中。

        import table import_test partition (pt1="us", pt2="tn") from '/tmp/export';

    • 场景五:导入表数据时指定表的Location
      1. 在源端集群执行以下命令将表“export_test”的元数据和业务数据导出到8创建的目录下。

        export table export_test to 'hdfs://haclusterX/tmp/export';

      2. 在目标集群执行以下命令将10.a导出的表数据导入到表“import_test”中,且该表的Location为“/tmp/export”。

        import table import_test from '/tmp' location '/tmp/export';

    • 场景六:导入表数据为外部表
      1. 在源端集群执行以下命令将表“export_test”的元数据和业务数据导出到8创建的目录下。

        export table export_test to 'hdfs://haclusterX/tmp/export';

      2. 在目标集群执行以下命令将10.a导出的表数据导入到外部表“import_test”中。

        import external table import_test from '/tmp/export';

    导出表/分区数据时,存放表/分区数据的HDFS路径需提前创建,且该目录为空,否则导出失败。

    导出分区时,导出的表必须为分区表,且不支持导出同一个分区字段的多个分区值的数据;导入到表中分区时导入的表必须是分区表。

    导入数据时需注意:
    • 使用import from '/tmp/export';命令导入表是没有指定表名的场景,该场景导入的数据会保存到与源表名相同的表路径下,需注意以下两点:
      • 如果目标集群上不存在与源集群上同名的表,在导入表的过程中会创建该表。
      • 如果目标集群上已存在与源集群上同名的表,该表对应的HDFS目录下必须为空,否则导入失败。
    • 使用import external table import_test from '/tmp/export';命令导入表会将导出的表导入到指定的表中,需注意以下两点:
      • 如果目标集群上不存在与指定的表名相同的表,在导入表的过程中会创建该表。
      • 如果目标集群上已存在与指定的表名相同的表,该表对应的HDFS目录下必须为空,否则导入失败。

    haclusterX”为新增的自定义参数“dfs.namenode.rpc-address.haclusterX”中的“haclusterX”

相关文档