Apache Sqoop

Apache Sqoop,第1张

Apache Sqoop 1、Sqoop参数

 .../bin/sqoop => sqoop

sqoop import 
--connect "jdbc:mysql://${mysql_host_dbname}:${mysql_port_dbname}/${mysql_db_dbname}?zeroDateTimeBehavior=convertToNull&dontTrackOpenResources=true&tinyInt1isBit=false&defaultFetchSize=10000&useCursorFetch=true&autoReconnect=true&failOverReadonly=false" 
--driver com.mysql.jdbc.Driver 
--username ${mysql_user_dbname} 
--password ${mysql_password_dbname} 
--table ${mysql_t_tablename} 
--columns '...' 
--hcatalog-database ${hive_db_companyname_ods} 
--hcatalog-table ${hive_t_ods_schemaname_tablename} 
--hcatalog-partition-keys statdate 
--hcatalog-partition-values ${statdate} 
-m 1 
-- --where 'id<1000000' 
-- -split-by id
2、Sqoop导入导出Null存储一致性问题

        Hive中的Null在底层是以“N”来存储,而MySQL中的Null在底层就是Null,为了保证数据两端的一致性。在导出数据时采用--input-null-string和--input-null-non-string两个参数。导入数据时采用--null-string和--null-non-string。

3、Sqoop数据导出一致性问题

场景1:如Sqoop在导出到Mysql时,使用4个Map任务,过程中有2个任务失败,那此时MySQL中存储了另外两个Map任务导入的数据,此时需求方正好看到了这个报表数据。而开发工程师发现任务失败后,会调试问题并最终将全部数据正确的导入MySQL,那后面需求方再次看报表数据,发现本次看到的数据与之前的不一致,这在生产环境是不允许的。

官网:Sqoop User Guide (v1.4.6)

Since Sqoop breaks down export process into multiple transactions, it is possible that a failed export job may result in partial data being committed to the database. This can further lead to subsequent jobs failing due to insert collisions in some cases, or lead to duplicated data in others. You can overcome this problem by specifying a staging table via the --staging-table option which acts as an auxiliary table that is used to stage exported data. The staged data is finally moved to the destination table in a single transaction.

–staging-table方式

        使用—staging-table选项,将hdfs中的数据先导入到临时表中,当hdfs中的数据导出成功后,临时表中的数据在一个事务中导出到目标表中。为了能够使用staging这个选项,staging表在运行任务前或者是空的,要不就使用—clear-staging-table配置,如果staging表中有数据,并且使用了—clear-staging-table选项,sqoop执行导出任务前会删除staging表中所有的数据。
注意:–direct导入时staging方式是不可用的,使用了—update-key选项时staging方式也不能用。

sqoop export 
--connect "jdbc:mysql://${mysql_host_dbname}:${mysql_port_dbname}/${mysql_db_dbname}?useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false" 
--driver com.mysql.jdbc.Driver 
--username ${mysql_user_dbname} 
--password ${mysql_password_dbname} 
--table ${mysql_t_tablename} 
--columns '...' 
--hcatalog-database ${hive_db_companyname_dm} 
--hcatalog-table ${hive_t_dm_schemaname_tablename} 
--hcatalog-partition-keys statdate 
--hcatalog-partition-values ${statdate} 
-m 1
-- -- staging-table ${mysql_t_tmp_tablename} 
-- -- clear-staging-table
-- -- input-null-string 'N'
4、Sqoop底层运行的任务是什么

只有Map阶段,没有Reduce阶段的任务。默认是4个MapTask。

5、Sqoop数据导出的时候一次执行多长时间

每天凌晨00:00开始执行,Sqoop任务一般情况5-30分钟的都有,取决于数据量。

6、Sqoop在导入数据的时候数据倾斜

sqoop 抽数的并行化主要涉及到两个参数

split-by:按照自增主键来切分表的工作单元。

num-mappers:启动N个map来并行导入数据,默认4个;

7、Sqoop数据导出Parquet(项目中遇到的问题)

Ads层数据用Sqoop往MySql中导入数据的时候,(可能,目前没有遇到)如果用了orc(Parquet)不能导入,需转化成text格式

(1)创建临时表,把Parquet中表数据导入到临时表,把临时表导出到目标表用于可视化

(2)ads层建表的时候就不要建Parquet表

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5480414.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存