如果我需要对(不可拆分的)数千个大小在200到500mb之间的gzip文件进行顺序扫描,那么这些文件的块大小是多少?
为了这个问题,让我们说完成的处理非常快,因此重新启动映射器并不昂贵,即使对于大块大小也是如此.
我的理解是:
但是,gzip压缩文件的大小各不相同.如果我选择~500mb的块大小(例如我所有输入文件的最大文件大小),如何存储数据?选择"非常大"的块大小(如2GB)会更好吗?在任何一种情况下,HDD容量是否过度浪费?
我想我真的在询问文件是如何实际存储的,并且跨越hdfs块进行分割 - 以及尝试了解不可拆分文件的最佳实践.
更新:一个具体的例子
假设我在三个200 MB文件上运行MR作业,存储如下图所示.
如果HDFS像A一样存储文件,则可以保证3个映射器能够处理每个"本地"文件.但是,如果文件存储在案例B中,则一个映射器需要从另一个数据节点获取文件2的一部分.
鉴于有足够的空闲块,HDFS存储文件如案例A或案例B所示?

首先,我是hadoop的新手:)
我有一个大型的gzip压缩文件数据集(gzip文件中的TB文件大小各为100-500mb).
基本上,我需要对我的map-reduce作业的输入进行某种过滤.
我想以各种方式分析这些文件.这些作业中的许多只需要分析某种格式的文件(具有一定长度,包含某些单词等 - 各种任意(反向)索引),并且处理每个作业的整个数据集需要花费不合理的时间.所以我想创建指向HDFS中特定块/文件的索引.
我可以手动生成所需的索引,但是如何准确指定我想要处理哪些(数千个)特定文件/块作为映射器的输入?如果不将源数据读入HBase,我可以这样做吗?我想要吗?或者我完全错误地解决了这个问题?
我想创建一个通过点击任意位置触发的一次性事件.单击按钮即可创建此事件.我不希望在点击按钮时触发事件,只有任何后续点击(包括按钮).
所以说我有一些类似下面的HTML:
<body>
<div id="someparent">
<div id="btn"></div>
</div>
</body>
Run Code Online (Sandbox Code Playgroud)
以下javascript(jquery):
$('#btn').click( function() {
$(document).one('click', function() {
console.log('triggered');
});
});
$('#someparent').click(function() {
// this must always be triggered
});
Run Code Online (Sandbox Code Playgroud)
我想避免停止事件传播,但在上面的示例中,事件绑定到文档,然后事件冒泡,并触发事件.
修复此问题的一种方法似乎是将事件创建包装在超时中:
$('#btn').click( function() {
setTimeout(function() {
$(document).one('click', function() {
console.log('triggered');
});
}, 1);
});
$('#someparent').click(function() {
// this must always be triggered
});
Run Code Online (Sandbox Code Playgroud)
现在,这很好用,但我想知道这是否安全.一些执行顺序的概念是否保证这一点总是有效,或者只是偶然的工作?我知道还有其他解决方案(.one()例如另一个嵌套事件),但我特意寻找setTimeout和事件传播如何互操作的答案.
以下小提琴显示两个div.第一个行为错误(文档事件立即触发).单击第二个div,然后在文档(白色区域)上的任何位置说明所需行为:
我在一个相当小的数据集上做了一个简单的组(HDFS中的80个文件,总共几个演出).我在一个纱线集群中的8台低内存机器上运行Spark,即:
spark-submit ... --master yarn-client --num-executors 8 --executor-memory 3000m --executor-cores 1
数据集由长度为500-2000的字符串组成.
我正在尝试做一个简单的groupByKey(见下文),但它失败并出现java.lang.OutOfMemoryError: GC overhead limit exceeded异常
val keyvals = sc.newAPIHadoopFile("hdfs://...")
.map( someobj.produceKeyValTuple )
keyvals.groupByKey().count()
Run Code Online (Sandbox Code Playgroud)
我可以reduceByKey毫无问题地计算组大小,确保自己问题不是由一个过大的组引起的,也不是由过多的组引起的:
keyvals.map(s => (s._1, 1)).reduceByKey((a,b) => a+b).collect().foreach(println)
// produces:
// (key1,139368)
// (key2,35335)
// (key3,392744)
// ...
// (key13,197941)
Run Code Online (Sandbox Code Playgroud)
我尝试过重新格式化,重组和增加groupBy并行度:
keyvals.groupByKey(24).count // fails
keyvals.groupByKey(3000).count // fails
keyvals.coalesce(24, true).groupByKey(24).count // fails
keyvals.coalesce(3000, true).groupByKey(3000).count // fails
keyvals.coalesce(24, false).groupByKey(24).count // fails
keyvals.coalesce(3000, false).groupByKey(3000).count // fails
Run Code Online (Sandbox Code Playgroud)
我试着玩弄spark.default.parallelism,并增加spark.shuffle.memoryFraction至0.8同时降低 …