当前位置:   article > 正文

第一章 Sqoop专题之常见面试题_sqoop面试题

sqoop面试题

1、Sqoop是什么

Sqoop本质上是一块使用MR程序进行数据迁移的工具;

公司使用的是1.4.6;

2、hcatalog的作用

hcatalog是hive对外的一个统一存储格式的接口,使用hcatalog对接到hive的数据不需要担心数据在hive中的存储格式和存储位置,注意版本为1.4.6(sqoop在1.4.4之后的版本集成了Hcatalog);

3、使用Sqoop导入数据到Hive中

3.1、第一种方式:Sqoop + Hcatalog
  • 使用建表方式增量导入hive orc;
    • 如果已经使用hcatalog,则hive-import系列的值全都不能用,否则报错;
    • hcatalog-storage-stanze,存储格式和压缩格式会自动对齐hive表的配置;
sqoop import
#1、指定关系数据库的jdbc
--connect jdbc:mysql://127.0.0.1:3306/test    #指定mysql数据库test
--username  you_user_name
--passwarod 123456

#2、指定mysql表
--table table_name
--driver com.mysql.jdbc.Driver
--query “select a”

#3、创建hive表,如果表已存在,必须去掉
--create-hcatalog-table
--hcatalog-storage-stanza 'stored as orc tbproperties("orc.compress"="gzip")'

#4、指定导入数据的hive表
--hcatalog-database test
--hcatalog-table table_name

#5、指定导入数据的hive表分区 - key和value必须同时存在,相当于静态分区
--hcatalog-partition-keys year,month,day
--hcatalog-partition-values 2021,12,9

#6、以自增长键作增量导入
--incremental append
--check-column order_id
--last-values 0           

#6、以时间戳抽增量导入
--increatmental lastmodified
--check-column time
--last-value "2014-11-09 21:00:00"

#7、指定mysql数据为空值时用什么符号存储
--null-string '\\N'
--null-not-string '\\N'

#8、设置无视字符串中的分隔符
--hive-drop-import-delims

#9、并行导入需要指定分片字段,尽量指定int型
--split-by key
-m 3
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
3.2、第二种方式: Sqoop + HDFS + Hive
  • 思路
步骤:
	①将RDBMS中的数据增量导入到HDFS上的临时目录下;
	②将HDFS上临时目录下的文件剪切到Hive表相应的分区目录下;

注意点:
	导入时,若不使用临时目录,直接导入到相应的HIVE分区目录下,是不可以的,分区目录下的值不会自动装载到表中(注意:可以直接导入到hive非分区目录下,可以感知到,是可以成功);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

(1)将mysql数据通过sqoop导入到HDFS中

  • 将mysql表中历史数据及刚产生的数据导入到hdfs临时目录下了(每张hive表对应一张临时目录);
sqoop job --create bap_us_order --import\
#1、指定mysql连接
--connect jdbc:mysql://master:3306/....\
#2、指定mysql的jdbc
--driver com.mysql.jdbc.Driver \
--username root \
#指定密码文件
--passward-file hdfs:///password.file \
--table uesr_order \
#3、指定导入的临时目录
--target-dir  /mtbap/ods_tmp_ods_user_order/ \
#4、指定字段之间的分隔符
--fields-terminated-by '\001' \
#5、指定增量导入方式
--check-columnn order_id \
--increamental append \
--last-value 0 \

#上述语句是创建了一个增量导入的job,带到运行时,只需要执行job即可;
sqoop job --exec bap_us_order
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

(2)load data statments,将临时目录下的数据into到特定分区表对应的目录下

args=$1
dt=
if[${#args} == 0]
then
	dt=`data-d "1days ago" "+%Y%m%d"1`
else
	dt=$1
fi

echo "run hive load data"
hive --database databse_name -e "load data inpath '/mtbap/ods_tmp_ods_user_order/' into table ods_tmp_ods_user_order partition(dt=$(dt))"
echo "run hive load data end"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

4、sqoop导出hive数据到mysql中

介绍(前提:要从hive表中将数据导出到rdbms中);
	①待导出的源是hive表所对应的hdfs上特定的目录,该目录下存储有hive表最终保存的数据;
	②可以实现的条件:上述hive表对应的hdfs上的目录下的文件格式是textfile(普通的文本文件)
		真实生产环境下此情形比较少,一般都是压缩后的数据,为了节省hdfs的空间
	③不能实现的场合:上述hive表对应的hdfs上的目录下的文件格式不是textfile,是压缩之后的文件,如:orcFile,或者是sequenceFile,直接导出会报错;
		此种情形下,只能选用hive hcatalog导出方式实现;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

(1)hive hcatalog导出方式,hive表存储格式不是textfile格式

sqoop export \
#1、指定hive表中数据
--hcatalog-database temp \
--hcatalog-table js_pianyuan_orc \
--hcatalog-partition-keys curdate \

#2、指定JDBC连接及mysql导出表
--connect jdbc:mysql://ip:3306/test \
--username username \
--password passwd \
--table js_pianyuan

#3、maptask的并行度
--m 10 \

#4、设置空值转义,否则会报错
--input-null-string '\\N'
--input-null-non-string '\\N'

#5、设置更新的方式导出数据(key不存在时允许新增)
--update-key id
--update-mode allowinsert

#导出时默认使用4个maptask任务
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

5、Sqoop常用参数

sqoop import \
--connect \
--username \
--passward \
--target-dir \
--delete-target-dir \        #可选,删除目录
--num-mappers \              #指定并行度
--filds-terminated-by \      #指定分隔符
--query "$2" and $CONDITIONS;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/745627
推荐阅读
相关标签
  

闽ICP备14008679号