Sqoop应用文档

场景描述

通过BMR Sqoop可以将RDS上的数据导入BMR Hive:

在本示例中,hive数据表的location为BOS路径,hive数据表的partition为dt(string),根据dt指定日期,区分每一天的导入数据。

说明

由于hive数据表的location为BOS,无法直接通过sqoop将RDS的数据导入hive,因为hive在加载数据时,会先将数据写入本地hdfs,然后将数据所在目录移动到hive表的location上。由于本地hdfs和BOS数据两个不同的文件系统,直接进行移动操作会抛出异常。因此,本场景需要“数据导入BOS”和“数据导入hive”两个步骤。

准备阶段

本示例所用数据为BMR Samples公共数据集。

第一步 准备数据

本示例的建表以及数据可以通过sql文件进行,下载地址:http://bmr-public-data.bj.bcebos.com/apps/sqoop/bmr-public-data-logs.sql

第二步 建表并导入数据

  • 关于如何登录RDS数据库,参考文档

  • 登录RDS后,选择一个数据库导入下载的sql文件,构建bmr_public_data_logs数据表,导入公共数据集。

步骤如下:

  1. 选中数据库sqoop;
  2. 点击导入;
  3. 选择下载的sql文件,注意如果是自己的sql文件,不能超过8M,超过8M可以先尝试压缩成zip文件,注意压缩文件结尾为.sql.zip。

结果如下图所示:

第三步 创建Hive数据表

登录BMR集群,切换到hdfs用户,创建hive数据表。

# eip可以在BMR Console集群详情页的实例列表获取
ssh root@eip

# 切换到hdfs用户
su hdfs
cd

# 启动hive shell
hive

# 输入以下建表语句
CREATE EXTERNAL TABLE `bmr_public_data_logs`(
   `id` int,
   `remote_addr` string,
   `time_local` string,
   `request` string,
   `status` int,
   `body_bytes_send` int,
   `http_referer` string,
   `http_cookie` string,
   `remote_user` string,
   `http_user_agent` string,
   `request_time` double,
   `host` string,
   `msec` double)
PARTITIONED BY (
   `dt` string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS INPUTFORMAT
    'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
    'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'    
LOCATION
    'bos://test-sqoop-example/bmr-public-data-logs/';

注意

  • 由于sqoop import默认的字段分隔符是',',所以在建表的时候将hive表的字段分隔设为',',即建表语句中:ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

  • 将location的bos路径修改为自己的bos路径

数据导入BOS

使用Sqoop将RDS上的数据导入BOS,关于Sqoop的更多用法,参考文档

# eip可以在BMR Console集群详情页的实例列表获取
ssh root@eip

# 切换到hdfs用户
su hdfs
cd

# 使用sqoop命令将数据导入bos
sqoop import --connect jdbc//rds_mysql_hostname:port/sqoop --username test --password test --table  bmr_public_data_logs --split-by id --target-dir bos://test-sqoop-example/bmr-log-test

备注:

Sqoop命令中需要替换的地方,如下图所示:

(1)RDS域名;
(2)RDS数据库;
(3)RDS数据库用户名;
(4)RDS数据库密码;
(5)BOS上的目标路径(不能在sqoop导入前存在);

数据导入Hive

使用hive进行加载data

# eip可以在BMR Console集群详情页的实例列表获取
ssh root@eip

# 切换到hdfs用户
su hdfs
cd

# 启动hive shell
hive

# 导入数据
load data inpath 'bos://test-sqoop-example/bmr-log-test' into table bmr_public_data_logs partition (dt='2015-11-02');

说明:

  1. bos://test-sqoop-example/bmr-log-test是sqoop导入数据到bos上的目标路径。
  2. 加载数据过程中,hive将sqoop导入bos上的数据移动到hive表所指定的location中,在location(bos://test-sqoop-example/bmr-public-data-logs/)中新建目录“dt=2015-11-02”,将数据移动到这个目录下,而sqoop导入到bos上的原目录已经成为空目录,可以进行删除。
  3. 在加载数据过程中,可以带有overwrite,例如“load data inpath 'bos://test-sqoop-example/bmr-log-test' overwrite into table bmr_public_data_logs partition (dt='2015-11-02');”覆盖原有partition,如果不覆盖,只会将重名文件重命名,这样如果数据文件中有重复数据,则hive表中就会存在重复数据。