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

  • 相关阅读:
    《Effective Java 第三版》——第五章 泛型
    线性代数在数据科学中的十个强大应用(一)
    ​知识图谱里的知识存储:neo4j的介绍和使用
    一份从入门到精通NLP的完整指南 | NLPer
    NeurIPS审稿引发吐槽大会,落选者把荒唐意见怼了个遍:“我谢谢你们了”
    知识图谱与机器学习|KG入门 -- Part2 建立知识图谱
    知识图谱与机器学习 | KG入门 -- Part1-b 图深度学习
    ​知识图谱与机器学习 | KG入门 -- Part1 Data Fabric
    使用特定领域的文档构建知识图谱 | 教程
    ICCV 2019|70 篇论文抢先读,含目标检测/自动驾驶/GCN/等(提供PDF下载)
  • 原文地址:https://www.cnblogs.com/shengyang17/p/10512510.html
Copyright © 2011-2022 走看看