暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

业务数据采集(四)Sqoop安装配置以及采集数据到HDFS

畅谈Fintech 2021-06-24
1121


上一篇我们简析了一下数据同步策略。

这篇我们将会介绍大数据的业务数据采集组件Sqoop的搭建配置,来完成业务数据的采集工作。




业务数据采集系列:

一、整体架构设计以及MySQL安装配置

二、业务表建模以及mock业务数据生成

三、简析数据同步策略

四、Sqoop安装配置以及采集数据到HDFS

五、业务数据采集总结





一、Sqoop的安装和配置


Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 :MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
1、Sqoop下载
首先来到Sqoop官网查看:Sqoop的版本描述
Latest stable release is 1.4.7
Latest cut of Sqoop2 is 1.99.7
Note that 1.99.7 is not compatible with 1.4.7 and not feature complete, 
it is not intended for production deployment.
根据官网说明,稳定版本是1.4.7,并且1.99.7和1.4.7不兼容。我们这里下载1.4.7这个版本。
解压缩后下载到Node01节点


2、Sqoop配置
sqoop1.4.7/conf目录下,修改配置文件名称
    [qiusheng@node01 conf]$ mv sqoop-env-template.sh sqoop-env.sh

    编译编辑sqoop-env.sh文件
    添加环境变量
    • HADOOP_HOME;
    • HIVE_HOME;
    • HBASE_HOME:这里我们还暂时没有使用hbase
    • ZOOKEEPER_HOME;
      #hadoop1.x需要配置这两个环境变量,
      #但是2.x以上配置HADOOP_HOME的环境变量就OK了
      export HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.4
      export HADOOP_COMMON_HOME=/opt/module/hadoop-3.1.4


      #sqoop可以把数据直接导入到hive里面
      export HIVE_HOME=/opt/module/hive


      #sqoop配置zk_home和dir
      export ZOOKEEPER_HOME=/opt/module/zookeeper-3.5.7
      export ZOOCFGDIR=/opt/module/zookeeper-3.5.7/conf


      #set the path to where bin/hbase is available
      #export HBASE_HOME=
      把mysql-jdbc-jar包拷贝到sqoop的lib目录下
        cp mysql-connector-java-5.1.48.jar opt/module/sqoop1.4.7/lib/


        3、验证是否安装成功

          [qiusheng@node01 sqoop-1.4.7]$ bin/sqoop help

          看到上图有Sqoop的使用方法和版本等信息说明Sqoop安装配置成功。



          二、Sqoop导入单表到HDFS


          成功安装Sqoop后,我们开始导数据
          1、Sqoop链接数据库
          通过sqoop命令行链接mysql数据库
            [qiusheng@node01 sqoop-1.4.7]$ 
            bin/sqoop list-databases --connect jdbc:mysql://node01:3306/ --username root -P

            输入mysql的登录密码;

            显示如下:可以看到mysql的库了,说明链接mysql正常。


            2、Sqoop操作单表导入到HDFS
            比如:我们把业务系统mysql数据库的gmall库里面的user_info表,id,login_name,nick_name三列第10行到第100行记录通sqoop导入到HDFS,在HDFS上生成的路径是/gmall_data/db/test01,user_info表如下:

            我们来分析一下sqoop命令行:

              #import是mysql等导入到HDFS
              #export则是HDFS导出到mysql等
              ./bin/sqoop import \
              #使用jdbc链接数据库,需要URL、用户名、密码
              --connect jdbc:mysql://node01:3306/gmall \
              --username root \
              --password XXXXX \
              #哪张表?哪些字段
              --table user_info \
              --columns id,login_name,nick_name \
              #哪些数据?条件是什么?
              --where "id >= 10 and id <= 100" \
              #导入到HDFS集群路径
              --target-dir gmall_data/db/test01 \
              --delete-target-dir \
              #分隔符\t
              --fields-terminated-by '\t' \
              #分配mapper
              --num-mappers 2 \
              #根据id分割
              --split-by id \

              执行后HDFS集群上显示

              路径是:/gmall_data/db/test01;

              副本数量是:3份;





              三、Sqoop脚本导入HDFS


              导入单表数据成功后,我们尝试导入所有业务表到HDFS。这里使用脚本来完成,由于脚本文件比较长,现在分段简析一下脚本文件。


              1、处理时间


              我们希望的是每天晚上0点自动把mysql数据导入到HDFS。如:6月13号,统计是6月12日的数据,格式是2021-06-12,我们需要把系统时间减掉1天。

              • 脚本文件传入的格式是指定时间:

              xxxx.sh 2021-05-01

              • 不指定时间,默认使用系统时间减掉1天

              xxxx.sh

                #用户可以传入的格式是:mysql_to_hdfs.sh 2021-05-01
                if [ -n "$1" ] ;then
                do_date=$1
                #传入时间为空,即没有传入时间mysql_to_hdfs.sh,给他系统时间 -1day
                else
                do_date=`date -d '-1 day' +%F`
                fi


                2、查询条件query编写

                查询条件需要做成动态的,根据数据表的同步策略;

                全量表:select * from 表;

                增量表:select * from 表 where 创建表时间 = 今天;

                新增和变化:select * from 表 where 创建表时间 = 今天 and 操作时间 = 今天

                $2:根据数据同步策略编写sql语句

                $CONDITIONS:转义拼接语法,比如(id >10,id < 100)


                3、lzo压缩处理

                • 首先要处理mysql上传到HDFS支持lzo压缩分片
                • 需要使用lzo压缩的索引
                • 处理mysql null值到HDFS(如:Hive)空值的区别;
                  #支持lzo压缩
                  --compress \
                  --compression-codec lzop \


                  #mysql to hdfs空值处理
                  --null-string '\\N' \
                  --null-non-string '\\N'


                  #添加lzo索引
                  hadoop jar opt/module/hadoop-3.1.4/share/hadoop/common/hadoop-lzo-0.4.20.jar com.hadoop.compression.lzo.DistributedLzoIndexer origin_data/$APP/db/$1/$do_date
                  }

                  4、定义函数导入

                  定义import_data(parms1,parms2)

                  parms1:表名,如下面的order_info

                  parms2:数据同步策略后的where语句,如下面的“select,,,”

                    import_order_info(){
                    import_data order_info "select
                    id,
                    final_total_amount,
                    order_status,
                    user_id,
                    out_trade_no,
                    create_time,
                    operate_time,
                    province_id,
                    benefit_reduce_amount,
                    original_total_amount,
                    feight_fee
                    from order_info
                    where (date_format(create_time,'%Y-%m-%d')='$do_date'
                    or date_format(operate_time,'%Y-%m-%d')='$do_date')"
                    }
                    5、对应同步策略的导入规则
                    • 传入表名

                      $1是表示表名

                      case $1 in
                      "order_info")
                      import_order_info
                      ;;
                      "base_category1")
                      import_base_category1
                      ;;


                      • 特殊表导入

                        特殊表就是同步策略讲到的那些特殊表。比如:省份等;

                        在第一次导入HDFS时间,这些特殊表就一次性的导入HDFS。

                        $1是first

                        case $1 in


                        "first")
                           import_base_category1
                           import_order_info
                        • 全量表

                          $1是all

                          case $1 in
                          "all")
                          import_base_category1
                             import_base_category2

                          这样我们的脚本文件大致内容如上所述;

                          5、导入脚本
                          • 初次导入脚本

                            mysql_to_hdfs.sh first 2021-05-01

                          • 每日导入脚本
                            mysql_to_hdfs.sh all 2021-05-02


                          大约上传20分钟后,我们查看HDFS路径发现/origin_data/gmail/db下面表已经上传上来了,按照一天一个目录。

                          按照1天一个目录。


                          这样我们就完成了业务数据的采集工作!



                          总结:
                          1. Sqoop的安装和配置

                          2. Sqoop操作mysql导入到HDFS

                          3. Sqoop脚本编写

                          4. 上传数据格式为lzo数据,并且支持lzo切片索引

                          5. HDFS路径查看是否已经有了业务数据



                          文章转载自畅谈Fintech,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                          评论