2016-09-17 21 views
8

Vấn đề -tập tin Tại sao hive_staging là mất tích trong AWS EMR

Tôi đang chạy 1 truy vấn trong AWS EMR. Không thành công bằng cách ném ngoại lệ -

java.io.FileNotFoundException: File s3://xxx/yyy/internal_test_automation/2016/09/17/17156/data/feed/commerce_feed_redshift_dedup/.hive-staging_hive_2016-09-17_10-24-20_998_2833938482542362802-639 does not exist. 

Tôi đã đề cập đến tất cả thông tin liên quan cho vấn đề này bên dưới. Hãy kiểm tra.

Query -

INSERT OVERWRITE TABLE base_performance_order_dedup_20160917 
SELECT 
* 
FROM 
(
select 
commerce_feed_redshift_dedup.sku AS sku, 
commerce_feed_redshift_dedup.revenue AS revenue, 
commerce_feed_redshift_dedup.orders AS orders, 
commerce_feed_redshift_dedup.units AS units, 
commerce_feed_redshift_dedup.feed_date AS feed_date 
from commerce_feed_redshift_dedup 
) tb 

Exception -

ERROR Error while executing queries 
java.sql.SQLException: Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.tez.TezTask. Vertex failed, vertexName=Map 1, vertexId=vertex_1474097800415_0311_2_00, diagnostics=[Vertex vertex_1474097800415_0311_2_00 [Map 1] killed/failed due to:ROOT_INPUT_INIT_FAILURE, Vertex Input: commerce_feed_redshift_dedup initializer failed, vertex=vertex_1474097800415_0311_2_00 [Map 1], java.io.FileNotFoundException: File s3://xxx/yyy/internal_test_automation/2016/09/17/17156/data/feed/commerce_feed_redshift_dedup/.hive-staging_hive_2016-09-17_10-24-20_998_2833938482542362802-639 does not exist. 
    at com.amazon.ws.emr.hadoop.fs.s3n.S3NativeFileSystem.listStatus(S3NativeFileSystem.java:987) 
    at com.amazon.ws.emr.hadoop.fs.s3n.S3NativeFileSystem.listStatus(S3NativeFileSystem.java:929) 
    at com.amazon.ws.emr.hadoop.fs.EmrFileSystem.listStatus(EmrFileSystem.java:339) 
    at org.apache.hadoop.fs.FileSystem.listStatus(FileSystem.java:1530) 
    at org.apache.hadoop.fs.FileSystem.listStatus(FileSystem.java:1537) 
    at org.apache.hadoop.fs.FileSystem.listStatus(FileSystem.java:1556) 
    at org.apache.hadoop.fs.FileSystem.listStatus(FileSystem.java:1601) 
    at org.apache.hadoop.fs.FileSystem$4.(FileSystem.java:1778) 
    at org.apache.hadoop.fs.FileSystem.listLocatedStatus(FileSystem.java:1777) 
    at org.apache.hadoop.fs.FileSystem.listLocatedStatus(FileSystem.java:1755) 
    at org.apache.hadoop.mapred.FileInputFormat.singleThreadedListStatus(FileInputFormat.java:239) 
    at org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:201) 
    at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:281) 
    at org.apache.hadoop.hive.ql.io.HiveInputFormat.addSplitsForGroup(HiveInputFormat.java:363) 
    at org.apache.hadoop.hive.ql.io.HiveInputFormat.getSplits(HiveInputFormat.java:486) 
    at org.apache.hadoop.hive.ql.exec.tez.HiveSplitGenerator.initialize(HiveSplitGenerator.java:200) 
    at org.apache.tez.dag.app.dag.RootInputInitializerManager$InputInitializerCallable$1.run(RootInputInitializerManager.java:278) 
    at org.apache.tez.dag.app.dag.RootInputInitializerManager$InputInitializerCallable$1.run(RootInputInitializerManager.java:269) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:422) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657) 
    at org.apache.tez.dag.app.dag.RootInputInitializerManager$InputInitializerCallable.call(RootInputInitializerManager.java:269) 
    at org.apache.tez.dag.app.dag.RootInputInitializerManager$InputInitializerCallable.call(RootInputInitializerManager.java:253) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
]Vertex killed, vertexName=Reducer 2, vertexId=vertex_1474097800415_0311_2_01, diagnostics=[Vertex received Kill in INITED state., Vertex vertex_1474097800415_0311_2_01 [Reducer 2] killed/failed due to:OTHER_VERTEX_FAILURE]DAG did not succeed due to VERTEX_FAILURE. failedVertices:1 killedVertices:1 
    at org.apache.hive.jdbc.HiveStatement.waitForOperationToComplete(HiveStatement.java:348) 
    at org.apache.hive.jdbc.HiveStatement.execute(HiveStatement.java:251) 
    at com.XXX.YYY.executors.HiveQueryExecutor.executeQueriesInternal(HiveQueryExecutor.java:234) 
    at com.XXX.YYY.executors.HiveQueryExecutor.executeQueriesMetricsEnabled(HiveQueryExecutor.java:184) 
    at com.XXX.YYY.azkaban.jobexecutors.impl.AzkabanHiveQueryExecutor.run(AzkabanHiveQueryExecutor.java:68) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at azkaban.jobtype.JavaJobRunnerMain.runMethod(JavaJobRunnerMain.java:192) 
    at azkaban.jobtype.JavaJobRunnerMain.(JavaJobRunnerMain.java:132) 
    at azkaban.jobtype.JavaJobRunnerMain.main(JavaJobRunnerMain.java:76) 

tính Hive Cấu hình, mà tôi thiết lập trước khi thực hiện trên truy vấn. -

set hivevar:hive.mapjoin.smalltable.filesize=2000000000 
set hivevar:mapreduce.map.speculative=false 
set hivevar:mapreduce.output.fileoutputformat.compress=true 
set hivevar:hive.exec.compress.output=true 
set hivevar:mapreduce.task.timeout=6000000 
set hivevar:hive.optimize.bucketmapjoin.sortedmerge=true 
set hivevar:io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec 
set hivevar:hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat 
set hivevar:hive.auto.convert.sortmerge.join.noconditionaltask=false 
set hivevar:FEED_DATE=20160917 
set hivevar:hive.optimize.bucketmapjoin=true 
set hivevar:hive.exec.compress.intermediate=true 
set hivevar:hive.enforce.bucketmapjoin=true 
set hivevar:mapred.output.compress=true 
set hivevar:mapreduce.map.output.compress=true 
set hivevar:hive.auto.convert.sortmerge.join=false 
set hivevar:hive.auto.convert.join=false 
set hivevar:mapreduce.reduce.speculative=false 
set hivevar:[email protected] 
set hivevar:mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec 
set hive.mapjoin.smalltable.filesize=2000000000 
set mapreduce.map.speculative=false 
set mapreduce.output.fileoutputformat.compress=true 
set hive.exec.compress.output=true 
set mapreduce.task.timeout=6000000 
set hive.optimize.bucketmapjoin.sortedmerge=true 
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec 
set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat 
set hive.auto.convert.sortmerge.join.noconditionaltask=false 
set FEED_DATE=20160917 
set hive.optimize.bucketmapjoin=true 
set hive.exec.compress.intermediate=true 
set hive.enforce.bucketmapjoin=true 
set mapred.output.compress=true 
set mapreduce.map.output.compress=true 
set hive.auto.convert.sortmerge.join=false 
set hive.auto.convert.join=false 
set mapreduce.reduce.speculative=false 
set [email protected] 
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec 

/etc/hive/conf/hive-site.xml

<configuration> 

<!-- Hive Configuration can either be stored in this file or in the hadoop configuration files --> 
<!-- that are implied by Hadoop setup variables.            --> 
<!-- Aside from Hadoop setup variables - this file is provided as a convenience so that Hive --> 
<!-- users do not have to edit hadoop configuration files (that may be managed as a centralized --> 
<!-- resource).                     --> 

<!-- Hive Execution Parameters --> 


<property> 
    <name>hbase.zookeeper.quorum</name> 
    <value>ip-172-30-2-16.us-west-2.compute.internal</value> 
    <description>http://wiki.apache.org/hadoop/Hive/HBaseIntegration</description> 
</property> 

<property> 
    <name>hive.execution.engine</name> 
    <value>tez</value> 
</property> 

    <property> 
    <name>fs.defaultFS</name> 
    <value>hdfs://ip-172-30-2-16.us-west-2.compute.internal:8020</value> 
    </property> 


    <property> 
    <name>hive.metastore.uris</name> 
    <value>thrift://ip-172-30-2-16.us-west-2.compute.internal:9083</value> 
    <description>JDBC connect string for a JDBC metastore</description> 
    </property> 

    <property> 
    <name>javax.jdo.option.ConnectionURL</name> 
    <value>jdbc:mysql://ip-172-30-2-16.us-west-2.compute.internal:3306/hive?createDatabaseIfNotExist=true</value> 
    <description>username to use against metastore database</description> 
    </property> 

    <property> 
    <name>javax.jdo.option.ConnectionDriverName</name> 
    <value>org.mariadb.jdbc.Driver</value> 
    <description>username to use against metastore database</description> 
    </property> 

    <property> 
    <name>javax.jdo.option.ConnectionUserName</name> 
    <value>hive</value> 
    <description>username to use against metastore database</description> 
    </property> 

    <property> 
    <name>javax.jdo.option.ConnectionPassword</name> 
    <value>mrN949zY9P2riCeY</value> 
    <description>password to use against metastore database</description> 
    </property> 

    <property> 
    <name>datanucleus.fixedDatastore</name> 
    <value>true</value> 
    </property> 

    <property> 
    <name>mapred.reduce.tasks</name> 
    <value>-1</value> 
    </property> 

    <property> 
    <name>mapred.max.split.size</name> 
    <value>256000000</value> 
    </property> 

    <property> 
    <name>hive.metastore.connect.retries</name> 
    <value>15</value> 
    </property> 

    <property> 
    <name>hive.optimize.sort.dynamic.partition</name> 
    <value>true</value> 
    </property> 

    <property> 
    <name>hive.async.log.enabled</name> 
    <value>false</value> 
    </property> 

</configuration> 

/etc/tez/conf/tez-site.xml

<configuration> 
    <property> 
    <name>tez.lib.uris</name> 
    <value>hdfs:///apps/tez/tez.tar.gz</value> 
    </property> 

    <property> 
    <name>tez.use.cluster.hadoop-libs</name> 
    <value>true</value> 
    </property> 

    <property> 
    <name>tez.am.grouping.max-size</name> 
    <value>134217728</value> 
    </property> 

    <property> 
    <name>tez.runtime.intermediate-output.should-compress</name> 
    <value>true</value> 
    </property> 

    <property> 
    <name>tez.runtime.intermediate-input.is-compressed</name> 
    <value>true</value> 
    </property> 

    <property> 
    <name>tez.runtime.intermediate-output.compress.codec</name> 
    <value>org.apache.hadoop.io.compress.LzoCodec</value> 
    </property> 

    <property> 
    <name>tez.runtime.intermediate-input.compress.codec</name> 
    <value>org.apache.hadoop.io.compress.LzoCodec</value> 
    </property> 

    <property> 
    <name>tez.history.logging.service.class</name> 
    <value>org.apache.tez.dag.history.logging.ats.ATSHistoryLoggingService</value> 
    </property> 

    <property> 
    <name>tez.tez-ui.history-url.base</name> 
    <value>http://ip-172-30-2-16.us-west-2.compute.internal:8080/tez-ui/</value> 
    </property> 
</configuration> 

Câu hỏi -

  1. Quy trình nào đã xóa tệp này? Đối với tổ ong, tệp này chỉ có ở đó. (Ngoài ra, tệp này không được tạo bởi mã ứng dụng.)
  2. Khi tôi chạy số lần truy vấn không thành công, nó sẽ vượt qua. Tại sao có hành vi mơ hồ?
  3. Vì tôi chỉ nâng cấp phiên bản hive-exec, hive-jdbc lên 2.1.0. Vì vậy, có vẻ như một số thuộc tính cấu hình hive bị đặt sai hoặc một số thuộc tính bị thiếu. Bạn có thể giúp tôi trong việc tìm các thuộc tính hive/set bị lỗi không?

Lưu ý - Tôi đã nâng cấp phiên bản hive-exec từ 0.13.0 lên 2.1.0. Trong phiên bản trước, tất cả các truy vấn đều hoạt động tốt.

Update-1

Khi tôi khởi động cụm khác, nó làm việc tốt. Tôi đã kiểm tra 3 lần trên cùng một ETL.

Khi tôi làm điều tương tự một lần nữa trên cụm mới, nó cũng hiển thị cùng một ngoại lệ. Không thể hiểu được, tại sao sự mơ hồ này đang xảy ra.

Giúp tôi hiểu sự mơ hồ này.

Tôi ngây thơ khi giao dịch với Hive. Vì vậy, có ít ý tưởng về khái niệm này.

Update-2-

hfs bản ghi dưới Cụm Công Tên DNS: 50.070 -

2016-09-20 11:31:55,155 WARN org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicy (IPC Server handler 11 on 8020): Failed to place enough replicas, still in need of 1 to reach 1 (unavailableStorages=[], storagePolicy=BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]}, newBlock=true) For more information, please enable DEBUG log level on org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicy 2016-09-20 11:31:55,155 WARN org.apache.hadoop.hdfs.protocol.BlockStoragePolicy (IPC Server handler 11 on 8020): Failed to place enough replicas: expected size is 1 but only 0 storage types can be selected (replication=1, selected=[], unavailable=[DISK], removed=[DISK], policy=BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]}) 2016-09-20 11:31:55,155 WARN org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicy (IPC Server handler 11 on 8020): Failed to place enough replicas, still in need of 1 to reach 1 (unavailableStorages=[DISK], storagePolicy=BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]}, newBlock=true) All required storage types are unavailable: unavailableStorages=[DISK], storagePolicy=BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]} 2016-09-20 11:31:55,155 INFO org.apache.hadoop.ipc.Server (IPC Server handler 11 on 8020): IPC Server handler 11 on 8020, call org.apache.hadoop.hdfs.protocol.ClientProtocol.addBlock from 172.30.2.207:56462 Call#7497 Retry#0 java.io.IOException: File /user/hive/warehouse/bc_kmart_3813.db/dp_internal_temp_full_load_offer_flexibility_20160920/.hive-staging_hive_2016-09-20_11-17-51_558_1222354063413369813-58/_task_tmp.-ext-10000/_tmp.000079_0 could only be replicated to 0 nodes instead of minReplication (=1). There are 1 datanode(s) running and no node(s) are excluded in this operation. at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget4NewBlock(BlockManager.java:1547) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getNewBlockTargets(FSNamesystem.java:3107) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:3031) at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:724) at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:492) at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java) at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:616) at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:969) at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2049) at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2045) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657) at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2043)

Khi tôi đã tìm kiếm ngoại lệ này. Tôi đã tìm thấy trang này - https://wiki.apache.org/hadoop/CouldOnlyBeReplicatedTo

Trong cụm của tôi, có một nút dữ liệu với dung lượng đĩa 32 GB.

** /etc/hive/conf/hive-default.xml.template - **

<property> 
    <name>hive.exec.stagingdir</name> 
    <value>.hive-staging</value> 
    <description>Directory name that will be created inside table locations in order to support HDFS encryption. This is replaces ${hive.exec.scratchdir} for query results with the exception of read-only tables. In all cases ${hive.exec.scratchdir} is still used for other temporary files, such as job plans.</description> 
    </property> 

thắc mắc nào

  1. Theo nhật ký, thư mục hive-dàn được tạo ra trong cụm máy, theo /var/log/hadoop-hdfs/hadoop-hdfs-datanode-ip-172-30-2-189.log, thì tại sao nó cũng tạo cùng một thư mục trong s3?

Update-3-

Một số trường hợp ngoại lệ là các loại - LeaseExpiredException -

2016-09-21 08:53:17,995 INFO org.apache.hadoop.ipc.Server (IPC Server handler 13 on 8020): IPC Server handler 13 on 8020, call org.apache.hadoop.hdfs.protocol.ClientProtocol.complete from 172.30.2.189:42958 Call#726 Retry#0: org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException: No lease on /tmp/hive/hadoop/_tez_session_dir/6ebd2d18-f5b9-4176-ab8f-d6c78124b636/.tez/application_1474442135017_0022/recovery/1/summary (inode 20326): File does not exist. Holder DFSClient_NONMAPREDUCE_1375788009_1 does not have any open files.

+0

Giải thích LeaseExpiredVề vấn đề ngoại lệ chi tiết tại đây - stackoverflow.com/questions/39619130/… Hãy giúp tôi, nếu có ai gặp vấn đề tương tự. Tôi đã dành nhiều ngày để tìm ra nguyên nhân gốc rễ, nhưng không thể tìm thấy điều đó. – devsda

Trả lời

2

tôi giải quyết vấn đề này. Hãy để tôi giải thích chi tiết.

Exceptions đó là đến -

  1. LeaveExpirtedException - từ HDFS phụ.
  2. FileNotFoundException - từ phía Hive (khi Tez động cơ thực hiện thực hiện DAG)

Vấn đề scenario-

  1. Chúng tôi chỉ cần nâng cấp phiên bản hive từ 0.13.0 đến 2.1.0. Và, mọi thứ đã hoạt động tốt với phiên bản trước. Không có ngoại lệ thời gian chạy.

những suy nghĩ khác nhau để giải quyết vấn đề -

  1. suy nghĩ đầu tiên được, hai luồng đã làm việc trên cùng một mảnh vì NN tình báo. Nhưng theo dưới đây thiết lập

    bộ mapreduce.map.speculative = false bộ mapreduce.reduce.speculative = false

đó là không thể.

  1. sau đó, tôi tăng số 1000-100.000 cho cài đặt dưới đây -

    SET hive.exec.max.dynamic.partitions = 100000; SET hive.exec.max.dynamic.partitions.pernode = 100000;

cũng không hoạt động.

  1. Sau đó, suy nghĩ thứ ba là, chắc chắn trong cùng một quá trình, những gì mapper-1 được tạo ra đã bị xóa bởi một người lập bản đồ/giảm tốc khác. Nhưng, chúng tôi không tìm thấy bất kỳ nhật ký nào như vậy trong các nhật ký của Hveserver2, Tez.

  2. Cuối cùng nguyên nhân gốc nằm trong chính mã lớp ứng dụng. Trong phiên bản hive-exec-2.1.0, họ giới thiệu sở hữu cấu hình mới

    "hive.exec.stagingdir": "hive-dàn."

Mô tả bất động sản trên -

Tên thư mục sẽ được tạo bên trong các vị trí bảng để hỗ trợ mã hóa HDFS. Điều này sẽ thay thế $ {hive.exec.scratchdir} cho kết quả truy vấn ngoại trừ các bảng chỉ đọc. Trong mọi trường hợp, $ {hive.exec.scratchdir} vẫn được sử dụng cho các tệp tạm thời khác, chẳng hạn như làm kế hoạch công việc.

Vì vậy, nếu có bất kỳ công việc đồng thời nào trong Mã lớp ứng dụng (ETL) và đang hoạt động (đổi tên/xóa/di chuyển) trên cùng một bảng thì có thể dẫn đến sự cố này.

Và, trong trường hợp của chúng tôi, 2 công việc đồng thời đang thực hiện "INSERT OVERWRITE" trên cùng một bảng, dẫn đến xóa tệp siêu dữ liệu của 1 bản đồ, điều này gây ra sự cố này.

Nghị quyết -

  1. Move vị trí tập tin siêu dữ liệu để bảng bên ngoài (bảng nằm trong S3).
  2. Tắt mã hóa HDFS (như đã đề cập trong Mô tả thuộc tính stagingdir.)
  3. Thay đổi mã lớp ứng dụng của bạn để tránh sự cố đồng thời.
+0

Đối với độ phân giải (1) - bạn có duy trì vị trí của hive.exec.stagingdir trên s3 không? Hay bạn đã chuyển hướng đến HDFS? – etliens

+0

Hey! Vậy bạn đã thay đổi thuộc tính hive.exec.stagingdir ở đâu? – jackStinger

+1

@etilens - Có, vị trí chỉ có trên S3. – devsda

Các vấn đề liên quan