所有文档

          百度MapReduce BMR

          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文件进行,下载地址

          第二步 建表并导入数据

          • 关于如何登录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表中就会存在重复数据。
          上一篇
          BMR的混部方案
          下一篇
          流式应用场景