hive:常见错误和解决方案

1.连接不上 mysql 数据库

(1)导错驱动包,应该把 mysql-connector-java-5.1.27-bin.jar 导入/opt/module/hive/lib 的
不是这个包。错把 mysql-connector-java-5.1.27.tar.gz 导入 hive/lib 包下。

(2)修改 user 表中的主机名称没有都修改为%,而是修改为 localhost

2.不能执行 mapreduce 程序

可能是 hadoop 的 yarn 没开启。

3.启动 mysql 服务时, 报 MySQL server PID file could not be found! 异常

     在/var/lock/subsys/mysql 路径下创建 hadoop102.pid, 并在文件中添加内容: 4396

4.报 service mysql status MySQL is not running, but lock file (/var/lock/subsys/mysql[失败])异

解决方案:在/var/lib/mysql 目录下创建: -rw-rw----. 1 mysql mysql 5 12 月 22
16:41 hadoop102.pid 文件, 并修改权限为 777(rwxrwxrwx)

5.JVM 堆内存溢出

描述: java.lang.OutOfMemoryError: Java heap space
解决:在 yarn-site.xml 中加入如下代码
 

<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx1024m</value>
</property

6.SecureCRT 7.3 出现乱码或者删除不掉数据,

免安装版的 SecureCRT 卸载或者用虚拟机直接操作或者换安装版的 SecureCRT

7.设置输入的格式为分区输入:
hive 默认的输入格式处理是 CombineHiveInputFormat,会对小文件进行合并。

hive (default)> set hive.input.format;
hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFo
rmat


可以采用 HiveInputFormat 就会根据分区数输出相应的文件。
 

hive (default)> set
hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;

 

### Hive SQL 常见问题及解决方案 #### 数据倾斜处理 当涉及日志分析时,可能会遇到信息丢失的情况,例如日志中的 `user_id` 可能存在缺失。这种情况下,如果尝试将这些 `user_id` 与用户表关联,则可能导致数据倾斜的问题[^1]。 为了缓解这一情况,可以考虑采用以下策略之一: - **预过滤**:在连接操作之前先对日志记录进行筛选,去除那些不完整的条目。 - **采样技术**:通过随机抽样的方式减少参与 join 的数据集大小,从而降低发生倾斜的概率。 - **调整分区键**:引入额外的字段作为辅助分区依据来分散热点 key 的分布。 ```sql -- 使用 COALESCE 函数填充 null 或者默认值防止完全匹配失败造成的倾斜 SELECT t1.user_id, COUNT(*) FROM log_table AS t1 JOIN user_info AS t2 ON COALESCE(t1.user_id,'default') = t2.user_id GROUP BY t1.user_id; ``` #### 创建数据库错误 有时,在创建新的 Hive 数据库过程中会出现类似下面这样的报错:“FAILED: HiveException java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient”。这类问题是由于客户端无法实例化元存储服务所引起的[^2]。 针对这个问题有几种常见的修复措施: - **检查配置文件**:确认 hive-site.xml 中关于 metastore URI 设置是否正确无误,并且服务器地址可达。 - **验证依赖版本兼容性**:确保使用的 Hadoop 版本其他组件之间的相互兼容性良好。 - **重启 Metastore 服务**:有时候简单的重启就能解决问题;另外也可以查看是否有其他进程占用了必要的端口资源。 #### Order By 性能瓶颈 执行带有 `ORDER BY` 子句的操作会使所有的 map 输出都被发送到单个 reducer 上完成最终排序工作,这对于大规模的数据集来说效率极低而且容易超时[^3]。 为了避免这种情况的发生,建议采取如下改进方案: - **Distribute and Sort**: 利用 DISTRIBUTE BY SORT BY 来代替 ORDER BY 实现局部有序的结果集,这样可以在多个 reduce task 并行运行的同时保持每组内部已排序的状态。 ```sql SELECT * FROM table_name DISTRIBUTE BY column_to_partition_by SORT BY column_to_sort_within_each_partition ASC/DESC; ``` - **Limit 推荐数量**:对于只需要获取前 N 行记录的需求场景下可以直接加上 LIMIT n ,让框架只保留最前面的一部分结果而不需要等待整个输入被处理完毕后再做决定。 #### 复杂聚合查询性能调优 假设有一个需求是要统计每位用户的购物清单并将其压缩成字符串形式展示出来,那么可以通过 group_concat UDAF (User Defined Aggregation Function) 功能实现这一点[^4]。 这里给出一段示范性的代码片段用于说明如何构建上述逻辑: ```sql CREATE TEMPORARY FUNCTION concat_ws AS 'org.apache.hadoop.hive.contrib.udf.UDFConcatWS'; WITH aggregated_purchases AS ( SELECT o.user_id, CONCAT_WS(',', COLLECT_SET(o.product_id)) as purchased_products FROM orders o GROUP BY o.user_id ) SELECT * FROM aggregated_purchases; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值