第一个错误
hive日志中有以下报错:
org.apache.hadoop.hive.ql.parse.SemanticException: org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /tmp/hive/root/f39a320d-d50d-4627-a685-5eb5fff0e648/hive_2024-09-23_09-50-49_151_6473486879651462761-1/dummy_path/dummy_file could only be written to 0 of the 1 minReplication nodes. There are 1 datanode(s) running and 1 node(s) are excluded in this operation.
at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget4NewBlock(BlockManager.java:2329)
at org.apache.hadoop.hdfs.server.namenode.FSDirWriteFileOp.chooseTargetForNewBlock(FSDirWriteFileOp.java:294)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:2942)
at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:915)
at org.apache.hadoop.hdfs.protocolPB.
原因:
1、hive的本地模式搞的鬼
2、硬件资源问题和网络问题
(最主要的原因)
3、datanode写入到完成时间过长,给namenode响应时间间隔过长,namenode会认为datanode挂掉,心跳机制时间过短
4、传输缓冲区太小
解决方法:
1、关闭本地模式
set hive.exec.mode.local.auto=flase;
2、改心跳机制时间间隔
hdfs-site.xml:
<property>
<name>dfs.namenode.heartbeat.recheck-interval</name>
<value>600000</value>
</property>
<property>
<name>dfs.namenode.heartbeat.interval</name>
<value>5000</value>
</property>
3、调整数据传输缓冲区大小:
hdfs-site.xml:
#修改hadoop的hdfs.site.xml
<property>
<name>io.file.buffer.size</name>
<value>65536</value>
</property>
第二个错误
Caused by: java.net.ConnectException: Your endpoint configuration is wrong;
For more details see: http://wiki.apache.org/hadoop/UnsetHostnameOrPort
原因:
1、伪分资源不足
,导致的sql语句执行失败
2、可能是因为资源不足导致表被锁死,具体的没弄明白
3、hive临时文件产生过多
解决方法:
1、搭建hadoop全分
2、执行:
set hive.support.concurrency=false;
3、删除临时文件
在hdfs上:/tmp/hive
直接删除hdfsroot文件夹即可
第三个错误
关于使用sqoop导入数据时一个关于日期类型的数据的警告:
mysql导入hive:
原因:
mysql 中关于时间的数据类型是 timestamp
hive 的表是 sqoop 创建的,它的时间类型是 string
解决方法:
1、自己手动创建hive表,这样创作的表数据类型更加精准,特别是一些精度要求非常高的字段
2、可以在sqoop导入的时候,指定数据类型,以上sqoop就是指定了数据类型,使用了
–map-column-java updated_at=java.sql.Timestamp \
–map-column-hive updated_at=Timestamp \
例如:
sqoop import \
--driver com.mysql.cj.jdbc.Driver \
--connect jdbc:mysql://hadoop01:3306/jrxd?characterEncoding=UTF-8 \
--username root \
--password 123456 \
--query 'select * from dict_product where DATE_FORMAT(updated_at,"%Y-%m-%d") = "2024-06-30" and $CONDITIONS' \
--target-dir /tmp/dict_product \
--map-column-java updated_at=java.sql.Timestamp \
--map-column-hive updated_at=Timestamp \ # 添加以上两句话
--delete-target-dir \
--split-by id \
--num-mappers 1 \
--hive-import \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-database finance \
--hive-table ods_dict_product \
--null-non-string '\\N' \
--null-string '\\N'