sqoop搭建与使用,sqoop条件导入、增量导入,mysql至hdfs、hive、hbase,hdfs至mysql,生成jar包到本地

sqoop -> 工具 主要负责 数据库(例:mysql)

sqoop应用场景:
数仓:埋点数据,业务数据
业务数据(业务系统产生的数据 ),导入的数仓
数仓的ADS层的数据,hive、导入到 mysql中

官网 : https://sqoop.apache.org/#
attic.apache.org/projects/sqoop.html
下载:archive.apache.org/dist/sqoop
sqoop.apache.org/#

官网语法:sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html#_literal_sqoop_list_databases_literal

命令解析:
https://www.cnblogs.com/LIAOBO/p/13667044.html

linux>tar -xf sqoop.xxx.tar.gz
linux>mv sqoop-xxx  /opt/install/sqoop
linux>cd  /opt/install/sqoop

sqoop 配置:
在sqoop.env.sh中增加:

linux>cp sqoop-env-template.sh  sqoop-env.sh 

linux>vi sqoop-env.sh 
export HADOOP_COMMON_HOME=/opt/install/hadoop
export HADOOP_MAPRED_HOME=/opt/install/hadoop
export HIVE_HOME=/opt/install/hive
export ZOOKEEPER_HOME=/opt/install/zookeeper
export ZOOCFGDIR=/opt/install/zookeeper
export HBASE_HOME=/opt/install/hbase
export  HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*

在sqoop的目录下执行测试命令:

列出mysql中所有的库、表

\ 表示换行不结束

#显示出mysql所有库
linux>bin/sqoop list-databases \
--connect jdbc:mysql://192.168.58.203:3306 \
--username root \
--password 123
#显示出mysql指定库库下的所有表
linux>bin/sqoop list-tables \
--connect jdbc:mysql://192.168.58.203:3306/test \
--username root \
--password 123

示例 mysql—>hdfs

linux>bin/sqoop import \ 导入
--connect jdbc:mysql://192.168.58.203:3306/数据库名 \ 连接数据库
--username 数据库用户名 \
--password 数据库用户密码 \
--table 表名 \   导出数据库哪张表
--target-dir /sqoopdata/xxxx  \ 导入到哪一个HDFS目录
--fields-terminated-by ',' \  字符串分割
--delete-target-dir \ HDFS地址存在删除 --一般不删
--split-by FieldName \ 按指定字段名拆分,必须是表内有的字段否则报错
-m 1       生成文件数量
#并发的map数量1,如果不设置默认启动4个map task执行数据导入,则需要指定一个列来作为划分map task任务的依据
#split-by &#x6839;&#x636E;&#x4E0D;&#x540C;&#x7684;&#x53C2;&#x6570;&#x7C7B;&#x578B;&#x6709;&#x4E0D;&#x540C;&#x7684;&#x5207;&#x5206;&#x65B9;&#x6CD5;&#xFF0C;&#x5982;int&#x578B;&#xFF0C;Sqoop&#x4F1A;&#x53D6;&#x6700;&#x5927;&#x548C;&#x6700;&#x5C0F;split-by&#x5B57;&#x6BB5;&#x503C;&#xFF0C;&#x7136;&#x540E;&#x6839;&#x636E;&#x4F20;&#x5165;&#x7684;num-mappers&#x6765; &#x786E;&#x5B9A;&#x5212;&#x5206;&#x51E0;&#x4E2A;&#x533A;&#x57DF;&#x3002;&#x6BD4;&#x5982;select max(split_by),min(split-by) from&#x5F97;&#x5230;&#x7684;max(split-by)&#x548C;min(split-by)&#x5206;&#x522B;&#x4E3A;1000&#x548C;1&#xFF0C;&#x800C;num-mappers&#xFF08;-m&#xFF09;&#x4E3A;2&#x7684;&#x8BDD;&#xFF0C;&#x5219;&#x4F1A;&#x5206;&#x6210;&#x4E24;&#x4E2A;&#x533A;&#x57DF; (1,500)&#x548C;(501-1000),&#x540C;&#x65F6;&#x4E5F;&#x4F1A;&#x5206;&#x6210;2&#x4E2A;sql&#x7ED9;2&#x4E2A;map&#x53BB;&#x8FDB;&#x884C;&#x5BFC;&#x5165;&#x64CD;&#x4F5C;&#xFF0C;&#x5206;&#x522B;&#x4E3A;select XXX from table where split-by>=1 and split-by<500和select xxx from table where split-by>=501 and split-by<=1000.最后每个map各自获取各自sql中的数据进行导入工作。 linux>bin/sqoop import \
--connect jdbc:mysql://192.168.58.203:3306/databasesname \
--username root \
--password 123 \
--table tablename \
--target-dir /sqoopdata/dirname  \
--fields-terminated-by ',' \
--delete-target-dir \
-m 1
#&#x67E5;&#x770B;&#x6570;&#x636E;
linux>hdfs  hdfs dfs -ls /sqoopdata/
linux>hdfs dfs -cat /sqoopdata/dirname/part-m-00000

linux>bin/sqoop import \
--connect jdbc:mysql://192.168.58.203:3306/databasesname \
--username root \
--password 123 \
--table tablename \
--target-dir /sqoopdata/dirname  \
--fields-terminated-by ',' \
--delete-target-dir \
--split-by FieldName \
-m 2
#&#x67E5;&#x770B;&#x7EDF;&#x8BA1;&#x6570;&#x636E;
linux>hdfs  dfs -cat /sqoopdata/dirname/part-m-00000  | wc -l
linux>hdfs  dfs -cat /sqoopdata/dirname/part-m-00001  | wc -l</=1000.最后每个map各自获取各自sql中的数据进行导入工作。></500和select>

可以指定要生成的文件的类型

--as-avrodatafile&#xA0;
--as-parquetfile &#xA0;
--as-sequencefile&#xA0;
--as-textfile &#xA0; &#xA0;&#xA0;

如果需要压缩

--compress
--compression-codec gzip

Gzip
优点
压缩解压速度快 , 压缩率高 , hadoop本身支持
处理压缩文件时方便 , 和处理文本一样
大部分linux 系统自带 Gzip 命令 , 使用方便
缺点
不支持切片
使用场景
文件压缩后在130M以内 (一个块大小) , 都可以使用 GZip 压缩(因为Gzip唯一的缺点是不能切片)
总结 : 不需要切片的情况下 可以使用
BZip2
优点
压缩率高(高于Gzip)
可以切片
hadoop自带 使用方便
缺点
压缩解压速度超级慢
使用场景
不要求压缩速率 ,但是对压缩率有要求的情况下 比如备份历史记录 , 备份文件
或者 输出的文件较大 , 处理后的数据需要减少磁盘存储并且以后使用数据的情况较少 (解压 / 压缩的情况较少)
对于单个文件 较大 ,又想压缩减少磁盘空间 , 并且兼容之前的应用程序的情况
总结 : 对于压缩解压速度没有要求的情况下
Lzo
优点
压缩解压速度比较快 , 压缩率也可以
支持切片 是hadoop 比较流行的压缩格式
可以在linux 下安装 lzo命令 使用方便
缺点
压缩率比Gzip低一些
hadoop 本身不支持, 需要自己安装
使用Lzo 格式的文件时需要做一些特殊处理(为了支持 Split 需要建立索引 , 还需要将 InputFormat 指定为Lzo 格式 [特殊]
使用场景
压缩以后还大于 200M 的文件 , 且文件越大 Lzo 的优势越明显
总结 : 压缩后文件还是比较大 需要切片的情况下 推荐使用
Snappy
优点
高压缩解压速度 , 压缩率还可以
缺点
不能切片
压缩率比Gzip小
hadoop本身不支持 需要安装

压缩速率 : Snappy > GZIp > Lzo >BZip2
支持切片 : BZIp2 LZo
压缩率 : BZip2 > GZip > Lzo > Snappy

空值处理
import方向:mysql中的null值,写入hdfs文件时,用什么符号来代替(默认是用的”null”)

--null-non-string   '\\N'
--null-string  '\\N'
&#x4F8B;:linux>bin/sqoop import -Dorg.apache.sqoop.splitter.allow_text_splitter=true \
--connect jdbc:mysql://192.168.58.203:3306/databasesname \
--username root \
--password 123 \
--table tablename \
--target-dir /sqoopdata/dirname &#xA0;\
--delete-target-dir \
--fields-terminated-by ',' \
--null-non-string   '\\N' \
--null-string  '\\N' \
--split-by emp_no \
-m 2&#xA0;
&#x6CE8;&#xFF1A;&#x6CE8;&#x610F;&#x8868;&#x7684;&#x5B57;&#x6BB5;&#x7C7B;&#x578B;null-non-string&#x548C;null-string&#x662F;&#x5BF9;&#x5B57;&#x6BB5;&#x7C7B;&#x578B;&#x4F4D;string&#x7684;

#&#x9A8C;&#x8BC1;
hive>create table test(
emp_no    string,
name      string,

)
row format delimited
fields terminated by ',';
hive>load data inpath '/sqoopdata/test/part-m-00000' into table test;
hive>select * from test where name is null;

如果没有数字主键,也可以使用文本列来作为切分task的参照,但是需要增加一个-D参数,如下:

linux>bin/sqoop import -Dorg.apache.sqoop.splitter.allow_text_splitter=true \
--connect jdbc:mysql://192.168.58.203:3306/databasesname \
--username root \
--password 123 \
--table tablename \
--target-dir /sqoopdata/dirname &#xA0;\
--delete-target-dir \
--fields-terminated-by ',' \
--split-by FieldName \
-m 2&#xA0;

mysql —> hive(hive表自动创建)

linux>bin/sqoop import \
--connect jdbc:mysql://192.168.58.203:3306/databasesname \
--username root \
--password 123 \
--table tablename \
--hive-import \             &#xFF08;&#x63D2;&#x5165;&#x6570;&#x636E;&#x5230;hive&#x5F53;&#x4E2D;&#xFF0C;&#x4F7F;&#x7528;hive&#x7684;&#x9ED8;&#x8BA4;&#x5206;&#x9694;&#x7B26;&#xFF09;
--hive-table hivedatabasesname.hivetablename \  &#xFF08;&#x8BBE;&#x7F6E;&#x5230;hive&#x5F53;&#x4E2D;&#x7684;&#x8868;&#x540D;&#xFF09;
--delete-target-dir \
--as-textfile \             &#xFF08;&#x6307;&#x5B9A;&#x6587;&#x4EF6;&#x7C7B;&#x578B;&#xFF09;
--fields-terminated-by ',' \
--hive-overwrite \          &#xFF08;&#x91CD;&#x5199;&#x63D2;&#x5165;&#x8986;&#x76D6;&#xFF09;
-m 1

如果报错把hive的配置文件拷贝到sqoop的conf下 hive-site.xml

linux>cp hive-site.xml &#xA0;/opt/install/sqoop/conf/

条件导入: –where

mysql --> hive(hive&#x8868;&#x81EA;&#x52A8;&#x521B;&#x5EFA;)
linux>bin/sqoop import \
--connect jdbc:mysql://192.168.58.203:3306/mysql&#x5E93;&#x540D; \
--username root \
--password 123 \
--table &#x8868;&#x540D; \
--hive-import \
--hive-table hive&#x5E93;&#x540D;.hive&#x8868;&#x540D; \
--delete-target-dir \
--as-textfile \
--fields-terminated-by ',' \
--compress   \
--compression-codec gzip \
--split-by &#x5B57;&#x6BB5; \
--null-string '\\N' \
--null-non-string '\\N' \
--hive-overwrite \
--where "&#x5B57;&#x6BB5;='&#x6761;&#x4EF6;&#x503C;'"  \
-m 2

条件导入: –columns 指定要导的字段

mysql --> hive(hive&#x8868;&#x81EA;&#x52A8;&#x521B;&#x5EFA;)
linux>bin/sqoop import \
--connect jdbc:mysql://192.168.58.203:3306/mysql&#x5E93;&#x540D; \
--username root \
--password 123 \
--table &#x8868;&#x540D; \
--hive-import \
--hive-table hive&#x5E93;&#x540D;.hive&#x8868;&#x540D; \
--delete-target-dir \
--as-textfile \
--fields-terminated-by ',' \
--compress   \
--compression-codec gzip \
--split-by &#x5B57;&#x6BB5; \
--null-string '\\N' \
--null-non-string '\\N' \
--hive-overwrite \
--where "&#x5B57;&#x6BB5;='&#x6761;&#x4EF6;&#x503C;'"  \
--columns "&#x5B57;&#x6BB5;1,&#x5B57;&#x6BB5;2,&#x5B57;&#x6BB5;3" \
-m 2

查询导入: –query
query自由查询导入时,sql语句中必须带 $CONDITIONS条件 : where $CONDITIONS ,要么 where id>10 and $CONDITIONS
为什么呢?因为sqoop要将你的sql语句交给多个不同的maptask执行,每个maptask执行sql时肯定要按任务规划加范围条件,
所以就提供了这个$CONDITIONS作为将来拼接条件的占位符
有了–query,就不要有–table了,也不要有–where了,也不要有–columns了

mysql --> hive(hive&#x8868;&#x81EA;&#x52A8;&#x521B;&#x5EFA;)
linux>bin/sqoop import \
--connect jdbc:mysql://192.168.58.203:3306/mysql&#x5E93;&#x540D; \
--username root \
--password 123 \
--hive-import \
--hive-table hive&#x5E93;&#x540D;.hive&#x8868;&#x540D;  \
--as-textfile \
--fields-terminated-by ',' \
--compress   \
--compression-codec gzip \
--split-by &#x5B57;&#x6BB5;&#x540D; \
--null-string '\\N' \
--null-non-string '\\N' \
--hive-overwrite  \
--query "select &#x5B57;&#x6BB5;1,&#x5B57;&#x6BB5;2,&#x5B57;&#x6BB5;3 from &#x8868;&#x540D; where &#x5B57;&#x6BB5;3='&#x6761;&#x4EF6;&#x503C;' and \$CONDITIONS" \
--target-dir '/sqoopdata/tmp'   \
-m 2

–query可以支持复杂查询(包含join、子查询、分组查询)

mysql --> hive(hive&#x8868;&#x81EA;&#x52A8;&#x521B;&#x5EFA;)
linux>bin/sqoop import \
--connect jdbc:mysql://192.168.58.203:3306/mysql&#x5E93;&#x540D; \
--username root \
--password 12345 \
--hive-import \
--hive-table hive&#x5E93;&#x540D;.hive&#x8868;&#x540D; \
--as-textfile \
--fields-terminated-by ',' \
--compress &#xA0; \
--compression-codec gzip \
--split-by e.&#x5B57;&#x6BB5;&#x540D; \
--null-string '\\N' \
--null-non-string '\\N' \
--hive-overwrite &#xA0;\
--query 'select e.&#x5B57;&#x6BB5;1,d.&#x5B57;&#x6BB5;2,e.&#x5B57;&#x6BB5;2,e.&#x5B57;&#x6BB5;3,e.&#x5B57;&#x6BB5;4 from &#x8868;A e join &#x8868;B d on e.&#x5B57;&#x6BB5;1=d.&#x5B57;&#x6BB5;1 where $CONDITIONS' \
--target-dir '/sqoopdata/tmp' \
-m 2

hdfs—>mysql(mysql表需要提前手动创建)
–mysql中要有表,先建表

hdfs--->mysql &#xFF08;mysql&#x8868;&#x9700;&#x8981;&#x63D0;&#x524D;&#x624B;&#x52A8;&#x521B;&#x5EFA;&#xFF09;
linux>bin/sqoop  export \
--connect jdbc:mysql://192.168.58.203:3306/mysql&#x5E93;&#x540D; \
--username root \
--password 123 \
--table &#x8868;&#x540D; \
--input-fields-terminated-by ',' \
--export-dir '/sqoopdata/&#x6709;&#x8868;&#x6570;&#x636E;&#x7684;&#x76EE;&#x5F55;' \
--batch

hdfs--->mysql&#xFF08;mysql&#x8868;&#x9700;&#x8981;&#x63D0;&#x524D;&#x624B;&#x52A8;&#x521B;&#x5EFA;&#xFF09;
linux>bin/sqoop  export \
--connect jdbc:mysql://192.168.58.203:3306/mysql&#x5E93;&#x540D; \
--username root \
--password 123 \
--table &#x8868;&#x540D; \
--export-dir '/sqoopdata/test' \
--update-mode allowinsert  \
--update-key id \
--batch
--update-mode &#x5982;&#x679C;&#x9009;&#x62E9;updateonly&#xFF0C;&#x53EA;&#x4F1A;&#x5BF9;mysql&#x4E2D;&#x5DF2;&#x5B58;&#x5728;&#x7684;id&#x6570;&#x636E;&#x8FDB;&#x884C;&#x66F4;&#x65B0;&#xFF0C;&#x4E0D;&#x5B58;&#x5728;&#x7684;id&#x6570;&#x636E;&#x4E0D;&#x4F1A;&#x63D2;&#x5165;&#x4E86;
--update-mode &#x5982;&#x679C;&#x9009;&#x62E9;allowinsert&#xFF0C;&#x65E2;&#x4F1A;&#x66F4;&#x65B0;&#x5DF2;&#x5B58;&#x5728;id&#x6570;&#x636E;&#xFF0C;&#x4E5F;&#x4F1A;&#x63D2;&#x5165;&#x65B0;&#x7684;id&#x6570;&#x636E;

sqoop增量导入
mysql –> hive

mysql --> hive(hive&#x8868;&#x81EA;&#x52A8;&#x521B;&#x5EFA;)
linux>bin/sqoop import \
--connect jdbc:mysql://192.168.58.203:3306/mysql&#x5E93;&#x540D; \
--username root \
--password 123 \
--table &#x8868;&#x540D; \
--hive-import \
--hive-table hive&#x5E93;&#x540D;.hive&#x8868;&#x540D; \
--split-by &#x5B57;&#x6BB5;1 \
--incremental append \   #&#x589E;&#x91CF;&#x6A21;&#x5F0F;append&#xFF08;&#x8FFD;&#x52A0;&#xFF09;
--check-column &#x5B57;&#x6BB5;1 \   #&#x68C0;&#x67E5;&#x5217;
--last-value &#x7F16;&#x53F7;&#x503C; \    #&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x503C;  &#x4F8B;:last-value  599999
-m 2

#&#x53E6;&#x5916;&#x4E00;&#x79CD;

linux>bin/sqoop import \
--connect jdbc:mysql://192.168.58.203:3306/mysql&#x5E93;&#x540D; \
--username root \
--password 123 \
--table &#x8868;&#x540D; \
--hive-import \
-m 1 \
--hive-table  hive&#x5E93;&#x540D;.hive&#x8868;&#x540D; \
--incremental lastmodified \               #&#x589E;&#x91CF;&#x6A21;&#x5F0F;lastmodified&#xFF08;&#x4E0A;&#x6B21;&#x4FEE;&#x6539;&#x7684;&#xFF09;
--check-column &#x65F6;&#x95F4;&#x5B57;&#x6BB5; \                   #&#x68C0;&#x67E5;&#x5217;
--last-value "2021-12-31 23:59:59"         #&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x503C;

mysql --> hdfs
linux>bin/sqoop import \
--connect jdbc:mysql://192.168.58.203:3306/mysql&#x5E93;&#x540D; \
--username root \
--password 123 \
--table &#x8868;&#x540D; \
--target-dir '/sqoopdata/&#x76EE;&#x5F55;&#x540D;'  \
--incremental lastmodified \
--check-column &#x65F6;&#x95F4;&#x5B57;&#x6BB5; \
--last-value '&#x65F6;&#x95F4;&#x5B57;&#x6BB5;&#x503C;'  \
--fields-terminated-by ',' \
-m 1

mysql —> hbase

mysql  ---> hbase
linux>bin/sqoop import \
--connect jdbc:mysql://192.168.58.203:3306/mysql&#x5E93;&#x540D; \
--username root \
--password 123 \
--table &#x8868;&#x540D;  \
--hbase-table hbase&#x8868;&#x540D; \
--column-family base  \
--hbase-create-table \
--hbase-row-key &#x5B57;&#x6BB5;1

生成jar包到linux本地

linux>bin/sqoop codegen \
--connect jdbc:mysql://192.168.58.203:3306/mysql&#x5E93;&#x540D; \
--username root \
--password 123 \
--table &#x8868;&#x540D;  \
--bindir /root/test \
--class-name jarname \
--fields-terminated-by ","
#&#x7ED3;&#x679C;&#xFF0C;&#x4F1A;&#x5728;&#x672C;&#x5730;/root/test&#x76EE;&#x5F55;&#x4E0B;&#x4EA7;&#x751F;jar&#x5305;&#xFF08;jarname &#xFF09;

Original: https://blog.csdn.net/Mogeko1/article/details/127689103
Author: 房石阳明i
Title: sqoop搭建与使用,sqoop条件导入、增量导入,mysql至hdfs、hive、hbase,hdfs至mysql,生成jar包到本地

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/817163/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球