我正在探索在本地系统上运行hadoop应用程序的选项.
与许多应用程序一样,前几个版本应该能够在单个节点上运行,只要我们可以使用所有可用的CPU内核(是的,这与此问题相关).目前的限制是,在我们的生产系统中,我们有Java 1.5,因此我们将Hadoop 0.18.3作为最新版本(请参阅此问题).所以不幸的是我们还不能使用这个新功能.
第一个选项是在伪分布式模式下运行hadoop.基本上:创建一个完整的hadoop集群,其中的所有内容都在1个节点上运行.
这种形式的"缺点"是它还使用了完整的HDFS.这意味着为了处理输入数据,必须首先将其"上传"到本地存储的DFS ...上.因此,这会占用输入和输出数据的额外传输时间,并使用额外的磁盘空间.在我们保持单节点配置时,我想避免这两种情况.
所以我在想:是否可以覆盖"fs.hdfs.impl"设置并将其从"org.apache.hadoop.dfs.DistributedFileSystem"更改为(例如)"org.apache.hadoop.fs.LocalFileSystem" ?
如果这工作,"本地"hadoop集群(它只能由一个节点组成)可以使用现有文件而无需任何额外的存储要求,并且它可以更快地启动,因为不需要上传文件.我希望仍然有一个工作和任务跟踪器,也许还有一个名称节点来控制整个事情.
有人曾尝试过这个吗?它可以工作还是这个想法远远超出预期用途?
或者是否有更好的方法来获得相同的效果:没有HDFS的伪分布式操作?
感谢您的见解.
编辑2:
这是我使用bajafresh4life提供的答案为hadoop 0.18.3 conf/hadoop-site.xml创建的配置.
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>fs.default.name</name>
<value>file:///</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>localhost:33301</value>
</property>
<property>
<name>mapred.job.tracker.http.address</name>
<value>localhost:33302</value>
<description>
The job tracker http server address and port the server will listen on.
If the port is 0 then the server will start on a free port.
</description>
</property>
<property> …Run Code Online (Sandbox Code Playgroud) 我的团队使用Hadoop库构建了一个Java应用程序,将一堆输入文件转换为有用的输出.考虑到当前的负载,单个多核服务器在未来一年左右就可以正常运行.我们(还)没有必要选择多服务器Hadoop集群,但我们选择启动这个项目"正在准备".
当我在命令行(或在eclipse或netbeans)上运行这个应用程序时,我还没有能够说服它一次使用更多的那个地图和/或减少线程.鉴于该工具非常占用CPU,这种"单线程"是我目前的瓶颈.
在netbeans探查器中运行它时,我确实看到应用程序为各种目的启动了几个线程,但同一时刻只运行一个map/reduce.
输入数据由几个输入文件组成,因此Hadoop至少应该能够为映射阶段同时为每个输入文件运行1个线程.
我该怎么做至少有2个甚至4个活动线程在运行(这个应用程序的大部分处理时间应该可以)?
我期待这是一个非常愚蠢的东西,我忽略了.
我刚刚发现了这个:https://issues.apache.org/jira/browse/MAPREDUCE-1367 这实现了我在Hadoop中寻找的功能0.21它引入了标志mapreduce.local.map.tasks.maximum来控制它.
我遇到了将一组json文档加载到PIG中的问题.我所拥有的是很多json文档,它们在所有字段中都有所不同,我需要的字段在大多数文档中,并且在whare中我想要获得null值.
我刚刚下载并编译了最新的Pig版本(从apache git存储库直接0.12),以确保尚未解决.
我有一个像这样的json文档:
{"foo":1,"bar":2,"baz":3}
Run Code Online (Sandbox Code Playgroud)
当我使用它将其加载到PIG中时
Json1 = LOAD 'test.json' USING JsonLoader('foo:int,bar:int,baz:int');
DESCRIBE Json1;
DUMP Json1;
Run Code Online (Sandbox Code Playgroud)
我得到了预期的结果
Json1: {foo: int,bar: int,baz: int}
(1,2,3)
Run Code Online (Sandbox Code Playgroud)
但是,当架构中的字段顺序不同时:
Json2 = LOAD 'test.json' USING JsonLoader('baz:int,bar:int,foo:int');
DESCRIBE Json2;
DUMP Json2;
Run Code Online (Sandbox Code Playgroud)
我得到了一个不希望的结果:
Json2: {baz: int,bar: int,foo: int}
(1,2,3)
Run Code Online (Sandbox Code Playgroud)
应该是的
(3,2,1)
Run Code Online (Sandbox Code Playgroud)
显然,模式定义中的字段名称与json中的字段名无关.
我需要的是从json文件(带有嵌入文档!)加载到PIG中的特定字段.
我该如何解决这个问题?
由此错误报告AVRO-1814触发我将问题简化为Java中的这个最小示例,简单地显示了效果的核心.
package nl.basjes.experiment;
public class NamingClash {
String nl = "foo";
public void test() {
nl.basjes.experiment.NamingClash.foo();
}
private static void foo() {
// Do something
}
}
Run Code Online (Sandbox Code Playgroud)
试图编译这将给你
error: cannot find symbol
nl.basjes.experiment.NamingClash.foo();
^
symbol: variable basjes
location: variable nl of type String
Run Code Online (Sandbox Code Playgroud)
在AVRO中,生成代码并且必须尝试避免名称冲突,假设人们有时会选择意外的名称.
所以假设在这个例子中
除了告诉人们"就是不要那样做".
有避免这些冲突的解决方案吗?
请注意,对于触发此问题的AVRO错误,我找到了一种解决方法.在这里,我正在寻找'通用答案'.
假设我在Pig中有以下输入:
some
Run Code Online (Sandbox Code Playgroud)
我想将其转换为:
s
so
som
some
Run Code Online (Sandbox Code Playgroud)
我还没有找到一种方法来迭代猪拉丁语中的chararray.我找到了TOKENIZE函数但是在单词边界上分裂了.那么"猪拉丁"可以做到这一点,还是需要Java类来做这件事呢?
在Hadoop中,您可以使用辅助排序机制在将值发送到reducer之前对值进行排序.
在Hadoop中完成此操作的方法是添加值以按键排序,然后使用一些自定义组和键比较方法挂钩到排序系统.
所以你需要一个基本上由真实密钥和要排序的值组成的密钥.为了使这个性能足够快,我需要一种创建复合键的方法,该复合键也很容易分解为组和键比较方法所需的单独部分.
最聪明的方法是做到这一点.是否有一个"开箱即用"的Hadoop类可以帮助我,或者我是否必须为每个map-reduce步骤创建一个单独的键类?
如果密钥实际上是由多个部分组成的复合(由于分区也需要单独使用),我该怎么做?
你们推荐什么?
PS我想添加标签"secondary-sort"但我还没有足够的代表这样做.
我有一个项目,在那里我进行了测试,我故意造成问题,然后验证代码是否按我想要的方式响应。为此,我想确保异常不仅是正确的类,而且它们还必须携带正确的信息。
所以在我现有的(junit 4)测试之一中,我有类似的东西:
public class MyTests {
@Rule
public final ExpectedException expectedEx = ExpectedException.none();
@Test
public void testLoadingResourcesTheBadWay(){
expectedEx.expect(MyCustomException.class);
expectedEx.expectMessage(allOf(startsWith("Unable to load "), endsWith(" resources.")));
doStuffThatShouldFail();
}
}
Run Code Online (Sandbox Code Playgroud)
我目前正在考虑完全迁移到不再支持@Rule 的junit 5,现在有了似乎取代了这个的assertThrows。
我无法弄清楚如何编写一个不仅检查抛出的异常(类)而且还检查附加到该异常的消息的测试。
在 Junit 5 中编写此类测试的正确方法是什么?
我几周前看过YouTube演示文稿Tech Talk:Linus Torvalds on git,似乎有一句话在我脑海中浮现.
在这个演讲中(大约33分钟),Linus说"有些人克隆SVN存储库,合并(= SVN中的头痛)然后将结果推回SVN".
我的想法是:如果这是可能的,那么为什么我们不把GIT的强大合并能力移植到SVN的一个组成部分?
这样我们对SVN进行了很大的改进,我们不必迁移我们的公司存储库和相关脚本,这些脚本可以连接到各种问题跟踪和持续集成系统.
我一定错过了什么.它是什么?
我编写了java代码,我使用递归形式的泛型来实现一种使Builder模式可继承的简洁方法.
这有效,但我不明白我从java编译器得到的一些警告和错误.
这是我不理解的部分的严重简化版本:
package nl.basjes.test;
public class Foo<X extends Foo<X>> {
public X doSomething() {
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
对于"归还这个"; 我收到了错误
Incompatible Types
Required: X
Found : nl.basjes.test.Foo <X>
Run Code Online (Sandbox Code Playgroud)
现在'this'始终是Foo的子类(甚至Foo本身),'X'定义为X extends Foo<X>.据我所知,这些应该是"相同的",但显然它们不是.
所以在我的代码中我添加了一个强制转换为return语句,如下所示:
package nl.basjes.test;
public class Foo<X extends Foo<X>> {
public X doSomething() {
return (X)this;
}
}
Run Code Online (Sandbox Code Playgroud)
这使代码编译和按预期和预期工作.
然而,由于与上述相同的原因,我仍然会收到关于"未经检查的演员表"的警告(但现在它只是一个警告).
$ javac -Xlint:unchecked nl/basjes/test/Foo.java
nl/basjes/test/Foo.java:5: warning: [unchecked] unchecked cast
return (X)this;
^
required: X
found: Foo<X>
where X is a type-variable:
X extends Foo<X> declared …Run Code Online (Sandbox Code Playgroud) Map-Reduce编程模型源于map和reduce功能,这些功能存在于Lisp和Scheme等功能语言中,可以追溯到很多年前.
我记得大学(90年代早期),即便在那时我被告知Map-Reduce在可扩展性方面具有优势.
目前我们都知道Hadoop和谷歌的原件是从中复制而来的.我想知道的是,"旧"函数语言中存在哪些选项可以在至少几个计算节点上进行Map-Reduce?
或者这是在纸上看起来不错的那些功能之一,但在谷歌做到之前,没有人能够真正建立起来吗?
parallel-processing hadoop functional-programming scalability mapreduce
自去年夏天以来,Eclipse支持一种功能,您可以在其中抑制每个构建路径的非重要代码问题(此处描述).
当您从GUI设置此选项时,我看到这在项目的.classpath文件中反映如下.
<classpathentry including="**/*.java" kind="src" path="src/main/java"/>
<classpathentry including="**/*.java" kind="src" path="target/generated-sources/proto">
<attributes>
<attribute name="ignore_optional_problems" value="true"/>
</attributes>
</classpathentry>
Run Code Online (Sandbox Code Playgroud)
我有一个现有的基于Maven的项目,我想配置它,以便当我运行 mvn eclipse时:eclipse 生成的.classpath文件包含生成源代码的buildpaths的上述选项.
我已经检查了eclipse mojo的所有选项,但我无法弄清楚如何做到这一点.
我该如何做到这一点?
我正在将我的应用程序从Joda-Time迁移到Java 8 java.time.
我遇到的一件事是使用图案中的模式打印基于周的一年DateTimeFormatter.
注意:我已经看到了这个问题: Java Time使用DateTimeFormatter解析基于星期的周模式
根据文件
y year-of-era year 2004; 04
Y week-based-year year 1996; 96
Run Code Online (Sandbox Code Playgroud)
然而,当我尝试这两个时,似乎Y总是和它一样y.
我的测试代码:
DateTimeFormatter yearF = DateTimeFormatter.ofPattern("yyyy").withZone(ZoneOffset.UTC);
DateTimeFormatter weekYearF = DateTimeFormatter.ofPattern("YYYY").withZone(ZoneOffset.UTC);
DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder()
.appendValue(ChronoField.YEAR_OF_ERA) .appendLiteral(" ") .append(yearF)
.appendLiteral(" -- ")
.appendValue(IsoFields.WEEK_BASED_YEAR) .appendLiteral(" ") .append(weekYearF)
.toFormatter()
.withZone(ZoneOffset.UTC);
System.out.println(dateTimeFormatter.toString());
ZonedDateTime dateTime = ZonedDateTime.ofInstant(Instant.ofEpochMilli(946778645000L), ZoneOffset.UTC);
for (int i = 2000 ; i < 2020; i ++ ) {
System.out.println(dateTime.withYear(i).format(dateTimeFormatter));
}
Run Code Online (Sandbox Code Playgroud)
输出:
Value(YearOfEra)' '(Value(YearOfEra,4,19,EXCEEDS_PAD))' -- 'Value(WeekBasedYear)' '(Localized(WeekBasedYear,4,19,EXCEEDS_PAD)) …Run Code Online (Sandbox Code Playgroud)