복붙노트

[HADOOP] Amazon EMR 및 Hive : 외부 테이블에 하위 디렉토리를로드 할 때 "java.io.IOException : 파일이 아님"예외가 발생 함

HADOOP

Amazon EMR 및 Hive : 외부 테이블에 하위 디렉토리를로드 할 때 "java.io.IOException : 파일이 아님"예외가 발생 함

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

누구든지 이것을 해결하는 방법에 대한 아이디어가 있습니까?

해결법

  1. ==============================

    1.EMR 관련 문제입니다. Amazon 지원에서 얻은 것입니다.

    EMR 관련 문제입니다. Amazon 지원에서 얻은 것입니다.

  2. ==============================

    2.이제 작동합니다 (2018 년 5 월)

    이제 작동합니다 (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. ==============================

    3.문제는 위치를 지정한 방식입니다

    문제는 위치를 지정한 방식입니다

    s3 : // bucketname / 2014 / 08 /

    하이브 외부 테이블은 파일이이 위치에있을 것으로 예상하지만 폴더가 있습니다.

    같은 경로를 넣어보십시오

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

    파일까지 경로를 제공해야합니다.

  4. from https://stackoverflow.com/questions/25708240/amazon-emr-and-hive-getting-a-java-io-ioexception-not-a-file-exception-when by cc-by-sa and MIT license