AWS Kinesis Firehose无法将数据插入Redshift

20

我试图使用Kinesis Firehose将数据推送到Redshift表中。

Firehose流正在工作并将数据放入S3。

但是目标表中没有任何数据到达Redshift。

  • 在指标DeliveryToRedshift成功方面,值为0(DeliveryToRedshift记录为空)
  • 负载日志(redshift Web控制台)和STL_LOAD_ERRORS表为空。
  • 我检查了Firehose是否能连接到Redshift(我在STL_CONNECTION_LOG中看到了连接)

我该如何解决这个问题?


1
我也遇到了这个问题。我确保我的授权选项已正确设置,但仍然遇到了这个问题。 - Corey C
编辑:尝试了超级用户,它可以工作,所以不确定为什么具有INSERT权限的非超级用户无法工作? - Corey C
5个回答

43
最终,我通过删除并重新创建Firehose流来解决了问题 :-/。可能是通过Web控制台进行的重复编辑使事情不稳定。 但以下是故障排除指南:
  • 一个好的起点是这个过程:http://docs.aws.amazon.com/firehose/latest/dev/troubleshooting.html
  • 检查数据是否到达S3
  • 此时,Firehose监控中的“DeliveryToS3 Success”指标应该为非零值
  • Redshift集群必须是公共可访问的(请参见集群Web控制台)
  • 集群的安全组必须允许来自Firehose IP地址的入站流量: Firehose当前为每个可用的AWS Region使用一个CIDR块:
    • 52.70.63.192/27用于美国东部(弗吉尼亚北部)
    • 52.89.255.224/27用于美国西部(俄勒冈州)
    • 52.19.239.192/27用于欧盟(爱尔兰)
  • 仔细检查您提供给Firehose的Redshift用户/密码
  • 此时,您应该能够在Redshift日志中看到连接尝试:

select * from stl_connection_log where remotehost like '52%' order by recordtime desc;  
  • 检查Firehose使用的Redshift用户在目标表上是否具有足够的权限:

  • select tablename, 
       HAS_TABLE_PRIVILEGE(tablename, 'select') as select,
       HAS_TABLE_PRIVILEGE(tablename, 'insert') as insert,
       HAS_TABLE_PRIVILEGE(tablename, 'update') as update,
       HAS_TABLE_PRIVILEGE(tablename, 'delete') as delete, 
       HAS_TABLE_PRIVILEGE(tablename, 'references') as references 
    from pg_tables where schemaname='public' order by tablename;
    
  • 然后您可以检查是否运行了COPY命令:

  • select * from stl_query order by endtime desc limit 10;
    
  • 然后检查加载错误或服务器错误:

  • select * from stl_load_errors  order by starttime desc;
    select * from stl_error where userid!=0 order by recordtime desc;
    
  • 如果您的数据格式存在问题,或在COPY选项中存在问题,或者数据与目标列不匹配,则至少应该看到COPY尝试以及一些加载错误。

  • 如果您仍然卡住了,那些日志表中没有任何内容,请尝试删除并重新创建整个firehose流,因为可能存在与Web控制台相关的一些错误。(这一步对我有用)


  • 谢谢。这非常有帮助!我还有其他困难点:1.在Redshift中,您必须手动创建表格,并且列名必须与您的数据匹配(如果使用JSON“auto”复制选项)。2.如果您的列值很大,则应创建相应大小的列。例如,创建表test_table(key VARCHAR(255),value VARCHAR(4000))。 - ProGirlXOXO
    2
    需要为入站规则(在安全组中)添加IP地址。这些错误没有被记录的方法。Kinesis 应该改进错误日志记录。 - ankitjaininfo
    3
    重新创建firehose流在我的情况下很有帮助。当我更改了firehose配置时,事件突然停止在redshift中被复制(尽管s3始终接收事件)。 - Benjamin Crouzier
    经过更深入的挖掘,我真正的问题就像你指出的那样与“安全组”有关。因为我的集群在爱尔兰,所以将52.19.239.192/27添加到VPC入站规则(AWS VPC > 选择当前VPC,选项卡“入站规则”)解决了这个问题。我认为重新创建firehose(请参见上一条评论)也起作用了,因为AWS自动应用了这个规则。 - Benjamin Crouzier
    2
    在检查连接尝试时,我不得不修改LIKE使用'%52%',因为在IPv6支持下,内容现在看起来不同了:"::ffff:52.70.63.207"。 - user1652110
    显示剩余2条评论

    8

    到Kinesis Firehose设置期间自动创建的IAM角色(firehose_delivery_role),确保已附加以下角色:

    AmazonS3FullAccess
    AmazonRedshiftFullAccess
    AmazonKinesisFullAccess
    AmazonKinesisFirehoseFullAccess
    

    有一个漏洞会在IAM中省略S3凭据,导致Kinesis设置无法工作。

    同时,请确保您实际上看到数据文件在S3中累积。


    6

    针对那些迷失的人,我想分享我的案例。

    我们按照这里发布的指南(http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html)强制使用服务器端加密调用我们的S3存储桶。

    然而,在Firehose使用的存储桶上使用此策略存在问题,因为Firehose会创建未加密的清单文件以及加密的数据文件。如果此策略已经生效,则清单文件将不会被创建到S3中,从而无法触发Redshift加载。所以我们看到数据到达了存储桶,但没有清单文件,也就是没有数据加载。


    1
    在设置Kinesis Firehose时,请使用Redshift masteruser 凭据。其他用户将无法正常工作。

    1
    您应该指定具有适当权限的特定用户。仅在IAM中管理其他AWS帐户时才应使用主用户。 - Mio

    0
    如果有多个来源将数据流入同一个firehose,而且您正在通过测试数据进行测试,则演示数据的json文本可能会被修改,导致它与redshift表模式不匹配,因此无法将数据加载到redshift表中。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接