Fork me on GitHub

sqoop

1. 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.

https://www.jianshu.com/p/87b46ff2bc88?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

原理

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

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

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

2. 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/3、 mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha sqoop
4、 修改配置文件
  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/
5、 验证Sqoop   ## 我们可以通过某一个command来验证sqoop配置是否正确:     $ bin/sqoop help

  ## 查看mysql中的所有数据库     $ bin/sqoop list
-databases \     --connect jdbc:mysql://hadoop101:3306 \     --username root --password 123456   ## 查看mysql某个库中的所有表     bin/sqoop list-tables \     --connect jdbc:mysql://hadoop101:3306/gmall \     --username root --password 123456

 

配置环境变量 在~/.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

 

3. 导入数据

https://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html 

sqoop import  \
--connect jdbc:mysql://hadoop101:3306/easylife?tinyInt1isBit=false\&characterEncoding=UTF-8 \
--username root \
--password root \
--query "select id,order_code,broker_id,broker_name,customer_id,customer_phone,customer_name,customer_id_num,customer_id_type,dev_id,dev_name,type,developer_menbership_type,developer_menber_fee,developer_enterprise_fee,produce_id,create_time,order_time,cell_id,cell_name,order_status,project_id,latest_follow_time,house_price,actual_payment,broker_customer_id,check_status,city,city_id,visible_batch_settle,visible_batch_return,house_area,merge_id,confirm,brokerage_confirm_status,crm_flag,clean,update_time,update_time_dw,partner_commission_rule,use_team_type,use_channel_id,use_team_id,refund_version from order where update_time_dw >= '2020-09-15 00:00:00' and \$CONDITIONS" \
--fields-terminated-by \\001 \
--lines-terminated-by \\n \
--hive-database ods \
--hive-table source_order \
--target-dir /tmp/hive/order_2020-09-16 \
--null-string '\\N' \
--null-non-string '\\N' \
--hive-import \
--hive-overwrite \
--hive-drop-import-delims \
--delete-target-dir \
--bindir /home/kris/apps/dw/tmp/sqoop/import/ods_order \
--outdir /home/kris/apps/dw/tmp/sqoop/import/ods_order \
-m 1
View Code

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

 

ArgumentDescription
--append Append data to an existing dataset in HDFS
--as-avrodatafile Imports data to Avro Data Files
--as-sequencefile Imports data to SequenceFiles
--as-textfile Imports data as plain text (default)
--as-parquetfile Imports data to Parquet Files
--boundary-query <statement> Boundary query to use for creating splits
--columns <col,col,col…> Columns to import from table
--delete-target-dir Delete the import target directory if it exists
--direct Use direct connector if exists for the database
--fetch-size <n> Number of entries to read from database at once.
--inline-lob-limit <n> Set the maximum size for an inline LOB
-m,--num-mappers <n> Use n map tasks to import in parallel
-e,--query <statement> Import the results of statement.
--split-by <column-name> Column of the table used to split work units. Cannot be used with --autoreset-to-one-mapper option.
--autoreset-to-one-mapper Import should use one mapper if a table has no primary key and no split-by column is provided. Cannot be used with --split-by <col> option.
--table <table-name> Table to read
--target-dir <dir> HDFS destination dir
--warehouse-dir <dir> HDFS parent for table destination
--where <where clause> WHERE clause to use during import
-z,--compress Enable compression
--compression-codec <c> Use Hadoop codec (default gzip)
--null-string <null-string> The string to be written for a null value for string columns
--null-non-string <null-string> The string to be written for a null value for non-string columns
 
   

 

 

1)导入到HDFS

1)按名字切片,指定路径(如果路径存在就删除)
--target-dir如果不指定目录,默认导入的是家目录/user/kris/表名;mysql建表时指定了主键,就按主键分片,可--split-by指定切分字段;
[kris@hadoop101 sqoop]$ bin/sqoop import \
--connect jdbc:mysql://hadoop101:3306/company \
--username root \
--password 123456 \
--table staff \
--split-by name \
--num-mappers 3 \
--target-dir /sqoop/staff \
--delete-target-dir
  默认是按,分割的

查看hdfs上文件,按照 --split-by 分割字段 + --num-mappers 进行划分, 上边是按name分成3个文件。
hadoop fs -cat /sqoop/staff/part-m-00000
  2,alex,male
  7,alex,female
hadoop fs -cat /sqoop/staff/part-m-00001
  1,kris,male
hadoop fs -cat /sqoop/staff/part-m-00002
  3,mm,female
View Code
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 '\t' \

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 '\t' \ 
--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 '\t' \
--where 'id > 2' \
--table staff
View Code

 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
View Code

 

 

 

 https://my.oschina.net/u/4370928/blog/3410564

 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
View Code

增量导入

 

 

4. 导出数据

在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';如果之前的数据指定了\t,要指定分隔符即 --input-fields-terminated-by '\t';
建表时主键是唯一的,插入同样的数据,会主键冲突了,应该先清空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 
'\t'
                                                                         
[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

 

posted @ 2019-03-12 08:28  kris12  阅读(535)  评论(0编辑  收藏  举报
levels of contents