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中,“导入”概念指:从非大数据集群(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 '\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


复制代码

 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';如果之前的数据指定了\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 @ 2020-02-19 11:39  啊啊啊啊鹏  阅读(195)  评论(0编辑  收藏  举报
1 2