该场景大约有10亿条记录.每条记录的数据大小为1kb,并存储在SSD中.哪个kv商店可以提供最佳的随机读取性能?它需要将每次查询的磁盘访问次数减少一次,并且所有数据索引都将存储在内存中.
Redis速度很快,但在内存中存储1 TB数据太昂贵了.LevelDB每次查询多次读取磁盘.我找到的最接近的是fatcache,但它并不持久.这是一个SSD支持的memcached.
有什么建议?
我是Haddoop的新手.最近我正在尝试处理(仅读取)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/s.
如果在mapreduce中触发此编程(hadoop流,5个作业,每个具有20个线程,总线程数仍为100),则吞吐量降至约45MB/s.(我想通过一些记账过程会减慢速度).
我想知道HDFS可以提供什么样的合理性能.如您所见,与本机代码相比,数据吞吐量仅为1/7左右.这是我配置的问题吗?还是HDFS限制?还是Java限制?什么是我的场景的最佳方式?将序列文件帮助(多)?与我们可以预期的本机IO读取相比,合理的吞吐量是多少?
这是我的一些配置:
NameNode堆大小为32G.
作业/任务节点堆大小为8G.
NameNode处理程序数:128
DataNode处理程序数:8
DataNode最大传输线程数:4096
1GBps以太网.
谢谢.
静态链接 Boost.Log 时出现链接错误。编译器版本是g++ 4.8.1。Boost版本是1.55.0。我可以毫无问题地进行动态链接(在 make 文件中使用“-DBOOST_LOG_DYN_LINK”),但是当我进行静态链接时,会出现链接错误。在其他 boost 库上不会出现此问题。我简化了代码以轻松重现此问题:
#include <boost/log/trivial.hpp>
int main()
{
BOOST_LOG_TRIVIAL(trace) << "test trace";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
生成链接错误的构建命令:
g++ test.cpp -lboost_thread -lboost_log
Run Code Online (Sandbox Code Playgroud)
但是,如果我明确指定 lib 文件,就不会有问题:
g++ test.cpp -lboost_thread /usr/local/lib/libboost_log.a
Run Code Online (Sandbox Code Playgroud)
我还尝试添加 -L 选项并得到相同的错误:
g++ test.cpp -L/usr/local/lib -lboost_thread -lboost_log
Run Code Online (Sandbox Code Playgroud)
这是错误日志:
test.cpp:(.text+0x29): undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()'
test.cpp:(.text+0x70): undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()'
/tmp/ccDUZ2gm.o: In function `boost::log::v2s_mt_posix::record::reset()':
test.cpp:(.text._ZN5boost3log12v2s_mt_posix6record5resetEv[_ZN5boost3log12v2s_mt_posix6record5resetEv]+0x23): undefined reference to `boost::log::v2s_mt_posix::record_view::public_data::destroy(boost::log::v2s_mt_posix::record_view::public_data const*)'
/tmp/ccDUZ2gm.o: In function `boost::log::v2s_mt_posix::record boost::log::v2s_mt_posix::sources::basic_composite_logger<char, boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level>, boost::log::v2s_mt_posix::sources::multi_thread_model<boost::log::v2s_mt_posix::aux::light_rw_mutex>, boost::log::v2s_mt_posix::sources::features<boost::log::v2s_mt_posix::sources::severity<boost::log::v2s_mt_posix::trivial::severity_level>, void, void, void, void, void, void, void, void, void> >::open_record<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::severity, boost::log::v2s_mt_posix::trivial::severity_level …Run Code Online (Sandbox Code Playgroud) 我从这篇文章中了解到:扩展到 1200 万并发连接:MigratoryData是如何做到的,可以从具有多个 IP 的单个客户端建立超过 64K 的连接。
现在我有一台 AWS ec2 机器,它有 10 个用于测试的 IP。/etc/sysctl.conf 中的配置是
fs.nr_open = 2000000
fs.file-max = 2000000
Run Code Online (Sandbox Code Playgroud)
/etc/security/limits.d/def.conf 中的配置是
* soft nofile 2000000
* hard nofile 2000000
Run Code Online (Sandbox Code Playgroud)
我启动一个进程(用 C 编写)并从第一个 IP 地址创建 60000 个连接。一切正常。然后我开始另一个进程并尝试从第二个 IP 地址创建 60000 个连接,但是当连接数达到大约 7500(总数:67500)时它会出错。错误信息是Connection timed out。
问题似乎不是文件描述符限制,因为我仍然可以在客户端机器中打开/读取/写入文件。但是与任何远程服务器的任何向外连接都会超时。
问题不在服务器端,因为服务器可以接受来自不同客户端机器的更多连接。
看起来有某种设置而不是限制传出连接数量的打开文件数量。任何人都可以帮忙吗?