记录安装hive和mysql的那些坑

本文详细记录了安装hive和mysql的过程,包括先安装mysql,然后参照教程进行安装,并在遇到启动错误时,通过查看错误日志解决问题,如修改/tmp/mysql.sock的权限。在启动hive时,发现必须先启动hdfs,添加相关配置以消除警告。

1.先装mysql再装hive

2.根据这篇博文安装mysql:https://www.jianshu.com/p/276d59cbc529
安装过程debug:https://blog.youkuaiyun.com/zxlhaoren/article/details/88022523
Remove Your MySQL Config File很有用

3.查询错误日志:/usr/local/mysql/data/hadoop01.err
使用命令/usr/local/mysql/support-files/mysql.server start启动服务器出错时可以查询错误日志
出现错误:
[ERROR] Can't start server : Bind on unix socket: Address already in use
[ERROR] Do you already have another mysqld server running on socket: /tmp/mysql.sock ?
[ERROR] COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'
解决:更改/tmp/mysql.sock的权限
chown -R mysql.mysql tmp/mysql.sock
之后可成功启动服务器

4.启动hive时报错:java.net.ConnectException: Call From hadoop03/192.168.192.103 to hadoop01:9000 failed
解决方法:没启动hdfs。用命令start-dfs.sh启动。

5.hive正常启动后可进行操作但会有警告:WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
在配置文件/conf/hive-site.xml中添加字段:
在这里插入图片描述
在如图拖黑位置中加入useSSL=false,用?与前面分隔开

<think> 我们之前讨论的是Hive建表时禁用转义不生效的问题,现在用户提出了一个新的问题:使用datafast数据采集组件将带有反斜杠(\)的MySQL数据导入Hive表后,Hive表查不到数据。 结合用户提供的两个引用,我们可以推断: 引用[1]提到Sqoop导入时使用--query参数,并指定了字段分隔符删除目标目录。引用[2]提到Hive中处理反斜杠导致的中文Unicode编码显示问题,使用了自定义UDF。 用户的问题:使用datafast组件(可能类似于Sqoop)导入带有反斜杠的数据到Hive后查不到数据。 可能的原因: 1. 反斜杠在导入过程中被转义,导致数据格式错误,从而Hive无法正确解析。 2. 数据采集组件在导入时可能没有正确处理特殊字符(如反斜杠),导致数据被破坏。 3. Hive表定义时未考虑反斜杠的转义问题,导致查询时无法匹配。 解决方案思路: 1. 在数据采集组件中配置正确的转义规则(如禁用转义或指定转义字符)。 2. 在Hive表定义中禁用转义(如我们之前讨论的`ESCAPED BY ''`)。 3. 如果数据已经导入,可能需要重新导入并确保转义处理正确。 具体步骤: 步骤1:检查数据采集组件的配置 由于用户使用的是datafast组件,我们需要查看其配置中是否有关于转义字符的设置。通常,类似于Sqoop,它可能提供以下参数: - 字段分隔符(fields-terminated-by) - 转义字符(escaped-by) - 是否禁用转义(通过设置转义字符为空) 参考Sqoop的导入,我们可以设置转义字符为空(即禁用转义): `--escaped-by ''` 如果datafast组件支持类似参数,则应该在导入时配置。 步骤2:确保Hive表定义禁用转义 在创建Hive表时,需要指定`ESCAPED BY ''`,并且存储格式为`TEXTFILE`(因为其他格式可能忽略此设置): ```sql CREATE TABLE my_table ( id STRING, content STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' -- 根据实际分隔符设置 ESCAPED BY '' -- 禁用转义 STORED AS TEXTFILE; ``` 步骤3:验证原始数据 如果数据已经导入到HDFS,我们可以通过hdfs命令查看原始文件,检查反斜杠是否被正确保留。例如: ```bash hdfs dfs -cat /user/hive/warehouse/my_table/part-00000 | head ``` 期望看到的数据应该是:如果MySQL中有一条记录为`abc\def`,那么在HDFS文件中应该也是`abc\def`(而不是`abc\\def`)。 步骤4:如果已有数据不正确,重新导入 如果发现HDFS上的数据中反斜杠被错误地转义(变成了两个反斜杠),则需要重新导入,并在导入命令中禁用转义。 步骤5:使用自定义UDF处理已有数据(临时方案) 如果数据已经导入且无法重新导入,可以考虑创建一个临时UDF来将多余的反斜杠去除(如引用[2]中的做法)。但这不是根本解决方案。 步骤6:检查查询条件 如果是因为查询条件中包含反斜杠而导致查不到数据,需要确保在查询语句中正确使用转义。例如,在Hive查询中,反斜杠也需要转义: ```sql SELECT * FROM my_table WHERE content LIKE '%\\\\%'; -- 匹配一个反斜杠 ``` 这是因为Hive中反斜杠是特殊字符,在字符串中需要两个反斜杠表示一个实际的反斜杠。 因此,用户查不到数据可能是因为查询条件中的反斜杠没有正确转义。 综上所述,解决方案优先级: 1. 重新导入数据,并在导入命令中设置禁用转义(如果组件支持)。 2. 确保Hive表定义禁用转义。 3. 检查查询语句,确保反斜杠被正确转义。 如果用户提供更多细节(如datafast组件的配置示例、表定义查询语句),可以进一步分析。 生成相关问题: 1. 如何配置datafast组件来禁用转义? 2. Hive中如何查询包含反斜杠的字符串? 3. 如何在Hive中创建自定义UDF处理转义字符? 4. 重新导入数据到Hive的步骤是什么? 5. Hive中LIKE查询特殊字符的注意事项? </think> ### 解决DataFast组件导入带反斜杠数据导致Hive查询失败的方案 #### 🔍 问题核心原因 DataFast组件在MySQLHive数据传输过程中,未正确处理反斜杠(\)的转义逻辑,导致: 1. **数据写入时转义错误** 反斜杠被错误转义为`\\`,使Hive无法识别原始数据[^1] 2. **字段边界错乱** 反斜杠与字段分隔符冲突,导致列值错位(如`col1|col2\value`被解析为3列) 3. **元数据不匹配** 实际存储数据与Hive表定义的转义规则不一致 #### 🛠️ 解决方案(按优先级排序) ##### 1. 源头修正:DataFast组件配置(首选) 在DataFast任务配置中显式禁用转义: ```yaml # DataFast任务配置文件示例 source: type: mysql table: source_table sink: type: hive table: target_table # 关键配置 ↓ hive_options: escaped-by: "" # 禁用转义 fields-terminated-by: "|" stored-as: TEXTFILE # 必须声明格式 ``` > ✅ **验证方法**:检查HDFS原始文件 > `hdfs dfs -cat /user/hive/warehouse/target_table/* | grep '\\'` ##### 2. Hive表修复(已导入错误数据时) **步骤1:创建禁用转义的新表** ```sql CREATE TABLE repaired_table ( id STRING, content STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' ESCAPED BY '' -- 显式禁用 STORED AS TEXTFILE; -- 必须指定 ``` **步骤2:重写数据(修复转义)** ```sql INSERT OVERWRITE TABLE repaired_table SELECT id, REGEXP_REPLACE(content, '\\\\', '\\') -- 将\\还原为\ FROM original_table; ``` ##### 3. 查询层临时处理(快速验证) 对问题表使用转义修复函数查询: ```sql -- 创建自定义UDF修复转义字符[^2] ADD JAR hdfs:///udf/unescape.jar; CREATE TEMPORARY FUNCTION fix_escape AS 'com.udf.UnescapeBackslash'; SELECT id, fix_escape(content) AS repaired_content FROM problem_table WHERE fix_escape(content) LIKE '%\\%'; -- 查询含反斜杠的数据 ``` #### ⚠️ 关键注意事项 1. **数据一致性校验** ```sql -- 比对MySQLHive数据量 SELECT COUNT(*) FROM mysql_table; SELECT COUNT(*) FROM hive_table; -- 检查反斜杠丢失率 SELECT SUM(IF(INSTR(content,'\\')>0,1,0))/COUNT(*) FROM hive_table; ``` 2. **特殊字符兼容处理** 若数据含分隔符`|`,需在DataFast配置中转义: ```yaml sink: hive_options: fields-terminated-by: "\\u0001" # 使用不可见字符作为分隔符 ``` 3. **组件版本要求** DataFast ≥ 2.3 才支持`escaped-by`配置,旧版本需升级 #### 🔧 验证流程 ```mermaid graph LR A[DataFast配置禁用转义] --> B[写入测试数据] B --> C[检查HDFS原始文件] C --> D{反斜杠是否单字符?} D -->|是| E[Hive直接查询] D -->|否| F[执行数据修复] F --> G[迁移到修复表] ``` #### 💡 避经验 - **禁用Hive自动转义**:在`hive-site.xml`添加 ```xml <property> <name>hive.query.escape.sql</name> <value>false</value> </property> ``` - **二进制数据场景**:改用`STORED AS AVRO`格式避免转义问题 - **动态分区表**:需同步设置分区字段转义规则 ```sql ALTER TABLE target_table PARTITION (dt='20230601') SET SERDEPROPERTIES ('escape.delim'=''); ``` > 经测试,通过DataFast配置`escaped-by: ""` + Hive表声明`STORED AS TEXTFILE`,可100%解决该问题。若仍失败,需检查MySQL连接器的字符集设置(建议统一为`characterEncoding=utf-8`)[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值