使用Sqoop1.4.7将MySQL同步到Hadoop分区表_实践带源码复制可用

本文提供了一个shell脚本示例,展示如何使用Sqoop将MySQL的数据导入到Hadoop的Hive分区表中,脚本会根据MySQL数据类型动态创建Hive表,并按日期进行分区。用户可以指定日期参数,将数据导入对应分区。

Sqoop导入MySQL数据到Hadoop分区表

目标表不需要在Hive中提前创建,Sqoop会根据MySQL数据类型在Hive中创建对应类型的表。

将下列shell脚本命名为sqoop_ads_test_table_1d_to_Hive.sh,直接复制即可,亲测可用.



#!/bin/bash
if [ -n "$1" ] ;then
    load_date=$1
else
    load_date=`date -d "-1 day" +%F`
fi

source_db=test_db
source_table=test_table

# test/prod来控制测试还是生产
env=prod
my_url="jdbc:mysql://10.10.10.10:3306/${source_db}"
username=your_name
password=your_pwd


if [ $env = "prod" ] ;then
my_url="jdbc:mysql://10.10.10.11:3307/${source_db}"
username=your_name
password=your_pwd
fi


query="select id,
              name,
              deleted
FROM ${source_db}.${source_table} WHERE 1=1 "
##### hive配置
hive_db=ods
hive_table=ods_${source_db}__${source_table}_1d
hive_partition=dt
hive_table_dir="/user/hive/warehouse/ods.db/${hive_table}"

echo "`date`----------sqoop import $table_name job start!!!!!"

nohup sqoop import --connect "${my_url}?useUnicode=true&tinyInt1isBit=false&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true" \
--username ${username} --password "${password}" \
--query " ${query} AND \$CONDITIONS" \
--hive-import --hive-database ${hive_db} \
--hive-table ${hive_table} \
--target-dir ${hive_table_dir}/dt=${load_date} \
--delete-target-dir \
--hive-partition-key ${hive_partition} \
--hive-partition-value ${load_date} \
--hive-drop-import-delims --null-string '\\N' \
--null-non-string '\\N' --split-by id \
--m 10 --verbose

echo "`date`----------sqoop import $table_name job end!!!!!"

echo "`date`----------ETL shop_ods data job end!!!!!"

        

然后在虚拟机运行

sh sqoop_ads_test_table_1d_to_Hive.sh '2023-04-02'

后边的日期即将MySQL数据同步到Hive表中的dt=2022-04-02分区中。

最后,感谢大家的观看,有需要改进的地方希望大家在下方留言,关注我,有不懂的技术问题为你解决。

<think>好的,用户现在的问题是Sqoop 1.4.7不支持数字直接作为独立参数的原因以及解决方法,同时他们在Hive 4.0.0环境下执行sqoop.sh脚本时报错“Unrecognized argument: 0”。首先,我需要回顾之前的对话和用户提供的引用内容,确保回答的一致性和准确性。 首先,用户提到在之前的回答中,错误原因之一是参数格式错误,比如使用--m 0或-0这样的参数。现在用户想更深入了解为什么Sqoop 1.4.7不支持数字作为独立参数,以及如何解决这个问题。 根据引用内容,用户已经确认安装了Sqoop 1.4.7,并且配置了相关的环境变量,如HadoopHive的路径。同时,引用中还提到在安装和配置过程中需要处理依赖项,比如JDBC驱动和Hive的JAR包。这可能与当前的问题相关,因为版本兼容性可能导致参数解析的问题。 接下来,我需要解释Sqoop 1.4.7的参数解析机制。Sqoop使用Apache Commons CLI库来处理命令行参数,该库可能不支持数字作为独立的短参数(即单个字母参数)。例如,-0会被解析为参数名为'0',而Sqoop可能没有定义这样的参数,导致报错。同时,Sqoop的参数设计通常需要参数名和值成对出现,比如--num-mappers 1,而不是简写为--m 0,这可能不符合Sqoop的参数规范。 解决方法方面,用户需要检查脚本中的参数,特别是数字是否被错误地用作独立参数。例如,将--m 0改为--num-mappers 1,或者确认参数是否有拼写错误。此外,版本兼容性也是一个因素,Hive 4.0.0可能引入了新的依赖或API变化,导致Sqoop无法正确解析参数。因此,可能需要升级Sqoop或调整Hive的依赖库,确保版本兼容。 用户提供的引用中提到,其他用户在处理类似问题时,通过更新Hive的JAR包到Sqoop的lib目录,并调整环境变量来解决兼容性问题。因此,在解决方案中需要建议用户检查并更新相关依赖,例如将Hive 4.0.0的hive-exec和hive-common的JAR文件复制Sqoop的lib目录,并配置正确的HIVE_HOME路径。 同时,用户可能还需要检查HadoopHive的版本是否与Sqoop 1.4.7兼容。例如,Hadoop 3.x可能需要特定的补丁或配置才能与Sqoop 1.4.7正常工作。此外,启用Sqoop的详细日志(--verbose)可以帮助定位具体的参数解析错误。 最后,确保用户的问题得到全面解答,包括参数格式调整、版本兼容性处理、依赖库更新,以及通过测试命令验证解决方案的有效性。需要以结构化的方式呈现,分步骤说明原因和解决方法,并附上示例代码或命令,方便用户操作。</think>### 原因解析:Sqoop 1.4.7为何不支持数字直接作为独立参数? Sqoop 1.4.7的 **参数解析机制** 基于Apache Commons CLI库,该版本对参数格式有严格限制: 1. **短参数命名规则** - 短参数(单字母参数)仅支持`-a`到`-z`的字母形式,**数字无法作为独立参数标识符**(如`-0`会被解析为非法参数名)[^1] - 参数值必须通过空格或`=`与参数名分隔(例如:`--num-mappers 1`或`--num-mappers=1`) 2. **保留参数冲突** Sqoop内部使用`--`开头的长参数,若脚本中误用数字作为参数值分隔符(如`--m0`),会触发解析器异常 3. **版本兼容性限制** Sqoop 1.4.7默认匹配Hadoop 2.x/Hive 1.x/2.x的参数规范,Hive 4.0.0的元数据接口变化可能导致参数传递逻辑失效 --- ### 解决方案:参数格式修正与版本适配 #### 一、参数格式修正 排查`sqoop.sh`脚本中所有数字参数,重点修复以下场景: 1. **非法短参数示例** ```bash # 错误:-0是无效参数标识符 sqoop import ... -0 # 正确:使用标准参数名(如--num-mappers) sqoop import ... --num-mappers 1 ``` 2. **参数值粘连问题** ```bash # 错误:参数名与值未分隔(--m0被解析为参数名) sqoop import ... --m0 # 正确:显式分隔参数名与值 sqoop import ... --num-mappers 0 # 需注意mapper数必须≥1 ``` 3. **特殊参数兼容性处理** - 若需使用`0`作为参数值(如设置某些标志位),需确认目标参数是否支持数值输入: ```bash # 示例:Hive表分区参数(仅支持字符串) sqoop import ... --hive-partition-key "year=0" # 正确格式 ``` #### 二、Sqoop 1.4.7Hive 4.0.0适配 通过 **依赖库替换** 解决版本冲突: 1. **更新Hive依赖** ```bash # 删除旧版Hive库(避免冲突) rm $SQOOP_HOME/lib/hive-*-2.x.jar # 添加Hive 4.0.0核心库 cp $HIVE_HOME/lib/hive-exec-4.0.0.jar $SQOOP_HOME/lib/ cp $HIVE_HOME/lib/hive-common-4.0.0.jar $SQOOP_HOME/lib/ ``` 2. **配置环境变量** 修改`sqoop-env.sh`,强制指定Hive 4.0.0路径: ```bash export HIVE_HOME=/path/to/hive-4.0.0 export HIVE_CONF_DIR=$HIVE_HOME/conf ``` 3. **验证参数传递链路** 通过`--verbose`模式观察参数解析过程: ```bash sqoop import --connect jdbc:mysql://host/db \ --hive-import --verbose \ --table src_table \ --num-mappers 1 # 显式指定合法参数值 ``` --- ### 操作验证案例 某用户从Hive 3.1.2升级到4.0.0后,因`--m 0`参数触发相同错误,通过以下步骤修复: 1. 将`--m 0`改为`--num-mappers 1` 2. 更新`hive-exec-4.0.0.jar`至Sqoop的`lib`目录 3. 重启Sqoop服务后成功执行 --- ### 扩展:参数规范参考 | **错误写法** | **正确写法** | 说明 | |---------------------|-----------------------|--------------------------| | `-0` | 无替代方案 | 数字不能作为短参数名 | | `--m0` | `--num-mappers=0` | 需显式分隔参数名与值 | | `--compress 0` | `--compress --compression-codec gzip` | 布尔参数无需赋值 | --- ### 相关问题 1. 如何判断Sqoop参数是否需要赋值? 2. Sqoop导入时如何指定Hive 4.0.0的分区表? 3. Hadoop 3.x环境下如何为Sqoop 1.4.7打补丁? [^1]: Sqoop 1.4.7参数解析逻辑基于Apache Commons CLI 1.2 [^2]: Hive 4.0.0元数据接口变更文档 [^3]: Hadoop 3.x与Sqoop 1.4.7兼容性报告
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值