我如何修复“文件只能被复制到0个节点而不是minReplication(= 1)。”?

问题描述 投票:2回答:1

I asked a similar question a while ago,并认为我解决了这个问题,但事实证明它只是因为我正在研究一个较小的数据集而消失了。

很多人都提出了这个问题,我已经浏览了每一个我能找到的互联网帖子,但仍然没有取得任何进展。

我正在尝试做的是:我在蜂巢中有一个外部表browserdata,它指的是大约1千兆字节的数据。我尝试将这些数据粘贴到分区表partbrowserdata中,其定义如下:

CREATE EXTERNAL TABLE IF NOT EXISTS partbrowserdata (                                                                                                                                                              
    BidID string,                                                                                                                                                                                                  
    Timestamp_ string,                                                                                                                                                                                             
    iPinYouID string,                                                                                                                                                                                              
    UserAgent string,                                                                                                                                                                                              
    IP string,                                                                                                                                                                                                     
    RegionID int,                                                                                                                                                                                                  
    AdExchange int,                                                                                                                                                                                                
    Domain string,                                                                                                                                                                                                 
    URL string,                                                                                                                                                                                                    
    AnonymousURL string,                                                                                                                                                                                           
    AdSlotID string,                                                                                                                                                                                               
    AdSlotWidth int,                                                                                                                                                                                               
    AdSlotHeight int,                                                                                                                                                                                              
    AdSlotVisibility string,                                                                                                                                                                                       
    AdSlotFormat string,                                                                                                                                                                                           
    AdSlotFloorPrice decimal,                                                                                                                                                                                      
    CreativeID string,                                                                                                                                                                                             
    BiddingPrice decimal,                                                                                                                                                                                          
    AdvertiserID string,                                                                                                                                                                                           
    UserProfileIDs array<string>                                                                                                                                                                                   
)                                                                                                                                                                                                                  
PARTITIONED BY (CityID int)                                                                                                                                                                                        
ROW FORMAT DELIMITED                                                                                                                                                                                               
FIELDS TERMINATED BY '\t'                                                                                                                                                                                          
STORED AS TEXTFILE                                                                                                                                                                                                 
LOCATION '/user/maria_dev/data2';

使用此查询:

insert into table partbrowserdata partition(cityid) 
select BidID,Timestamp_ ,iPinYouID ,UserAgent ,IP ,RegionID ,AdExchange ,Domain ,URL ,AnonymousURL ,AdSlotID ,AdSlotWidth ,AdSlotHeight ,AdSlotVisibility ,AdSlotFormat ,AdSlotFloorPrice ,CreativeID ,BiddingPrice ,AdvertiserID ,UserProfileIDs ,CityID 
from browserdata;

每次,在每个平台上,无论是hortonworks还是cloudera,我都会收到这样的信息:

Caused by: 

org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /user/maria_dev/data2/.hive-staging_hive_2019-02-06_18-58-39_333_7627883726303986643-1/_task_tmp.-ext-10000/cityid=219/_tmp.000000_3 could only be replicated to 0 nodes instead of minReplication (=1).  There are 4 datanode(s) running and no node(s) are excluded in this operation.
        at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget4NewBlock(BlockManager.java:1720)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:3389)
        at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:683)
        at org.apache.hadoop.hdfs.server.namenode.AuthorizationProviderProxyClientProtocol.addBlock(AuthorizationProviderProxyClientProtocol.java:214)
        at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:495)
        at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:617)
        at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1073)
        at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2217)
        at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2213)
        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:1917)
        at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2211)

        at org.apache.hadoop.ipc.Client.call(Client.java:1504)
        at org.apache.hadoop.ipc.Client.call(Client.java:1441)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:230)
        at com.sun.proxy.$Proxy14.addBlock(Unknown Source)
        at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.addBlock(ClientNamenodeProtocolTranslatorPB.java:413)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:258)
        at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:104)
        at com.sun.proxy.$Proxy15.addBlock(Unknown Source)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.locateFollowingBlock(DFSOutputStream.java:1814)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1610)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:773)

我该怎么办?我不明白为什么会这样。它确实看起来像一个内存问题,因为我能够插入几行,但不是因为某些原因而插入所有行。请注意,我在HDFS上有足够的内存,因此1美元的额外数据是1美元的便士,所以它可能是RAM问题?

这是我的dfs报告输出:

enter image description here

我在所有执行引擎上尝试过这个:qazxsw poi,qazxsw poi,qazxsw poi。

请不要建议说我需要格式化namenode的解决方案,因为它们不起作用,并且它们不是任何方式的解决方案。

更新:

在查看namenode的日志后,我注意到了这一点,如果它有帮助:

spark

这些日志表明:

有关更多信息,请在org.apache.hadoop.hdfs.ser ver.blockmanagement.BlockPlacementPolicy和org.apache.hadoop.net.NetworkTopology上启用DEBUG日志级别。

我怎么做?

我还注意到这里有类似的未解决的帖子:

tez

更新2:

我刚尝试用spark分区,它的工作原理!所以,这一定是一个蜂巢虫......

更新3:

刚刚在MapR上测试了它并且它可以工作,但MapR不使用HDFS。这绝对是某种HDFS + Hive组合错误。

证明:

mr

hadoop hive hdfs yarn cloudera
1个回答
3
投票

我最终联系了cloudera论坛,他们在几分钟内回答了我的问题: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], stor agePolicy=BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]} 我尝试了Harsh J的建议并且它工作得很好!

这是他说的话:

如果您正在处理来自数据源的无序分区,则在尝试分区时,最终可能会并行创建大量文件。

在HDFS中,当文件(或更具体地,其块)打开时,DataNode执行其目标块大小的逻辑保留。因此,如果您配置的块大小为128 MiB,则每个同时打开的块将从DataNode发布到NameNode的可用剩余空间中(逻辑上)扣除该值。

此预留是为了帮助管理空间并保证对客户端进行完整的块写入,以便开始编写其文件的客户端在中途永远不会遇到空间异常。

注意:文件关闭时,仅保留实际长度,并调整预留计算以反映已使用和可用空间的实际情况。但是,虽然文件块保持打开状态,但它始终被视为保持整个块大小。

如果NameNode可以保证完整的目标块大小,则它还将仅为写入选择DataNode。它将忽略它认为的任何DataNode(基于其报告的值和指标),不适合所请求的写入参数。您的错误显示NameNode在尝试分配新的块请求时已停止考虑您的唯一实时DataNode。

例如,如果将有超过560个并发的打开文件(70 GiB分成128个MiB块大小),则70 GiB的可用空间将证明不足。因此,DataNode将在~560个打开文件时“显示为满”,并且将不再作为进一步文件请求的有效目标。

根据您对插入的描述,可能会出现这种情况,因为数据集的300个块中的每个块仍可能携带不同的ID,从而导致每个并行任务请求大量打开的文件,以插入到多个不同的分区中。

你可以通过减少查询中的请求块大小来“破解”你的方法(例如,将dfs.blocksize设置为8 MiB),从而影响预留计算。但是,在扩展时,这对于较大的数据集可能不是一个好主意,因为它会驱动文件:块计数并增加NameNode的内存成本。

解决此问题的更好方法是执行预分区插入(首先按分区排序,然后以分区方式插入)。例如,Hive提供了这个选项:HDP 2.2@Linux/CentOS@OracleVM (Hortonworks) fails on remote submission from Eclipse@Windows,如果你使用普通的Spark或MapReduce,那么他们的默认分区策略就是这样做的。

所以,在一天结束时,我做了enter image description here,一切都开始工作了。但我也做了另一件事。

这是我之前的一篇帖子,因为我正在研究这个问题:http://community.cloudera.com/t5/Storage-Random-Access-HDFS/Why-can-t-I-partition-a-1-gigabyte-dataset-into-300/m-p/86554#M3981我遇到了一个问题,hive无法对我的数据集进行分区,因为hive.optimize.sort.dynamic.partition被设置为set hive.optimize.sort.dynamic.partition=true;,所以,我搜索了这个问题,我在hortonworks论坛的某个地方看到了一个答案,说我应该这样做:

Why do I get "File could only be replicated to 0 nodes" when writing to a partitioned table?

这是另一个问题,也许hive试图打开尽可能多的并发连接,因为你设置hive.exec.max.dynamic.partitions,所以我的100查询没有开始工作,直到我将这些值减少到SET hive.exec.max.dynamic.partitions=100000; SET hive.exec.max.dynamic.partitions.pernode=100000;

© www.soinside.com 2019 - 2024. All rights reserved.