- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我是 Hadoop 新手。最近我正在尝试处理(仅读取)hdfs/hadoop 上的许多小 文件。平均文件大小约为1 kb,文件数量超过10M。由于某些限制,该程序必须用 C++ 编写。
这只是一个性能评估,所以我只使用 5 台机器作为数据节点。每个数据节点有5个数据盘。
我编写了一个小型 C++ 项目来直接从硬盘读取文件(而不是从 HDFS)以构建性能基线。该程序将为每个磁盘创建 4 个读取线程。性能结果是每个磁盘大约有 14MB/s。总吞吐量约为 14MB/s * 5 * 5 = 350MB/s(14MB/s * 5 磁盘 * 5 台机器)。
但是,当这个程序(仍然使用 C++,动态链接到 libhdfs.so,创建 4*5*5=100 个线程)从 hdfs 集群读取文件时,吞吐量大约只有 55MB/秒。
如果在 mapreduce 中触发此编程(hadoop streaming,5 个作业,每个作业有 20 个线程,线程总数仍然是 100),吞吐量下降到大约 45MB/s。 (我猜它会因为一些簿记过程而变慢)。
我想知道 HDFS 可以提供的合理性能是多少。可以看到,与原生代码相比,数据吞吐量只有1/7左右。是我配置的问题吗?还是 HDFS 限制?还是Java限制?我的场景的最佳方式是什么?序列文件会有帮助吗(很多)?与我们预期的 native IO 读取相比,合理的吞吐量是多少?
这是我的一些配置:
NameNode 堆大小 32G。
Job/Task 节点堆大小 8G。
NameNode 处理程序计数:128
DataNode 处理程序数:8
DataNode最大传输线程数:4096
1GBps 以太网。
谢谢。
最佳答案
HDFS 确实不是为很多小文件设计的。
对于您读取的每个新文件,客户端必须与名称节点对话,名称节点会提供文件 block 的位置,然后客户端从数据节点流式传输数据。
现在,在最好的情况下,客户端这样做一次,然后发现它是有数据的机器,并且可以直接从磁盘读取数据。这将很快:与直接磁盘读取相当。
如果不是机器上有数据,那么它必须通过网络传输数据。然后你会受到网络 I/O 速度的限制,这应该不是很糟糕,但仍然比直接磁盘读取慢一点。
但是,您遇到了更糟糕的情况——与名称节点通信的开销变得很大。对于只有 1KB 的文件,您将达到交换元数据与实际数据一样多的地步。客户端必须进行两次独立的网络交换才能从每个文件中获取数据。除此之外,namenode 可能会受到所有这些不同线程的攻击,因此它可能成为瓶颈。
所以要回答你的问题,是的,如果你将 HDFS 用于它不是设计用于的东西,它会很慢。合并您的小文件,并使用 MapReduce 获取数据局部性,您将获得更好的性能。事实上,因为您将能够更好地利用顺序磁盘读取,所以如果从一个大的 HDFS 文件中读取比读取许多小的本地文件更快我也不会感到惊讶。
关于performance - 小文件的 HDFS 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13993143/
HDFS 是 Hadoop 中的逻辑文件系统,块大小为 64MB。 HDFS 上的文件依次保存在底层操作系统文件系统上,比如 ext4,块大小为 4KiB。 据我所知,对于本地文件系统上的文件,操作系
哪种工具最适合测量 HDFS 空间消耗? 当我总结“hdfs dfs -du/”的输出时,与“hdfs dfsadmin -report”(“DFS Used”行)相比,我总是消耗更少的空间。是否有
我正在尝试编写一个简单的脚本来验证 HDFS 和本地文件系统校验和。 在 HDFS 上我得到 - [m@x01tbipapp3a ~]$ hadoop fs -checksum /user/m/fil
我从 HDFS 中删除了一个文件夹,我在下面找到了它 /user/hdfs/.Trash/Current/ 但我无法恢复它。我查看了论坛,但没有找到好的解决方案。 请有人有解决方案我可以帮助我如何在最
在 5 个节点的集群上运行 Presto 大型扫描查询,看起来只有一个节点是查询协调器,并通过网络从 5 个 hdfs 节点读取数据。 所有 presto 进程都在数据节点上运行。 有没有办法让5个节
我有一个名为 file name(1).zip 的文件(里面有空格和括号),我想把这个文件放在 HDFS 上。但是每次我尝试通过 hadoop fs -put ... 放置它时,我都会遇到异常。 我什
在 5 个节点集群上运行 Presto 大扫描查询,看起来只有一个节点是查询协调器,并通过网络从 5 个 hdfs 节点读取数据。 所有presto进程都在数据节点上运行。 有没有办法让5个节点使用s
所以我在 CentOS 5 上通过 Cloudera Manager cdh3u5 安装了 Hadoop。当我运行 cmd 时 hadoop fs -ls/ 我希望看到 hdfs://localhos
我用命令在hadoop上运行flume flume-ng agent -c conf -f conf/flume-twitter.conf -n TwitterAgent 现在我无法保存推特数据。它显
我使用两台主机(hadoop-coc-1 和 hadoop-coc-2)尝试在其中配置 HDFS 联合。因此,我在两个主机(hadoop-coc-1 和 hadoop-coc-2)中配置了 $ cat
我需要将大量文件从一个 hdfs 目录移动(而不是复制)到同一集群中的另一个 hdfs 目录。 我可以使用 distcp,但它似乎有点矫枉过正,因为它正在复制文件(复制它)我只想移动它。两个问题: A
当我尝试将文件从我的 本地目录 复制到 HDFS 时,出现以下错误: [cloudera@localhost ~]$ hadoop fs -copyFromLocal hello.txt /user/
据我所知,在从一个 HDFS 位置移动到另一个位置时,没有直接选项可以覆盖 HDFS 中的文件,复制 cp 可以选择强制执行。我试图找出是否有任何黑客可以做到这一点? 我们能做的是 hdfs dfs
我有两个 HDFS 设置,想将一些表从 HDFS1 复制(而不是迁移或移动)到 HDFS2。如何将数据从一个 HDFS 复制到另一个 HDFS?是否可以通过 Sqoop 或其他命令行实现? 最佳答案
目前尚不清楚您是否可以像在 Flume 中那样在 Kafka 中进行扇出(复制)。 我想让 Kafka 将数据保存到 HDFS 或 S3,并将该数据的副本发送到 Storm 进行实时处理。 Storm
如何发出 hdfs 命令作为 EMR 集群中的一个步骤?将步骤添加为 script_runner.jar 任务似乎奇怪地失败了。 最佳答案 使用 command-runner.jar 并调出 bash
如何发出 hdfs 命令作为 EMR 集群中的一个步骤?将步骤添加为 script_runner.jar 任务似乎奇怪地失败了。 最佳答案 使用 command-runner.jar 并调出 bash
我是 Hadoop 和 HDFS 的新手,所以当我从本地 (Ubuntu 10.04) 复制到本地主机上单个节点上的 HDFS 时,可能是我做错了什么。初始副本工作正常,但当我修改我的本地输入文件夹并
根据我在 Hadoop HDFS 上的实践,我了解到在创建用户 say u1 并尝试将文件从本地文件系统放入 HDFS 时,它会搜索目录 /user/u1 (默认情况下)对 HDFS 文件系统具有写入
我想将一个 70G 的文件放入 hdfs,所以我使用“put”命令来完成此操作。但是,我得到以下异常。我用相同的命令尝试了小尺寸文件,它有效。有谁知道是什么问题?谢谢! WARN [DataStre
我是一名优秀的程序员,十分优秀!