我还是 Hadoop 的新手,这次我尝试处理一个 106GB 的文件。我曾经-copyFromLocal
将那个大文件复制到我的 Hadoop DFS,但由于文件很大,我不得不等待很长时间,而没有关于当前复制状态的线索。
有没有办法用这个命令显示当前的文件复制状态?
提前感谢你们的帮助!
我们正准备实施我们的第一个 Hadoop 集群。因此,我们从四节点设置开始。(1 个主节点和 3 个工作节点)每个节点将有 6TB 的存储空间。(6 x 1TB 磁盘)我们采用了 SuperMicro 4 节点机箱,以便所有四个节点共享一个 4U 机箱。
我们现在正在研究如何备份此解决方案以进行灾难恢复。(考虑机架或站点丢失,而不是驱动器丢失)最好的解决方案似乎是集群到集群的复制。虽然我也读过有关人们将数据复制到 NAS 或 SMB 共享的信息。此外,我们将通过传统备份方式备份主节点。我只关心 HDFS 数据。以下是我的问题:
1)对于集群到集群的复制,我可以设置一个具有大量存储空间的单节点集群作为我的异地副本吗?我不关心它的性能,只关心它的存在和保存整个数据集的能力。(恢复时间不是问题,因为该集群不是关键任务)是否可以安排副本使其每天只运行一次,等等?
2)对于 SMB 或 NAS 选项,这是如何工作的?目标盘需要格式化HDFS吗?我是否需要完整备份三个工作节点中的每一个?或者是否有一些智能脚本可以在没有奇偶校验的情况下备份数据集?我对这个解决方案不是很熟悉,只在网上看到过对它的引用。我在查找资源或信息方面运气不佳。
我也对 Hadoop HDFS 的任何其他 DR 选项持开放态度。我们的目标是获得 HDFS 数据集的完整副本,以便我们可以使用它从机架或站点丢失中恢复。
谢谢!
更新 4,215:
查看hdfs内部的空间使用情况后,我发现 .oldlogs 使用了大量空间:
1485820612766 /hbase/.oldlogs
Run Code Online (Sandbox Code Playgroud)
所以新问题:
同样作为作业 scollector 不会监视各种 hdfs 目录的磁盘空间使用情况....
看起来以下错误在那个时候开始重复填充日志,不确定它们的确切含义:
2014-11-25 01:44:47,673 FATAL org.apache.hadoop.hbase.regionserver.wal.HLog: Could not sync. Requesting close of hlog
java.io.IOException: Reflection
at org.apache.hadoop.hbase.regionserver.wal.SequenceFileLogWriter.sync(SequenceFileLogWriter.java:310)
at org.apache.hadoop.hbase.regionserver.wal.HLog.syncer(HLog.java:1405)
at org.apache.hadoop.hbase.regionserver.wal.HLog.syncer(HLog.java:1349)
at org.apache.hadoop.hbase.regionserver.wal.HLog.sync(HLog.java:1511)
at org.apache.hadoop.hbase.regionserver.wal.HLog$LogSyncer.run(HLog.java:1301)
at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.GeneratedMethodAccessor30.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.hbase.regionserver.wal.SequenceFileLogWriter.sync(SequenceFileLogWriter.java:308)
... 5 more
Caused by: java.io.IOException: Failed to add a datanode. User may turn off this feature by setting dfs.client.block.write.replace-datanode-on-failure.policy in …
Run Code Online (Sandbox Code Playgroud) 当我将文件加载到 HDFS 时,我需要将文件的块大小设置为低于集群块大小的某个值。例如,如果 HDFS 使用 64mb 块,我可能希望将一个大文件复制到 32mb 块中。
我之前使用org.apache.hadoop.fs.FileSystem.create()函数在 Hadoop 工作负载中完成了此操作,但是有没有办法从命令行执行此操作?
有人对 HDFS 前向同步有什么好的建议吗?(“前向同步”与“双向同步”相反)
基本上我有大量的文件要放入 HDFS。它太大了,以至于我经常会在它完成之前失去连接。我想做的只是对我的文件上传做一个“简历”。但是hadoop fs -put
只会再次上传整个目录(或抱怨它是否存在)。
有人有继续不完整的hdfs上传的好方法吗?
我一直在研究分布式数据库和文件系统,虽然我最初对 Hadoop/HBase 最感兴趣,因为我是一名 Java 程序员,但我发现了这个关于Ceph 的非常有趣的文档,它作为一个主要的加分点,现在集成在Linux内核。
有一件事我不明白,我希望你们中的一位能向我解释。这里是:
一个简单的哈希函数将对象标识符 (OID) 映射到一个归置组,即一组存储对象及其所有副本的 OSD。有数量有限的归置组来创建 OSD 数量的上限,这些 OSD 存储存储在任何给定 OSD 上的对象的副本。该数字越高,多个节点的故障导致数据丢失的可能性就越大。例如,如果每个 OSD 与其他每个 OSD 都有副本关系,那么整个集群中仅三个节点的故障就可以清除所有三个副本上存储的数据。
您能否向我解释为什么更多的归置组会增加数据丢失的可能性?我会认为这是相反的。
我有一个 5 从站 Hadoop 集群(使用 CDH4)---从站是运行 DataNode 和 TaskNode 的地方。每个从站有 4 个专用于 HDFS 存储的分区。其中一个从站需要重新安装,这导致其中一个 HDFS 分区丢失。此时,HDFS 抱怨丢失了 35K 块。
几天后,重新安装完成,我将节点重新联机到 Hadoop。HDFS 仍处于安全模式,并且新服务器没有注册接近其他节点的块数量。例如,在 DFS Admin 下,新节点显示它有 6K 块,而其他节点有大约 400K 块。
目前,新节点的 DataNode 日志显示它正在对各种块进行一些验证(或复制?),其中一些由于已经存在而失败。我相信这是 HDFS 只是将现有数据复制到新节点。验证示例:
2013-08-09 17:05:02,113 INFO org.apache.hadoop.hdfs.server.datanode.BlockPoolSliceScanner: Verification succeeded for BP-143510735-141.212.113.141-1343417513962:blk_6568189110100209829_1733272
Run Code Online (Sandbox Code Playgroud)
失败示例:
2013-08-09 17:04:48,100 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: meez02.eecs.umich.edu:50010:DataXceiver error processing REPLACE_BLOCK operation src: /141.212.113.141:52192 dest: /141.212.113.65:50010
org.apache.hadoop.hdfs.server.datanode.ReplicaAlreadyExistsException: Block BP-143510735-141.212.113.141-1343417513962:blk_-4515068373845130948_756319 already exists in state FINALIZED and thus cannot be created.
at org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl.createTemporary(FsDatasetImpl.java:813)
at org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsDatasetImpl.createTemporary(FsDatasetImpl.java:92)
at org.apache.hadoop.hdfs.server.datanode.BlockReceiver.<init>(BlockReceiver.java:155)
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.replaceBlock(DataXceiver.java:846)
at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.opReplaceBlock(Receiver.java:137)
at …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种zgrep
hdfs
文件方式
就像是:
hadoop fs -zcat hdfs://myfile.gz | grep "hi"
Run Code Online (Sandbox Code Playgroud)
或者
hadoop fs -cat hdfs://myfile.gz | zgrep "hi"
Run Code Online (Sandbox Code Playgroud)
它对我来说真的不起作用,无论如何都可以通过命令行来实现吗?