sqoop
1. sqoop概述
Sqoop主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
Latest stable release is 1.4.7 (download, documentation). Latest cut of Sqoop2 is 1.99.7 (download, documentation). 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
在Sqoop中,“导入”概念指:从非大数据集群(RDBMS)向大数据集群(HDFS,HIVE,HBASE)中传输数据,叫做:导入,即使用import关键字。
|
|||||||||||||||||||||||||||||||||||||||||||||||||
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
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
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
增量导入
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