十三(1)、sqoop遇到的问题

本文描述了使用sqoop从MySQL导入数据到Hive时遇到的两个问题:1) 当Hive表为Parquet格式时,导入报错;2) 使用sqoop连接PostgreSQL列出数据库失败。针对第一个问题,当不使用`--as-parquetfile`选项,数据能正常导入Textfile格式的Hive表。尝试直接指定HDFS路径,数据未导入且目标目录消失。第二个问题通过修改pg_hba.conf配置解决了连接问题。

1、从mysql抽数到hive,hive表为parquet存储格式,导入语句为:

sqoop import
–connect jdbc:mysql://${MYSQL_HOST}😒{MYSQL_PORT}/sx_channel?tinyInt1isBit=false
–username ${MYSQL_USER}
–password ${MYSQL_PSW}
–table $1
–columns $3
–hive-delims-replacement “”
–hive-table test.$2
–hive-partition-key part_dt
–hive-partition-value ‘2019-05-13’
–hive-import
–hive-overwrite
–delete-target-dir
–as-parquetfile
–m 1
–null-string ‘\N’
–null-non-string ‘\N’

报错:

19/05/13 17:33:04 ERROR sqoop.Sqoop: Got exception running Sqoop: org.kitesdk.data.ValidationException: Dataset name test.xiaoneng_improt is not alphanumeric (plus '_')
org.kitesdk.data.ValidationException: Dataset name test.xiaoneng_improt is not alphanumeric (plus '_')
	at org.kitesdk.data.ValidationException.check(ValidationException.java:60)
	at org.kitesdk.data.spi.Compatibility.checkDatasetName(Compatibility.java:109)
	at org.kitesdk.data.spi.hive.HiveAbstractMetadataProvider.exists(HiveAbstractMetadataProvider.java:158)
	at org.kitesdk.data.spi.filesystem.FileSystemDatasetRepository.exists(FileSystemDatasetRepository.java:266)
	at org.kitesdk.data.Datasets.exists(Datasets.java:633)
	at org.kitesdk.data.Datasets.exists(Datasets.java:650)
	at org.apache.sqoop.mapreduce.ParquetJob.configureImportJob(ParquetJob.java:118)
	at org.apache.sqoop.mapreduce.DataDrivenImportJob.configureMapper(DataDrivenImportJob.java:132)
	at org.apache.sqoop.mapreduce.ImportJobBase.runImport(ImportJobBase.java:263)
	at org.apache.sqoop.manager.SqlManager.importTable(SqlManager.java:692)
	at org.apache.sqoop.manager.MySQLManager.importTable(MySQLManager.java:124)
	at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:526)
	at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:634)
	at org.apache.sqoop.Sqoop.run(Sqoop.java:145)
	at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:76)
	at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:181)
	at org.apache.sqoop.Sqoop.runTool(Sqoop.java:232)
	at org.apache.sqoop.Sqoop.runTool(Sqoop.java:241)
	at org.apache.sqoop.Sqoop.main(Sqoop.java:250)

但是hive表如果是textfile格式,然后sqoop导入语句去掉–as-parquetfile,就没问题,能正常导入

如果sqoop导入语句改为:

sqoop import
–connect jdbc:mysql://${MYSQL_HOST}😒{MYSQL_PORT}/sx_channel?tinyInt1isBit=false
–username ${MYSQL_USER}
–password ${MYSQL_PSW}
–table $1
–columns $3
–hive-delims-replacement “”
–target-dir /user/hive/warehouse/test.db/xiaoneng_improt/part_dt=2019-05-13
–hive-import
–hive-overwrite
–delete-target-dir
–as-parquetfile
–m 1
–null-string ‘\N’
–null-non-string ‘\N’

执行上面这个导入语句之后,查看hdfs,数据并没有导入,而且目录part_dt=2019-05-13还消失了

2、cdh上的sqoop连接postgresql,
sqoop list-databases --connect jdbc:postgresql://192.168.30.246:5432 --username postgres --password *******
报错:

no pg_hba.conf entry for host "192.168.74.81", user "postgres", database "postgres", SSL off

解决办法:https://www.cnblogs.com/chinadyw/p/3507207.html
在pg_hba.conf配置文件里面添加:host all all 0.0.0.0/0 md5

<think>我们在处理Sqoop1Hive导入Oracle时遇到小语种问题(如非拉丁字符集,中文、日文、韩文等)通常涉及字符编码转换问题。根据引用内容,虽然没有直接提到Sqoop的小语种问题,但我们可以结合数据标准化(引用[3])和数据库配置相关知识(引用[2])来推断解决方案。 常见原因和解决方案: 1. **字符集不一致**:Hive默认使用UTF-8编码,而Oracle数据库可能使用其他字符集(如AL32UTF8、ZHS16GBK等)。在数据迁移过程中,如果两端字符集设置不一致,就会导致乱码。 - 解决方案:确保Oracle数据库的字符集支持Unicode(如AL32UTF8),并在Sqoop命令中指定正确的字符集参数。 2. **Sqoop连接参数配置**:在Sqoop导出时,需要显式指定编码参数。 -Sqoop命令中加入:`--map-column-java <column_name>=String` 和 `--map-column-database <column_name>=NVARCHAR2`(针对Oracle的Unicode类型)来确保字符串列被正确映射。 - 同时,可以设置连接参数:`-D sqoop.export.records.per.statement=100 -D sqoop.export.statements.per.transaction=100`,但更重要的是设置字符集参数:`-D mapreduce.job.map.output.collect.encoding=utf-8` 以及 `-D mapred.child.env="LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8"`。 3. **Oracle数据库端设置**:确保Oracle数据库的NLS_LANG环境变量设置为UTF8(如AMERICAN_AMERICA.AL32UTF8),并且数据库表的字段类型支持Unicode(如NVARCHAR2, NCHAR, NCLOB)。 4. **Hive表数据确认**:首先检查Hive表中存储的数据是否已经是正确的UTF-8编码。可以通过Hive查询并输出到本地文件,用支持UTF-8的文本编辑器查看。 5. **使用Sqoop的字符集转换选项**:Sqoop本身提供了字符集转换参数,例如: - `--connection-param-file` 可以指定一个包含额外连接参数的文件,其中可以设置`oracle.jdbc.mapNcharToNVARCHAR=true`,这个参数用于将NCHAR、NVARCHAR2和NCLOB映射到合适的Java类型。 6. **数据标准化处理(引用[3])**:在导入前进行数据清洗和标准化,确保数据格式(包括字符编码)符合目标数据库的要求。 具体操作步骤建议: 步骤1:确认Oracle数据库字符集 ```sql SELECT * FROM nls_database_parameters WHERE parameter='NLS_CHARACTERSET'; -- 应该为AL32UTF8或类似Unicode字符集 ``` 步骤2:在Sqoop导出命令中显式设置字符集映射和连接参数 ```bash sqoop export \ --connect jdbc:oracle:thin:@//hostname:port/service_name \ --username your_username \ --password your_password \ --table your_table \ --export-dir /hive/warehouse/your_table \ --input-fields-terminated-by '\001' \ # 如果Hive表使用默认分隔符 --input-null-string '\\N' \ --input-null-non-string '\\N' \ -D mapred.child.env="LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8" \ -D sqoop.export.records.per.statement=100 \ -D oracle.jdbc.mapNcharToNVARCHAR=true \ --map-column-java column1=String,column2=String # 将所有字符串列映射为String # 如果目标表有NVARCHAR2列,则使用--map-column-database将对应列映射为NVARCHAR2 --map-column-database column1=NVARCHAR2,column2=NVARCHAR2 ``` 注意事项: - 如果Oracle数据库字符集不是UTF-8,则可能需要转换,建议将数据库字符集改为AL32UTF8(需谨慎操作,可能影响现有数据)。 - 如果无法更改数据库字符集,可以在Sqoop导出前通过Hive进行转码,但这样会增加复杂度。 如果上述方法仍不能解决问题,可能需要查看具体的错误信息或乱码表现,进一步分析。 相关问题1. 如何检查Hive中数据的编码格式? 2. 在Sqoop导出过程中,如何调试字符编码问题? 3. 如何修改Oracle数据库的字符集为UTF-8? 4. 除了字符集,还有哪些因素会导致Sqoop导出数据到Oracle时出现乱码? </think>### Sqoop1Hive导入Oracle小语种问题的解决方案 根据引用内容[3]提到的**数据标准化**原则(统一编码格式是核心)和数据库操作经验,Sqoop1导入小语种数据乱码的根本原因是**字符集不匹配**,解决方案如下: #### 1. **检查字符集一致性**(关键步骤) - **Hive端**:确认Hive元数据存储和表的默认字符集为`UTF-8` ```sql SHOW CREATE TABLE your_table; -- 查看表编码 ``` - **Oracle端**:验证数据库字符集(需支持目标语种) ```sql SELECT * FROM nls_database_parameters WHERE parameter LIKE '%CHARACTERSET'; -- 确保为 AL32UTF8 或 UTF8 ``` - **Sqoop映射**:在导出命令中显式声明编码 ```bash sqoop export \ --connect jdbc:oracle:thin:@//host:port/service \ --table ORACLE_TABLE \ --export-dir /hive/path \ -D mapred.child.env="LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8" \ # 强制UTF-8 --map-column-java col_name=String # 指定字段类型 ``` #### 2. **特殊字符处理** - 对非ASCII字符(如中文/日文/韩文)启用Oracle的**Unicode支持**: ```bash -D oracle.jdbc.mapNcharToNVARCHAR=true # 将NCHAR映射为NVARCHAR2 ``` - 在Oracle中创建表时使用`NVARCHAR2`替代`VARCHAR2`: ```sql CREATE TABLE demo (name NVARCHAR2(50)); -- 支持Unicode存储 ``` #### 3. **数据预处理**(引用[3]的标准化原则) -Hive中清洗数据,确保无非法字符: ```sql INSERT OVERWRITE TABLE clean_table SELECT REGEXP_REPLACE(col, '[^\\u0000-\\uFFFF]', '') -- 过滤四字节字符 FROM source_table; ``` - 使用`kettle`等工具(引用[3])提前转换字符集: ```bash iconv -f UTF-8 -t ISO-2022-JP input.txt > output.txt # 示例:日文转换 ``` #### 4. **驱动兼容性** - 使用Oracle官方JDBC驱动`ojdbc8.jar`(兼容JDK1.8+),确保支持UTF-8: ```bash export HADOOP_CLASSPATH=/path/to/ojdbc8.jar ``` #### 5. 验证步骤 - 测试简单中文字符导入: ```sql -- Oracle端查询验证 SELECT DUMP(col_name, 1016) FROM table WHERE ROWNUM=1; -- 正确结果应显示 "Typ=1 Len=3 CharacterSet=AL32UTF8: e4,b8,ad" ``` > **根本原因**:Hive默认UTF-8编码与Oracle字符集不一致时,会导致二进制转换错误。通过统一字符集和显式声明映射可解决[^3][^2]。 --- ### 相关问题 1. 如何检查Oracle数据库当前的字符集配置? 2. 使用Sqoop导入数据时,怎样处理字段类型不匹配的问题? 3. 除了字符集问题SqoopHive到Oracle还有哪些常见错误? 4. 如何优化Sqoop在迁移大数据量时的性能(参考引用[4]的JVM配置)? 5. 数据标准化过程中,`kettle`工具的具体应用场景有哪些(扩展引用[3])?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值