在许多应用MapReduce的实际情况中,最终的算法最终会成为几个MapReduce步骤.
即Map1,Reduce1,Map2,Reduce2等.
因此,您可以获得下一个映射的输入所需的最后一个reduce的输出.
管道成功完成后,您(通常)不希望保留中间数据.另外,因为这个中间数据通常是一些数据结构(如'map'或'set'),所以你不想在编写和读取这些键值对时花费太多精力.
在Hadoop中推荐的方法是什么?
是否有(简单)示例显示如何以正确的方式处理此中间数据,包括之后的清理?
用于演示MapReduce功能的主要示例之一是Terasort基准测试.我无法理解MapReduce环境中使用的排序算法的基础知识.
对我来说,排序只涉及确定元素与所有其他元素的相对位置.因此排序涉及将"一切"与"一切"进行比较.你的平均排序算法(快速,泡沫......)只是以聪明的方式做到这一点.
在我看来,将数据集分成多个部分意味着您可以对单个部分进行排序,然后您仍然必须将这些部分集成到"完整"的完全排序数据集中.鉴于分布在数千个系统上的TB级数据集,我认为这是一项艰巨的任务.
那怎么回事呢?这个MapReduce排序算法如何工作?
谢谢你帮我理解.
在Java中,有许多方法都与操作字符串有关.最简单的例子是String.split("something")方法.
现在许多方法的实际定义是它们都将正则表达式作为它们的输入参数.这使得所有非常强大的构建块成为可能.
现在,您将在许多方法中看到两种效果:
因此,不仅默认方法功能强大,而且它们实际上用于实际使用的内容也显得过于强大.在内部,我们开发了一种"fastSplit"方法,可以拆分固定字符串.我在家里写了一个测试,看看如果知道它是一个单一的字符,我能做多快.两者都明显快于"标准"分割方法.
所以我想知道:为什么Java API会以现在的方式选择?有什么理由去做这个而不是像split(char)和split(String)以及splitRegex(String)这样的东西?
更新:我打了几个电话,看看分割字符串的各种方法需要多长时间.
简短摘要:它有很大的不同!
我为每个测试用例做了10000000次迭代,总是使用输入
"aap,noot,mies,wim,zus,jet,teun"
Run Code Online (Sandbox Code Playgroud)
并始终使用','或","作为拆分参数.
这是我在我的Linux系统上得到的(它是一个Atom D510盒子,所以它有点慢):
fastSplit STRING
Test 1 : 11405 milliseconds: Split in several pieces
Test 2 : 3018 milliseconds: Split in 2 pieces
Test 3 : 4396 milliseconds: Split in 3 pieces
homegrown fast splitter based on char
Test 4 : 9076 milliseconds: Split in several pieces
Test 5 : 2024 milliseconds: Split in 2 pieces
Test 6 : 2924 milliseconds: Split in 3 pieces
homegrown …
Run Code Online (Sandbox Code Playgroud) 我正试图在CentOS 5.3 VMware"盒子"上安装indefero,我遇到了一个问题.在安装的早期,我得到一个错误,我已经能够缩小到这个范围:
[root@code /var/www/html]# cat x.php
<?php
mb_internal_encoding("UTF-8");
?>
[root@code /var/www/html]# php x.php
PHP Fatal error: Call to undefined function mb_internal_encoding() in
/var/www/html/x.php on line 2
Run Code Online (Sandbox Code Playgroud)
通过Apache通过http调用此脚本时出现相同的错误.现在根据PHP手册,mb_internal_encoding函数应该是PHP 5中的内置函数.
我有CentOS 5.3 i386(Linux代码2.6.18-53.1.21.el5#1 SMP Tue May 20 09:34:18 EDT 2008 i686 i686 i386 GNU/Linux),我安装了PHP 5.2.9.
[root@code /var/www/html]# php -v
PHP 5.2.9 (cli) (built: Jul 8 2009 06:03:36)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
Run Code Online (Sandbox Code Playgroud)
我仔细检查过:selinux已被禁用(暂时).
我该如何解决?
在过去,我曾经使用在MySQL上运行的OLAP多维数据集构建WebAnalytics.现在我使用OLAP多维数据集的方式只是一个大表(好吧,它比那更智能地存储),其中每一行基本上是一个测量或聚合的测量集.每个度量都有一堆维度(即哪个页面名称,用户名,ip等)和一堆值(即多少个综合浏览量,多少访问者等).
您在这样的表上运行的查询通常采用以下形式(meta-SQL):
SELECT SUM(hits), SUM(bytes),
FROM MyCube
WHERE date='20090914' and pagename='Homepage' and browser!='googlebot'
GROUP BY hour
Run Code Online (Sandbox Code Playgroud)
因此,您可以使用上述过滤器获取所选日期中每小时的总计.一个障碍是这些立方体通常意味着全表扫描(各种原因),这意味着你可以制作这些东西的尺寸(在MiB中)的实际限制.
我正在学习Hadoop等的来龙去脉.
在BigTable上运行上述查询作为mapreduce看起来很容易:只需将'小时'作为键,在地图中过滤并通过对值进行求和来减少.
您是否可以在"实时"(即通过用户界面和用户得到他们的答案,而不是批处理模式)上运行BigTable类型的系统上面(或至少具有相同输出)的查询?
如果不; 在BigTable/Hadoop/HBase/Hive等领域做这样的事情的适当技术是什么?
我有一大堆文件,需要进行一些繁重的处理.这种单线程处理,使用几百MiB的RAM(在用于启动作业的机器上),需要几分钟才能运行.我目前的用例是在输入数据上启动一个hadoop作业,但在之前的其他情况下我遇到了同样的问题.
为了充分利用可用的CPU功率,我希望能够在并行中运行多个这些任务.
但是,像这样的非常简单的示例shell脚本会因过度负载和交换而导致系统性能下降:
find . -type f | while read name ;
do
some_heavy_processing_command ${name} &
done
Run Code Online (Sandbox Code Playgroud)
所以我想要的基本上类似于"gmake -j4"的作用.
我知道bash支持"wait"命令,但只等待直到所有子进程都已完成.在过去,我创建了执行'ps'命令的脚本,然后按名称grep子进程(是的,我知道......丑陋).
做我想要的最简单/最干净/最好的解决方案是什么?
编辑:感谢Frederik:是的,这确实是如何限制bash中函数中使用的线程/子进程数量的副本 "xargs --max-procs = 4"就像一个魅力.(所以我投票结束了我自己的问题)
我确信这是其他人多次解决过的问题.
一群人将要进行测量(确切地说是家庭能源使用情况).所有这些人都会在不同的时间和不同的时间间隔做到这一点.
所以我从每个人那里得到的是一组{date,value}对,其中集合中缺少日期.
我需要的是一套完整的{date,value}对,其中每个日期的范围值已知(测量或计算).我希望一个简单的线性插值就足够了这个项目.
如果我认为它必须在Excel中完成.在这样的数据集中插值的最佳方法是什么(所以我每天都有一个值)?
谢谢.
注意:当这些数据集完成后,我将确定斜率(即每天的使用量),然后我们就可以开始进行家庭到家的比较.
附加信息在提出几条建议后:我不想手动确定测量装置中的孔位置(太多不完整的测量装置!!).我正在寻找一些(现有的)自动为我做的事情.所以,如果我的意见是
{2009-06-01, 10}
{2009-06-03, 20}
{2009-06-06, 110}
Run Code Online (Sandbox Code Playgroud)
然后我希望自动得到
{2009-06-01, 10}
{2009-06-02, 15}
{2009-06-03, 20}
{2009-06-04, 50}
{2009-06-05, 80}
{2009-06-06, 110}
Run Code Online (Sandbox Code Playgroud)
是的,我可以编写这样做的软件.我只是希望有人已经为这个(相当普通的)问题提供了"准备运行"软件(Excel)功能.
我正在将现有的应用程序从Joda-Time移植到Java 8 java.time
.
我遇到了一个问题,解析包含"星期几"值的日期/时间字符串在我的单元测试中触发了异常.
解析时:
2016-12-21 20:50:25 12月周三+0000 3
使用格式:
yyyy'-'MM'-'dd' 'HH':'mm':'ss' 'EEEE' 'MMMM' 'ZZ' 'e
Run Code Online (Sandbox Code Playgroud)
我明白了:
java.time.format.DateTimeParseException:
Text '2016-12-21 20:50:25 Wednesday December +0000 3'
could not be parsed: Conflict found:
Field DayOfWeek 3 differs from DayOfWeek 2 derived from 2016-12-21
Run Code Online (Sandbox Code Playgroud)
当让它DateTimeFormatter
表明它所期望的时候:
String logline = "2016-12-21 20:50:25 Wednesday December +0000";
String format = "yyyy'-'MM'-'dd' 'HH':'mm':'ss' 'EEEE' 'MMMM' 'ZZ";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format).withLocale(Locale.ENGLISH);;
ZonedDateTime dateTime = formatter.parse(logline, ZonedDateTime::from);
format = "yyyy'-'MM'-'dd' 'HH':'mm':'ss' 'EEEE' 'MMMM' 'ZZ' 'e";
formatter = …
Run Code Online (Sandbox Code Playgroud) 我有一个经常性的任务,即将一组大的(每个大约1-2 GiB)gzip压缩的Apache日志文件拆分成几个部分(比如说500K行的块).应该再次压缩最终文件以限制磁盘使用量.
在Linux上我通常会这样做:
zcat biglogfile.gz | split -l500000
Run Code Online (Sandbox Code Playgroud)
生成的文件文件将命名为xaa,xab,xac等.所以我这样做:
gzip x*
Run Code Online (Sandbox Code Playgroud)
这种方法的效果是,作为中间结果,这些巨大的文件暂时存储在磁盘上.有没有办法避免这种中间磁盘使用?
我可以(以类似于xargs的方式)通过命令(如gzip)拆分输出并在运行中重新压缩输出吗?或者我是在寻找错误的方向,是否有更好的方法来做到这一点?
谢谢.
在 Java 中,Locale
定义了与人们希望如何看待事物相关的事物(例如货币格式、月份名称以及一周的开始时间)。
当解析月份的名称(带有DateTimeFormatter
)时,它开始变得棘手。
如果您使用Locale.US
或Locale.ENGLISH
则九月有缩写形式Sep
。
如果您使用Locale.UK
,那么 September 在 Java 11 中也有缩写形式Sep
……但是当您尝试 Java 17 时,它就会有Sept
(因为 Unicode CLDR 端发生了变化,我询问这是否正确)。
结果是,当我尝试使用 Java 17 进行构建时,我的测试开始失败。
我当前的代码使用Locale.UK
而不是Locale.ENGLISH
因为在Java中Locale.ENGLISH
实际上不仅是英语,而且还是非ISO美国定义一周的方式(他们使用星期日作为一周的第一天)。我想以 ISO 方式获得它。
简单地:
WeekFields.ISO
= WeekFields.of(Locale.UK)
=WeekFields[MONDAY,4]
WeekFields.of(Locale.ENGLISH)
= WeekFields.of(Locale.US)
=WeekFields[SUNDAY,1]
因此,从 Java 17 开始,我还无法找到可以正常工作的内置语言环境。
在我看来,我必须选择Locale.ENGLISH
并将9 月的简称更改为我需要的WeekFields
。Locale.UK
我的问题是如何做到这一点(在 Java 17 中)?
或者有更好的方法来解决这个问题吗?
更新1: