【问题标题】:Amazon EMR and Hive: Getting a "java.io.IOException: Not a file" exception when loading subdirectories to an external tableAmazon EMR 和 Hive:将子目录加载到外部表时出现“java.io.IOException: Not a file”异常
【发布时间】:2014-09-07 08:05:59
【问题描述】:

我正在使用 Amazon EMR。 我在 s3 中有一些日志数据,都在同一个存储桶中,但在不同的子目录下 喜欢:

"s3://bucketname/2014/08/01/abc/file1.bz"
"s3://bucketname/2014/08/01/abc/file2.bz"
"s3://bucketname/2014/08/01/xyz/file1.bz"
"s3://bucketname/2014/08/01/xyz/file3.bz"

我正在使用:

Set hive.mapred.supports.subdirectories=true;
Set mapred.input.dir.recursive=true;

尝试从“s3://bucketname/2014/08/”加载所有数据时:

CREATE EXTERNAL TABLE table1(id string, at string, 
          custom struct<param1:string, param2:string>)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://bucketname/2014/08/';

作为回报,我得到:

OK
Time taken: 0.169 seconds

尝试查询表时:

SELECT * FROM table1 LIMIT 10;

我明白了:

Failed with exception java.io.IOException:java.io.IOException: Not a file: s3://bucketname/2014/08/01

有人知道如何解决这个问题吗?

【问题讨论】:

    标签: hadoop amazon-web-services amazon-s3 hive emr


    【解决方案1】:

    这是一个特定于 EMR 的问题,这是我从亚马逊支持获得的:

    很遗憾,Hadoop 不会递归检查 Amazon S3 存储桶的子目录。输入文件必须直接位于您指定的输入目录或 Amazon S3 存储桶中,而不是子目录中。 根据这个document(“你想递归遍历输入目录吗?”) 看起来 EMR 目前不支持递归目录。对于给您带来的不便,我们深表歉意。

    【讨论】:

      【解决方案2】:

      现在可以使用(2018 年 5 月)

      全局 EMR_wide 修复方法是在 /etc/spark/conf/spark-defaults.conf 文件中设置以下内容:

      spark.hadoop.mapreduce.input.fileinputformat.input.dir.recursive  true
      hive.mapred.supports.subdirectories  true
      

      或者,可以像下面的 pyspark 代码一样在本地修复:

      from pyspark.context import SparkContext
      from pyspark.sql import SparkSession
      
      spark = SparkSession \
          .builder \
          .appName("Python Spark SQL Hive integration example") \
          .enableHiveSupport() \
       .config("spark.hadoop.mapreduce.input.fileinputformat.input.dir.recursive","true") \
              .config("hive.mapred.supports.subdirectories","true") \
              .getOrCreate()
              spark.sql("<YourQueryHere>").show()
      

      【讨论】:

        【解决方案3】:

        问题在于您指定位置的方式

        s3://bucketname/2014/08/

        hive 外部表希望文件存在于此位置,但它有文件夹。

        试着把路径像

        "s3://bucketname/2014/08/01/abc/,s3://bucketname/2014/08/01/xyz/"
        

        您需要提供文件路径。

        【讨论】:

        • 这实际上不起作用 - Hive 创建表时没有错误,但它没有“看到”任何文件。如果你尝试 COUNT(*) 它总是返回 0。
        猜你喜欢
        • 2011-06-27
        • 1970-01-01
        • 1970-01-01
        • 2021-01-24
        • 1970-01-01
        • 1970-01-01
        • 2011-05-05
        • 2019-12-08
        • 1970-01-01
        相关资源
        最近更新 更多