基本上整个问题都在标题中.我想知道是否可以同时从多台计算机上附加到位于HDFS上的文件?类似于存储由多个进程不断产生的事件流的东西.订单并不重要.
我记得听过谷歌技术演示文稿之一,GFS支持这样的追加功能,但尝试使用HDFS进行一些有限的测试(使用常规文件追加()或使用SequenceFile)似乎不起作用.
谢谢,
我试图这样做hdfs dfs -pwd,但该命令不存在.所以目前我诉诸干什么hdfs dfs -ls ..其次hdfs dfs -ls ../...
我也查看了命令列表,hdfs dfs但没有看到任何看起来很有希望的东西.
有没有更直接的方法来找到绝对路径?
yarn.scheduler.maximum-allocation-mb和之间有什么区别yarn.nodemanager.resource.memory-mb?
我看到了这两个,yarn-site.xml我在这里看到了解释.
yarn.scheduler.maximum-allocation-mb给出以下定义:RM中每个容器请求的最大分配,以MB为单位.高于此值的内存请求将抛出InvalidResourceRequestException. 这是否意味着仅在资源管理器上的内存请求受此值的限制?
并且yarn.nodemanager.resource.memory-mb给出了可以为容器分配的物理内存量(MB)的定义. 这是否意味着整个集群中所有容器的总量总和在一起?
我还是无法辨别这些.这些解释让我觉得它们是一样的.
更令人困惑的是,它们的默认值完全相同:8192 mb.我如何区分这些?谢谢.
你如何通过Java在HDFS中的某个路径下列出所有文件(递归).我浏览了API并注意到了FileSystem.listFiles(Path,boolean),但是当我初始化它时,我的FileSystem实例中看起来不存在该方法.
我在hdfs中有一个文件夹,它有两个子文件夹,每个子文件夹有大约30个子文件夹,最后每个子文件夹包含xml文件.我想列出所有只提供主文件夹路径的xml文件.在本地我可以使用apache commons-io的 FileUtils.listFiles()来做到这一点.我试过这个
FileStatus[] status = fs.listStatus( new Path( args[ 0 ] ) );
Run Code Online (Sandbox Code Playgroud)
但它只列出了两个第一个子文件夹,并没有更进一步.在hadoop有没有办法做到这一点?
我们都知道,与传统文件系统中的块大小相比,HDFS中的块大小相当大(64M或128M).这样做是为了减少与传输时间相比的寻道时间百分比(因此,传输速率的改进比磁盘寻道时间的改进大得多,因此设计文件系统时的目标始终是减少与要转移的数据量相比的寻求次数).但是这带来了内部碎片的另一个缺点(这就是为什么传统的文件系统块大小不是那么高并且只有几KB的量级 - 通常是4K或8K).
我正在阅读这本书 - Hadoop,权威指南,并发现这写在某个地方,一个小于HDFS块大小的文件不占用整个块,并没有占到整个块的空间,但无法理解如何?有人可以对此有所了解.
我想读取文件路径,无论它们是HDFS还是本地路径.目前,我传递带有前缀file://的本地路径和带有前缀hdfs://的HDFS路径,并编写如下代码
Configuration configuration = new Configuration();
FileSystem fileSystem = null;
if (filePath.startsWith("hdfs://")) {
fileSystem = FileSystem.get(configuration);
} else if (filePath.startsWith("file://")) {
fileSystem = FileSystem.getLocal(configuration).getRawFileSystem();
}
Run Code Online (Sandbox Code Playgroud)
从这里我使用FileSystem的API来读取文件.
如果还有其他比这更好的方法,你能告诉我吗?
Hadoop是一致的和分区容忍的,即它属于CAP theoram的CP类别.
Hadoop不可用,因为所有节点都依赖于名称节点.如果名称节点落下,则群集将关闭.
但考虑到HDFS集群有一个辅助名称节点,为什么我们不能将hadoop称为可用.如果名称节点已关闭,则辅助名称节点可用于写入.
名称节点和辅助名称节点之间的主要区别是什么使hadoop不可用.
提前致谢.
我无法将数据附加到HDFS中的现有文件中.我希望如果文件存在然后附加一行,如果没有,创建一个名称给定的新文件.
这是我写入HDFS的方法.
if (!file.exists(path)){
file.createNewFile(path);
}
FSDataOutputStream fileOutputStream = file.append(path);
BufferedWriter br = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
br.append("Content: " + content + "\n");
br.close();
Run Code Online (Sandbox Code Playgroud)
实际上这个方法写入HDFS并创建一个文件,但正如我所提到的那样没有追加.
这是我测试我的方法的方法:
RunTimeCalculationHdfsWrite.hdfsWriteFile("RunTimeParserLoaderMapperTest2", "Error message test 2.2", context, null);
Run Code Online (Sandbox Code Playgroud)
第一个参数是文件的名称,第二个参数是消息,另外两个参数不重要.
所以任何人都知道我错过了什么或做错了什么?
我刚刚下载了Hortonworks沙盒VM,里面有Hadoop版本2.7.1.我通过使用添加一些文件
hadoop fs -put /hw1/* /hw1
Run Code Online (Sandbox Code Playgroud)
...命令.之后我将删除添加的文件
hadoop fs -rm /hw1/*
Run Code Online (Sandbox Code Playgroud)
...命令,并在清理回收站后,通过
hadoop fs -expunge
Run Code Online (Sandbox Code Playgroud)
...命令.但是在重新清洗后,DFS剩余空间没有改变.即使我可以看到数据真的从/ hw1 /和recyle bin中删除了.我有fs.trash.interval parameter = 1.
实际上我可以在/hadoop/hdfs/data/current/BP-2048114545-10.0.2.15-1445949559569/current/finalized/subdir0/subdir2文件夹中找到所有我的数据分块,这真的让我感到惊讶,因为我希望它们被删除.
那么我的问题是如何以真正删除的方式删除数据?经过几次添加和删除后,我的空闲空间耗尽了.