小编Nie*_*jes的帖子

是否可以在没有HDFS的情况下以伪分布式操作运行Hadoop?

我正在探索在本地系统上运行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 mapreduce hdfs local-storage

8
推荐指数
1
解决办法
3946
查看次数

在多个CPU核心上运行独立的Hadoop应用程序

我的团队使用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来控制它.

现在我也在这个问题中找到了这里描述的解决方案.

java command-line multithreading hadoop mapreduce

7
推荐指数
1
解决办法
7694
查看次数

将具有不同模式的json加载到PIG中

我遇到了将一组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中的特定字段.

我该如何解决这个问题?

schema json apache-pig

6
推荐指数
1
解决办法
7202
查看次数

变量和顶级包名称之间的Java名称冲突

由此错误报告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中,生成代码并且必须尝试避免名称冲突,假设人们有时会选择意外的名称.

所以假设在这个例子中

  1. 需要'test()'方法中的完全限定类名来避免冲突.
  2. 变量'nl'只是模式定义中使用的名称.
  3. 生成像_nl__这样的字段并具有getter和setter将是一个会破坏向后兼容性的更改,因为nl字段始终是公共的.

除了告诉人们"就是不要那样做".

有避免这些冲突的解决方案吗?


请注意,对于触发此问题的AVRO错误,我找到了一种解决方法.在这里,我正在寻找'通用答案'.

java namespaces name-collision

6
推荐指数
1
解决办法
1028
查看次数

将输入拆分为PIG中的子串(Hadoop)

假设我在Pig中有以下输入:

some
Run Code Online (Sandbox Code Playgroud)

我想将其转换为:

s
so
som
some
Run Code Online (Sandbox Code Playgroud)

我还没有找到一种方法来迭代猪拉丁语中的chararray.我找到了TOKENIZE函数但是在单词边界上分裂了.那么"猪拉丁"可以做到这一点,还是需要Java类来做这件事呢?

hadoop mapreduce apache-pig

5
推荐指数
3
解决办法
1万
查看次数

哪个关键类适合二级排序?

在Hadoop中,您可以使用辅助排序机制在将值发送到reducer之前对值进行排序.

在Hadoop中完成此操作的方法是添加值以按键排序,然后使用一些自定义组和键比较方法挂钩到排序系统.

所以你需要一个基本上由真实密钥和要排序的值组成的密钥.为了使这个性能足够快,我需要一种创建复合键的方法,该复合键也很容易分解为组和键比较方法所需的单独部分.

最聪明的方法是做到这一点.是否有一个"开箱即用"的Hadoop类可以帮助我,或者我是否必须为每个map-reduce步骤创建一个单独的键类?

如果密钥实际上是由多个部分组成的复合(由于分区也需要单独使用),我该怎么做?

你们推荐什么?

PS我想添加标签"secondary-sort"但我还没有足够的代表这样做.

java sorting hadoop mapreduce

5
推荐指数
1
解决办法
827
查看次数

使用 junit 5 测试预期的异常消息

我有一个项目,在那里我进行了测试,我故意造成问题,然后验证代码是否按我想要的方式响应。为此,我想确保异常不仅是正确的类,而且它们还必须携带正确的信息。

所以在我现有的(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 中编写此类测试的正确方法是什么?

java junit junit4 junit5

5
推荐指数
2
解决办法
2098
查看次数

将GIT合并功能移植到SVN?

我几周前看过YouTube演示文稿Tech Talk:Linus Torvalds on git,似乎有一句话在我脑海中浮现.

在这个演讲中(大约33分钟),Linus说"有些人克隆SVN存储库,合并(= SVN中的头痛)然后将结果推回SVN".

我的想法是:如果这是可能的,那么为什么我们不把GIT的强大合并能力移植到SVN的一个组成部分?

这样我们对SVN进行了很大的改进,我们不必迁移我们的公司存储库和相关脚本,这些脚本可以连接到各种问题跟踪和持续集成系统.

我一定错过了什么.它是什么?

svn git merge git-svn

4
推荐指数
1
解决办法
521
查看次数

在Java中使用递归泛型时不兼容的类型

我编写了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)

java generics incompatibletypeerror

3
推荐指数
1
解决办法
52
查看次数

MapReduce在原始函数式语言中的可扩展性如何?

Map-Reduce编程模型源于map和reduce功能,这些功能存在于Lisp和Scheme等功能语言中,可以追溯到很多年前.

我记得大学(90年代早期),即便在那时我被告知Map-Reduce在可扩展性方面具有优势.

目前我们都知道Hadoop和谷歌的原件是从中复制而来的.我想知道的是,"旧"函数语言中存在哪些选项可以在至少几个计算节点上进行Map-Reduce?

或者这是在纸上看起来不错的那些功能之一,但在谷歌做到之前,没有人能够真正建立起来吗?

parallel-processing hadoop functional-programming scalability mapreduce

2
推荐指数
1
解决办法
796
查看次数

如何从maven为eclipse添加buildpath选项

自去年夏天以来,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的所有选项,但我无法弄清楚如何做到这一点.

我该如何做到这一点?

java eclipse maven

2
推荐指数
1
解决办法
228
查看次数

DateTimeFormatter基于周的年份差异

我正在将我的应用程序从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)

java datetime dayofweek java-8 java-time

2
推荐指数
1
解决办法
848
查看次数