Как исправить «Файл может быть реплицирован только на 0 узлов вместо minReplication (= 1).»? - PullRequest
0 голосов
/ 06 февраля 2019

Я задал похожий вопрос некоторое время назад и подумал, что решил эту проблему, но оказалось, что она ушла просто потому, что я работал над меньшим набором данных.

Многочисленныелюди задавали этот вопрос, и я просмотрел все посты в интернете, которые смог найти, но до сих пор не достиг прогресса.

Я пытаюсь сделать следующее: у меня есть внешняя таблица 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 гигабайт дополнительных данных - это копейки на доллар, так что, вероятно, проблема с оперативной памятью?

Вот мой вывод отчета dfs:

enter image description here

Я пробовал это на всех механизмах исполнения: spark, tez,mr.

Пожалуйста, не предлагайте решения, в которых говорится, что мне нужно отформатировать наменоде, потому что они не работают и не являются решениями.

обновление:

После просмотра журналов для namenode я заметил это, если это помогает:

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]}

Эти журналы предлагают это:

Для получения дополнительной информации, пожалуйста, включите уровень журнала DEBUGна org.apache.hadoop.hdfs.ser ver.blockmanagement.BlockPlacementPolicy и org.apache.hadoop.net.NetworkTopology

Как мне это сделать?

Я также заметилпохожий неразрешенный пост здесь:

HDP 2.2 @ Linux / CentOS @ OracleVM (Hortonworks) завершается неудачно при удаленной отправке из Eclipse @ Windows

обновление 2:

Я только что попытался разделить это искрой, и это работает!Итак, это должно быть ошибка улья ...

обновление 3:

Только что протестировал это на MapR, и это сработало, но MapR не использует HDFS.Это определенно какая-то ошибка комбинации HDFS + Hive.

Доказательство:

enter image description here

1 Ответ

0 голосов
/ 16 февраля 2019

Я закончил тем, что обратился к форумам cloudera, и они ответили на мой вопрос в считанные минуты: http://community.cloudera.com/t5/Storage-Random-Access-HDFS/Why-can-t-I-partition-a-1-gigabyte-dataset-into-300/m-p/86554#M3981 Я попробовал то, что предлагает Harsh J, и это сработало отлично!

Вот что он сказал:

Если вы имеете дело с неупорядоченным разбиением из источника данных, вы можете в конечном итоге создать множество файлов параллельно при попытке разбиения.

В HDFS, когда файл (или, более конкретно, его блок) открыт, DataNode выполняет логическое резервирование своего целевого размера блока.Таким образом, если настроенный размер блока составляет 128 МБ, то каждый одновременно открытый блок будет вычитать это значение (логически) из доступного оставшегося пространства, которое DataNode публикует в NameNode.

Это резервирование выполняется для управления пространством и гарантируетполной записи блока клиенту, чтобы клиент, начавший запись своего файла, никогда не сталкивался с исключением из-за нехватки места на полпути.

Примечание. Когда файл закрыт, сохраняется только фактическая длинаи расчет резервирования корректируется с учетом реальности используемого и доступного пространства.Однако, хотя файловый блок остается открытым, всегда считается, что он содержит полный размер блока.

Далее NameNode будет выбирать только DataNode для записи, если он может гарантировать полный размер целевого блока.Он будет игнорировать любые узлы данных, которые он сочтет (на основании своих сообщенных значений и метрик) непригодными для параметров запрошенной записи.Ваша ошибка показывает, что NameNode прекратил рассмотрение вашего единственного действующего DataNode при попытке выделить новый запрос блока.

Например, 70 ГБ доступного пространства окажется недостаточным, если будет одновременно более 560 открытыхфайлы (70 ГиБ, разделенные на блоки размером 128 МБ).Таким образом, DataNode будет «казаться заполненным» в точке ~ 560 открытых файлов и больше не будет служить допустимой целью для дальнейших запросов файлов.

В вашем описании вставки указывается, что это вероятно,поскольку каждый из 300 фрагментов набора данных может по-прежнему иметь различные идентификаторы, что приводит к большому количеству открытых файлов, запрошенных для каждой параллельной задачи, для вставки в несколько различных разделов.

уменьшение размера блока запроса в запросе (например, установите dfs.blocksize равным 8 МБ), что влияет на расчет резервирования.Тем не менее, это может не быть хорошей идеей для больших наборов данных при масштабировании, так как это увеличит размер файла: количество блоков и увеличит затраты памяти для NameNode.

Лучшим способом решения этой проблемы было бы выполнениепредварительно разделенная вставка (сортировка сначала по разделам, а затем вставка по разделам).Например, Hive предоставляет это в качестве опции: hive.optimize.sort.dynamic.partition , и если вы используете обычный Spark или MapReduce, то стратегия разделения по умолчанию делает именно это.

Итак, в конце дня я сделал set hive.optimize.sort.dynamic.partition=true;, и все начало работать.Но я также сделал другое.

Вот один из моих постов, сделанных ранее, когда я исследовал эту проблему: Почему при записи в секционированную таблицу я получаю сообщение «Файл может быть реплицирован только на 0 узлов»? Я столкнулся с проблемой, когда улей не мог разбить мой набор данных, потому что hive.exec.max.dynamic.partitions был установлен на 100, поэтому я погуглил эту проблему и где-то на форумах hortonworks увидел ответ, сказав, что я долженпросто сделайте это:

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

Это была другая проблема, возможно, hive пытается открыть столько одновременных соединений, сколько вы установили hive.exec.max.dynamic.partitions, поэтому мой запрос insert не начал работать, пока я не уменьшилсяэти значения до 500.

...