gpt4 book ai didi

hadoop - 从多个服务器加载数据时避免数据重复

转载 作者:可可西里 更新时间:2023-11-01 15:12:58 29 4
gpt4 key购买 nike

我有十几个网络服务器,每个服务器都将数据写入一个日志文件。在每个小时的开始,使用运行以下命令的 cron 脚本将前一小时的数据加载到配置单元中:

hive -e "LOAD DATA LOCAL INPATH 'myfile.log' INTO TABLE my_table PARTITION(dt='2015-08-17-05')"

在某些情况下,命令会失败并以 0 以外的代码退出,在这种情况下,我们的脚本会等待并再次尝试。问题是,在某些失败的情况下,数据加载不会失败,即使它显示失败消息。如何确定数据是否已加载?

加载数据的“失败”示例:

Loading data to table default.my_table partition (dt=2015-08-17-05) Failed with exception org.apache.hadoop.hive.ql.metadata.HiveException: Unable to alter partition. FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask

编辑:或者,有没有办法查询配置单元中加载的文件名?我可以使用 DESCRIBE 查看文件数。我可以知道他们的名字吗?

最佳答案

关于“某个分区加载了哪些文件”:

  • 如果您使用了EXTERNAL TABLE 并且刚刚上传了您的原始数据映射到 LOCATION 的 HDFS 目录中的文件,那么您可以

(a) 只需从命令行在该目录上运行 hdfs dfs -ls(或使用等效的 Java API 调用)(b) 运行 Hive 查询,例如 select distinct INPUT__FILE__NAME from (...)

  • 但在您的情况下,您将数据复制到“托管”表中,因此无法检索数据沿袭(即使用了哪个日志文件创建每个托管数据文件)
  • ...除非您显式添加原始文件名日志文件中,course(在“特殊”头记录上,或在每条记录的开头 - 这可以用旧的 sed 完成)

关于“如何在 INSERT 上自动避免重复”:有一种方法,但它需要大量的重新设计,并且会花费你处理时间/(额外的 Map 步骤加上 MapJoin)/。 ..

  1. 将您的日志文件映射到一个EXTERNAL TABLE,这样您就可以运行一个INSERT-SELECT 查询
  2. 使用 INPUT__FILE__NAME 伪列作为源将原始文件名上传到您的托管表
  3. 添加一个带有相关子查询的 WHERE NOT EXISTS 子句,这样如果源文件名已经存在于目标中,那么您不再加载任何内容

    INSERT INTO TABLE 目标
    选择 ColA、ColB、ColC、INPUT__FILE__NAME 作为 SrcFileName
    从源 src
    不存在的地方
    (选择不同的 1
    FROM 目标trg
    WHERE trg.SrcFileName = src.INPUT__FILE__NAME
    )

    请注意,为了避免耗尽 Mappers 中的 RAM,实际上需要愚蠢的 DISTINCT;对于像 Oracle 这样成熟的 DBMS 来说,它是没有用的,但是 Hive 优化器仍然相当粗糙......

关于hadoop - 从多个服务器加载数据时避免数据重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32073388/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com