Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop 在HDFS中本地化HFile块_Hadoop_Hbase_Hdfs - Fatal编程技术网

Hadoop 在HDFS中本地化HFile块

Hadoop 在HDFS中本地化HFile块,hadoop,hbase,hdfs,Hadoop,Hbase,Hdfs,我们使用Mapreduce批量创建HFiles,然后增量/批量加载到HBase中。我注意到加载只是一个HDFS move命令(它不会实际移动文件块) 由于我们进行了大量HBase表扫描,并且启用了短路读取,因此将这些HFile定位到各自区域的节点将是有益的 我知道主要的压缩可以实现这一点,但如果与区域大小相比,HFiles较小,则这些压缩是低效的 HBase使用HDFS作为文件系统。HBase不控制HDFS块的数据本地性。 当使用HBase API向HBase写入数据时,HBase Region

我们使用Mapreduce批量创建HFiles,然后增量/批量加载到HBase中。我注意到加载只是一个HDFS move命令(它不会实际移动文件块)

由于我们进行了大量HBase表扫描,并且启用了短路读取,因此将这些HFile定位到各自区域的节点将是有益的


我知道主要的压缩可以实现这一点,但如果与区域大小相比,HFiles较小,则这些压缩是低效的

HBase使用HDFS作为文件系统。HBase不控制HDFS块的数据本地性。
当使用HBase API向HBase写入数据时,HBase RegionServer将成为HDFS的客户端,在HDFS中,如果客户端节点也是datanode,则还将创建本地块。因此,当HBase API用于写入时,localityIndex很高。

当使用批量加载时,HDFS中已经存在HFiles。因为,它们已经出现在hdfs上。HBase只会使这些hfile成为区域的一部分。在这种情况下,不能保证数据本地性。

如果您确实需要高数据局部性,那么我建议您使用HBase API进行写操作,而不是大容量加载

从我的MR工作中,我一直在使用HBase API向HBase进行写操作,到目前为止,它们工作得很好。

您查看过您所在地区服务器的位置索引吗?什么是平均位置指数?是的,当然,在主要压实后,它会变为1,即使在HFile加载后,它也可能只会下降到89,这取决于HFile的大小。然而,似乎仍然可以执行一个确保数据局部性的命令。使用API的问题是,与批量写入相比,它非常慢。这会在区域服务器上造成大量GC。我们以前完全按照您的建议执行,但我们发现最好牺牲非本地文件12%的读取性能,然后在写入性能上受到50%以上的惩罚。@AndrewWhite您使用客户端缓冲区吗?尝试使用setAutoFulsh()方法。50%是太多的降级。我们尝试了所有方法,但memstore刷新时间和网络IO开销非常粗糙。但同时,我认为API的设计并不是为了快速处理1亿次以上的看跌期权。创建一个HFile更简单、更快。@AndrewWhite:我的回答实际上包含了推理和解决方法。如果你认为这是一个合适的答复,请接受。