当前位置:   article > 正文

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

sqoop导入到mysql中

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

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

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

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

  1. linux>cp sqoop-env-template.sh  sqoop-env.sh 
  2. linux>vi sqoop-env.sh 
  3. export HADOOP_COMMON_HOME=/opt/install/hadoop
  4. export HADOOP_MAPRED_HOME=/opt/install/hadoop
  5. export HIVE_HOME=/opt/install/hive
  6. export ZOOKEEPER_HOME=/opt/install/zookeeper
  7. export ZOOCFGDIR=/opt/install/zookeeper
  8. export HBASE_HOME=/opt/install/hbase
  9. export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*

在sqoop的目录下执行测试命令:
#列出mysql中所有的库、表
 \ 表示换行不结束

  1. #显示出mysql所有库
  2. linux>bin/sqoop list-databases \
  3. --connect jdbc:mysql://192.168.58.203:3306 \
  4. --username root \
  5. --password 123
  6. #显示出mysql指定库库下的所有表
  7. linux>bin/sqoop list-tables \
  8. --connect jdbc:mysql://192.168.58.203:3306/test \
  9. --username root \
  10. --password 123

示例 mysql--->hdfs

  1. linux>bin/sqoop import \ 导入
  2. --connect jdbc:mysql://192.168.58.203:3306/数据库名 \ 连接数据库
  3. --username 数据库用户名 \
  4. --password 数据库用户密码 \
  5. --table 表名 \ 导出数据库哪张表
  6. --target-dir /sqoopdata/xxxx \ 导入到哪一个HDFS目录
  7. --fields-terminated-by ',' \ 字符串分割
  8. --delete-target-dir \ HDFS地址存在删除 --一般不删
  9. --split-by FieldName \ 按指定字段名拆分,必须是表内有的字段否则报错
  10. -m 1 生成文件数量
  11. #并发的map数量1,如果不设置默认启动4个map task执行数据导入,则需要指定一个列来作为划分map task任务的依据
  12. #split-by 根据不同的参数类型有不同的切分方法,如int型,Sqoop会取最大和最小split-by字段值,然后根据传入的num-mappers来 确定划分几个区域。比如select max(split_by),min(split-by) from得到的max(split-by)和min(split-by)分别为10001,而num-mappers(-m)为2的话,则会分成两个区域 (1,500)和(501-1000),同时也会分成2个sql给2个map去进行导入操作,分别为select XXX from table where split-by>=1 and split-by<500select XXX from table where split-by>=501 and split-by<=1000.最后每个map各自获取各自SQL中的数据进行导入工作。
  13. linux>bin/sqoop import \
  14. --connect jdbc:mysql://192.168.58.203:3306/databasesname \
  15. --username root \
  16. --password 123 \
  17. --table tablename \
  18. --target-dir /sqoopdata/dirname \
  19. --fields-terminated-by ',' \
  20. --delete-target-dir \
  21. -m 1
  22. #查看数据
  23. linux>hdfs hdfs dfs -ls /sqoopdata/
  24. linux>hdfs dfs -cat /sqoopdata/dirname/part-m-00000
  25. linux>bin/sqoop import \
  26. --connect jdbc:mysql://192.168.58.203:3306/databasesname \
  27. --username root \
  28. --password 123 \
  29. --table tablename \
  30. --target-dir /sqoopdata/dirname \
  31. --fields-terminated-by ',' \
  32. --delete-target-dir \
  33. --split-by FieldName \
  34. -m 2
  35. #查看统计数据
  36. linux>hdfs dfs -cat /sqoopdata/dirname/part-m-00000 | wc -l
  37. linux>hdfs dfs -cat /sqoopdata/dirname/part-m-00001 | wc -l

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

  1. --as-avrodatafile 
  2. --as-parquetfile  
  3. --as-sequencefile 
  4. --as-textfile     

如果需要压缩

  1. --compress
  2. --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")

  1. --null-non-string '\\N'
  2. --null-string '\\N'
  3. 例:linux>bin/sqoop import -Dorg.apache.sqoop.splitter.allow_text_splitter=true \
  4. --connect jdbc:mysql://192.168.58.203:3306/databasesname \
  5. --username root \
  6. --password 123 \
  7. --table tablename \
  8. --target-dir /sqoopdata/dirname  \
  9. --delete-target-dir \
  10. --fields-terminated-by ',' \
  11. --null-non-string '\\N' \
  12. --null-string '\\N' \
  13. --split-by emp_no \
  14. -m 2 
  15. 注:注意表的字段类型null-non-string和null-string是对字段类型位string
  16. #验证
  17. hive>create table test(
  18. emp_no string,
  19. name string,
  20. )
  21. row format delimited
  22. fields terminated by ',';
  23. hive>load data inpath '/sqoopdata/test/part-m-00000' into table test;
  24. hive>select * from test where name is null;

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

  1. linux>bin/sqoop import -Dorg.apache.sqoop.splitter.allow_text_splitter=true \
  2. --connect jdbc:mysql://192.168.58.203:3306/databasesname \
  3. --username root \
  4. --password 123 \
  5. --table tablename \
  6. --target-dir /sqoopdata/dirname  \
  7. --delete-target-dir \
  8. --fields-terminated-by ',' \
  9. --split-by FieldName \
  10. -m 2 

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

  1. linux>bin/sqoop import \
  2. --connect jdbc:mysql://192.168.58.203:3306/databasesname \
  3. --username root \
  4. --password 123 \
  5. --table tablename \
  6. --hive-import \ (插入数据到hive当中,使用hive的默认分隔符)
  7. --hive-table hivedatabasesname.hivetablename \ (设置到hive当中的表名)
  8. --delete-target-dir \
  9. --as-textfile \ (指定文件类型)
  10. --fields-terminated-by ',' \
  11. --hive-overwrite \ (重写插入覆盖)
  12. -m 1

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

linux>cp hive-site.xml  /opt/install/sqoop/conf/

条件导入: --where

  1. mysql --> hive(hive表自动创建)
  2. linux>bin/sqoop import \
  3. --connect jdbc:mysql://192.168.58.203:3306/mysql库名 \
  4. --username root \
  5. --password 123 \
  6. --table 表名 \
  7. --hive-import \
  8. --hive-table hive库名.hive表名 \
  9. --delete-target-dir \
  10. --as-textfile \
  11. --fields-terminated-by ',' \
  12. --compress \
  13. --compression-codec gzip \
  14. --split-by 字段 \
  15. --null-string '\\N' \
  16. --null-non-string '\\N' \
  17. --hive-overwrite \
  18. --where "字段='条件值'" \
  19. -m 2

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

  1. mysql --> hive(hive表自动创建)
  2. linux>bin/sqoop import \
  3. --connect jdbc:mysql://192.168.58.203:3306/mysql库名 \
  4. --username root \
  5. --password 123 \
  6. --table 表名 \
  7. --hive-import \
  8. --hive-table hive库名.hive表名 \
  9. --delete-target-dir \
  10. --as-textfile \
  11. --fields-terminated-by ',' \
  12. --compress \
  13. --compression-codec gzip \
  14. --split-by 字段 \
  15. --null-string '\\N' \
  16. --null-non-string '\\N' \
  17. --hive-overwrite \
  18. --where "字段='条件值'" \
  19. --columns "字段1,字段2,字段3" \
  20. -m 2

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

  1. mysql --> hive(hive表自动创建)
  2. linux>bin/sqoop import \
  3. --connect jdbc:mysql://192.168.58.203:3306/mysql库名 \
  4. --username root \
  5. --password 123 \
  6. --hive-import \
  7. --hive-table hive库名.hive表名 \
  8. --as-textfile \
  9. --fields-terminated-by ',' \
  10. --compress \
  11. --compression-codec gzip \
  12. --split-by 字段名 \
  13. --null-string '\\N' \
  14. --null-non-string '\\N' \
  15. --hive-overwrite \
  16. --query "select 字段1,字段2,字段3 from 表名 where 字段3='条件值' and \$CONDITIONS" \
  17. --target-dir '/sqoopdata/tmp' \
  18. -m 2

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

  1. mysql --> hive(hive表自动创建)
  2. linux>bin/sqoop import \
  3. --connect jdbc:mysql://192.168.58.203:3306/mysql库名 \
  4. --username root \
  5. --password 12345 \
  6. --hive-import \
  7. --hive-table hive库名.hive表名 \
  8. --as-textfile \
  9. --fields-terminated-by ',' \
  10. --compress   \
  11. --compression-codec gzip \
  12. --split-by e.字段名 \
  13. --null-string '\\N' \
  14. --null-non-string '\\N' \
  15. --hive-overwrite  \
  16. --query 'select e.字段1,d.字段2,e.字段2,e.字段3,e.字段4 from 表A e join 表B d on e.字段1=d.字段1 where $CONDITIONS' \
  17. --target-dir '/sqoopdata/tmp' \
  18. -m 2

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

  1. hdfs--->mysql (mysql表需要提前手动创建)
  2. linux>bin/sqoop export \
  3. --connect jdbc:mysql://192.168.58.203:3306/mysql库名 \
  4. --username root \
  5. --password 123 \
  6. --table 表名 \
  7. --input-fields-terminated-by ',' \
  8. --export-dir '/sqoopdata/有表数据的目录' \
  9. --batch
  10. hdfs--->mysql(mysql表需要提前手动创建)
  11. linux>bin/sqoop export \
  12. --connect jdbc:mysql://192.168.58.203:3306/mysql库名 \
  13. --username root \
  14. --password 123 \
  15. --table 表名 \
  16. --export-dir '/sqoopdata/test' \
  17. --update-mode allowinsert \
  18. --update-key id \
  19. --batch
  20. # --update-mode 如果选择updateonly,只会对mysql中已存在的id数据进行更新,不存在的id数据不会插入了
  21. # --update-mode 如果选择allowinsert,既会更新已存在id数据,也会插入新的id数据

sqoop增量导入
mysql --> hive

  1. mysql --> hive(hive表自动创建)
  2. linux>bin/sqoop import \
  3. --connect jdbc:mysql://192.168.58.203:3306/mysql库名 \
  4. --username root \
  5. --password 123 \
  6. --table 表名 \
  7. --hive-import \
  8. --hive-table hive库名.hive表名 \
  9. --split-by 字段1 \
  10. --incremental append \ #增量模式append(追加)
  11. --check-column 字段1 \ #检查列
  12. --last-value 编号值 \ #最后一个值 例:last-value 599999
  13. -m 2
  14. #另外一种
  15. linux>bin/sqoop import \
  16. --connect jdbc:mysql://192.168.58.203:3306/mysql库名 \
  17. --username root \
  18. --password 123 \
  19. --table 表名 \
  20. --hive-import \
  21. -m 1 \
  22. --hive-table hive库名.hive表名 \
  23. --incremental lastmodified \ #增量模式lastmodified(上次修改的)
  24. --check-column 时间字段 \ #检查列
  25. --last-value "2021-12-31 23:59:59" #最后一个值
  26. mysql --> hdfs
  27. linux>bin/sqoop import \
  28. --connect jdbc:mysql://192.168.58.203:3306/mysql库名 \
  29. --username root \
  30. --password 123 \
  31. --table 表名 \
  32. --target-dir '/sqoopdata/目录名' \
  33. --incremental lastmodified \
  34. --check-column 时间字段 \
  35. --last-value '时间字段值' \
  36. --fields-terminated-by ',' \
  37. -m 1

mysql  ---> hbase

  1. mysql ---> hbase
  2. linux>bin/sqoop import \
  3. --connect jdbc:mysql://192.168.58.203:3306/mysql库名 \
  4. --username root \
  5. --password 123 \
  6. --table 表名 \
  7. --hbase-table hbase表名 \
  8. --column-family base \
  9. --hbase-create-table \
  10. --hbase-row-key 字段1

生成jar包到linux本地

  1. linux>bin/sqoop codegen \
  2. --connect jdbc:mysql://192.168.58.203:3306/mysql库名 \
  3. --username root \
  4. --password 123 \
  5. --table 表名 \
  6. --bindir /root/test \
  7. --class-name jarname \
  8. --fields-terminated-by ","
  9. #结果,会在本地/root/test目录下产生jar包(jarname )

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/693361
推荐阅读
相关标签
  

闽ICP备14008679号