zoukankan      html  css  js  c++  java
  • sqoop

     Sqoop主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。

    http://sqoop.apache.org/

    Latest stable release is 1.4.7 (downloaddocumentation). Latest cut of Sqoop2 is 1.99.7 (downloaddocumentation). Note that 1.99.7 is not compatible with 1.4.7 and not feature complete, it is not intended for production deployment.

    原理:

    将导入或导出命令翻译成mapreduce程序来实现。

    在翻译出的mapreduce中主要是对inputformat和outputformat进行定制。

    导入(import): mysql-->hadoop
    导出(export): hadoop-->mysql

    Sqoop安装

                 

    1)上传安装包sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz到虚拟机中
    2) 解压sqoop安装包到指定目录,如:
    $ tar -zxf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C /opt/module/
    改个名
    3mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha sqoop
    修改配置文件
    Sqoop的配置文件与大多数大数据框架类似,在sqoop根目录下的conf目录中。
    1) 重命名配置文件
    $ mv sqoop-env-template.sh sqoop-env.sh
    2) 修改配置文件
    sqoop-env.sh
    export HADOOP_COMMON_HOME=/opt/module/hadoop-2.7.2
    export HADOOP_MAPRED_HOME=/opt/module/hadoop-2.7.2
    export HIVE_HOME=/opt/module/hive
    export ZOOKEEPER_HOME=/opt/module/zookeeper-3.4.10
    export ZOOCFGDIR=/opt/module/zookeeper-3.4.10
    export HBASE_HOME=/opt/module/hbase
    拷贝JDBC驱动
    拷贝jdbc驱动到sqoop的lib目录下,如:
    $ cp mysql-connector-java-5.1.27-bin.jar /opt/module/sqoop/lib/
     验证Sqoop
    我们可以通过某一个command来验证sqoop配置是否正确:
    $ bin/sqoop help
    
    sqoop list-databases 
    --connect jdbc:mysql://hadoop101:3306 
    --username root --password 123456
    # 查看mysql库中的所有数据库
    
    sqoop list-tables 
    --connect jdbc:mysql://hadoop101:3306/gmall 
    --username root --password 123456
    # 查看mysql某个库中的所有表

    配置环境变量 在~/.bashrc文件下添加sqoop 文件位置

    #SQOOP_HOME
    export SQOOP_HOME=/opt/module/sqoop
    export PATH=$PATH:$SBT_HOME/bin:$SQOOP_HOME/bin
    export CLASSPATH=$CLASSPATH:$SQOOP_HOME/lib

    执行使得文件生效即

    source ~/.bashrc

    导入数据

    在Sqoop中,“导入”概念指:从非大数据集群(RDBMS)向大数据集群(HDFS,HIVE,HBASE)中传输数据,叫做:导入,即使用import关键字。

    1)导入到HDFS

    --target-dir如果不指定目录,默认导入的是家目录/user/kris/表名;mysql建表时指定了主键,就按主键分片,可--split-by指定切分字段;
    
    1)按名字切片,指定路径(如果路径存在就删除)
    [kris@hadoop101 sqoop]$ bin/sqoop import 
    --connect jdbc:mysql://hadoop101:3306/company
    --username root
    --password 123456
    --table staff
    --split-by name
    --num-mappers 2
    --target-dir /sqoop/staff
    --delete-target-dir
    默认是按,分割的
    [kris@hadoop102
    ~]$ hadoop fs -cat /sqoop/staff/part-m-00001 1,kris,male [kris@hadoop102 ~]$ hadoop fs -cat /sqoop/staff/part-m-00000 2,alex,female 3,alex,female
    2)导入指定列 ① [kris@hadoop101 sqoop]$ bin/sqoop import
    --connect jdbc:mysql://hadoop101:3306/company
    --username root
    --password 123456
    --table staff
    --split-by name
    --num-mappers 2
    --target-dir /sqoop/staff
    --delete-target-dir
    --columns id,name
    --fields-terminated-by ' '
    bin/sqoop import
    --connect jdbc:mysql://hadoop101:3306/company
    --username root
    --password 123456
    --table staff
    --query和--table不能一起使用;$CONDITIONS,不管有多少个--num-mappers都要加$CONDITIONS --query 'select * from staff where id > 1 and $CONDITIONS' 把范围放到$CONDITIONS中 它决定每个maptask处理的范围 [kris@hadoop101 sqoop]$ bin/sqoop import --connect jdbc:mysql://hadoop101:3306/company --username root --password 123456 --split-by name --num-mappers 2 --target-dir /sqoop/staff --delete-target-dir --columns id,name --fields-terminated-by ' ' --query 'select * from staff where id > 1 and $CONDITIONS' ③ [kris@hadoop101 sqoop]$ bin/sqoop import --help --where 'id>2' 过滤条件要加引号 --table staff [kris@hadoop101 sqoop]$ bin/sqoop import --connect jdbc:mysql://hadoop101:3306/company --username root --password 123456 --split-by name --num-mappers 2 --target-dir /sqoop/staff --delete-target-dir --columns id,name --fields-terminated-by ' ' --where 'id > 2' --table staff

     2)导入到hive中;

    先导入hdfs家目录,再挪到hive仓库
    --create-hive-table 表不存在会创建,存在会报错
    --hive-database default默认库 
    [kris@hadoop101 sqoop]$ bin/sqoop import --connect jdbc:mysql://hadoop101:3306/company --username root --password 123456 --table staff --create-hive-table --hive-database default --hive-import --hive-table staff --hive-overwrite --delete-target-dir

     3)导入到Hbase

    导入Hbase中
    直接用的mapreduce程序;bin/sqoop import --help
    --hbase-create-table 这个版本不可用,需手动创建这个表;导入数据时需先创建hbase表
    
    [kris@hadoop101 sqoop]$ bin/sqoop import --connect jdbc:mysql://hadoop101:3306/company --username root --password 123456 --table staff --column-family info --hbase-row-key id --hbase-table staff
    hbase(main):032:0> scan 'staff'
    ROW                             COLUMN+CELL                                                                               
     1                              column=info:name, timestamp=1552300224655, value=kris                                     
     1                              column=info:sex, timestamp=1552300224655, value=male                                      
     2                              column=info:name, timestamp=1552300228673, value=alex                                     
     2                              column=info:sex, timestamp=1552300228673, value=female                                    
     3                              column=info:name, timestamp=1552300210541, value=alex                                     
     3                              column=info:sex, timestamp=1552300210541, value=female  
    
    hbase中数据无法导入mysql; hdfs中、hive中可以
    
    使用MapReduce将hdfs数据导入到HBase;在linux中创建.tsv格式文件,上传到HDFS-->创建hbase表-->执行MapReduce到HBase的fruit表中;importtsv
    $ /opt/module/hadoop-2.7.2/bin/yarn jar lib/hbase-server-1.3.1.jar importtsv 
    -Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:color fruit 
    hdfs://hadoop102:9000/input_fruit

    导出数据

    在Sqoop中,“导出”概念指:从大数据集群(HDFS,HIVE,HBASE)向非大数据集群(RDBMS)中传输数据,叫做:导出,即使用export关键字。

    导出到mysql

    导出到mysql:
    [kris@hadoop101 sqoop]$ bin/sqoop export --connect jdbc:mysql://hadoop101:3306/company --username root --password 123456 --table staff --export-dir /sqoop/staff
    
    解析第一列是int类型而它是字符串
    can't parse input data '2    kris';如果之前的数据指定了	,要指定分隔符即 --input-fields-terminated-by '	';
    建表时主键是唯一的,插入同样的数据,会主键冲突了,应该先清空mysql中的表;
    导出数据的表字段和mysql中的字段要一致,id, name, sex;

    脚本打包

    使用opt格式的文件打包sqoop命令,然后执行

    [kris@hadoop101 sqoop]$ vim sqoop.opt 
    import 
    --connect 
    jdbc:mysql://hadoop101:3306/company 
    --username 
    root 
    --password 
    123456 
    --split-by 
    name 
    --num-mappers 
    2 
    --target-dir 
    /sqoop/staff 
    --delete-target-dir 
    --columns 
    id,name 
    --fields-terminated-by 
    '	'
                                                                             
    [kris@hadoop101 sqoop]$ bin/sqoop --options-file sqoop.opt --table staff  ##--table staff要写最后边;

    Hadoop的运行异常

     

    任务卡死,查看日志

     

    出现此故障的原因应该是,在分配的内存和CPU资源太少,不能满足Hadoop运行所需的资源需求。

    解决:在yarn-site.xml中加入如下代码

    <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>2048</value>
    </property>
    <property>
          <name>yarn.scheduler.minimum-allocation-mb</name>
          <value>2048</value>
    </property>
    <property>
        <name>yarn.nodemanager.vmem-pmem-ratio</name>
        <value>2.1</value>
    </property>
    <property>
        <name>mapred.child.java.opts</name>
        <value>-Xmx1024m</value>
    </property>

    yarn分配的资源默认是1G;分配的资源小了有可能会卡死,内存加大一点即可;
    import --connect
    k
    v

  • 相关阅读:
    Linux
    python 鸢尾花数据集报表展示
    python 词云
    毕业设计回顾
    editor.md
    杂记
    垃圾回收器
    杂记
    随笔
    杂记
  • 原文地址:https://www.cnblogs.com/shengyang17/p/10512510.html
Copyright © 2011-2022 走看看