[原创] JAVA map-reduce job的counter页面无法显示的问题(error 500)

这个问题已经不是第一次遇到了,只不过今天痛下决心花费不少时间把它写成文章,给遇到同样问题的朋友一些参考。
我们知道,一个JAVA M-R job跑完后,无论是在命令行,还是在job的信息展示网页上,都会看到输出job counter的信息。在网页上,通过点击job信息页中的"counter"链接就能看到。

阅读更多

[原创] JAVA map-reduce job中,reduce()方法漏写 @Override 注解引起的问题

有一个JAVA写的map-reduce job,mapper输出的key、value类型分别为Text、NullWritable,所以reducer应该像下面这样写:

static class QuerySegmentResultFromKVReducer extends Reducer<TextNullWritableNullWritableNullWritable{

  @Override
  protected void setup(Reducer.Context context) throws IOException, InterruptedException {
  }

  @Override
  protected void cleanup(Reducer.Context context) throws IOException, InterruptedException {
  }

  @Override
  protected void reduce(Text key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException {
    //TODO:
  }
}

在这里,reducer输出的key、value类型都是NullWritable,我们不用关心,这不是本文的关注点。

阅读更多

[原创] 用JAVA读取本地的TFRecord文件

TFRecord是一种用于TensorFlow的二进制数据格式,它可以更高效地存储和读取大规模数据集。TFRecord文件包含了一系列记录(record),每个记录可以是一个张量(tensor)或者一个序列(sequence)。
与文本文件不同,TFRecord文件被编码成二进制格式,这使得它们更易于在网络上传输和存储。同时,TFRecord也允许我们将大型数据集分割成多个部分,并且可以有效地并行读取和处理这些部分。
在TensorFlow中,我们通常使用TFRecord文件来存储和加载模型的训练数据、验证数据、测试数据等。创建TFRecord文件需要经过一定的序列化操作,但这些操作很容易实现,因为TensorFlow提供了相应的API支持。

阅读更多

[原创] 通过第三方工具/JAVA程序访问S3存储

S3是亚马逊2006年推出的简单存储服务(Simple Storage Service),理论上是一个全球存储区域网络,你可以把它想像成一个超大的硬盘,可以在其中存储和检索数字资产,通过 S3 存储和检索的资产被称为对象,对象存储在存储段(bucket)中。
很多公司都推出了自己的对象存储服务,例如阿里云对象存储服务OSS,可以使用S3 API进行访问。

阅读更多

[原创] JAVA Jackson解析无名(匿名)数组

假设有JSON文件 1.json:

[
    {
        "sku""ABC",
        "num"3
    },
    {
        "sku""DEF",
        "num"2
    }
]

由中括号可知,这个JSON字符串映射成JAVA对象是一个List,而它里面又包含了两个JAVA对象(每个大括号对应一个)。

阅读更多

[原创] selenium-java的wait.until(ExpectedConditions)编译出错问题

代码示例:

wait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert();
alert.accept();

在升级了pom.xml中的selenium-java版本到3.141.59后,代码编译出错了(挂在第一行),错误信息:

无法将类 org.openqa.selenium.support.ui.FluentWait<T>中的方法 until应用到给定类型;
[ERROR]   需要: java.util.function.Function<? super org.openqa.selenium.WebDriver,V>
[ERROR]   找到: org.openqa.selenium.support.ui.ExpectedCondition<org.openqa.selenium.Alert>
[ERROR]   原因: 无法推断类型变量 V
[ERROR]     (参数不匹配; org.openqa.selenium.support.ui.ExpectedCondition<org.openqa.selenium.Alert>无法转换为java.util.function.Function<? super org.openqa.selenium.WebDriver,V>)

[原创] Hadoop 2.6.x 下Distributed Cache的用法

仔细记录一下Java的Map-Reduce job使用distributed cache的方法,毕竟以前一直都是copy paste ~

 适用的Hadoop版本
CDH 5.8.0(Hadoop 2.6.0)
别的版本没有测试过,但后面相近的版本应该也能用。

 准备工作:上传本地文件到HDFS
为了在Java代码中把一个文件加入 distributed cache,需要先把它上传到HDFS,之后应使用 HDFS 路径来加入 distributed cache。
假设要加入 distributed cache 的文件为 file.txt:

hadoop fs -put file.txt /your/hdfs/dir/

阅读更多

[原创] 如何用Jackson解析含有转义字符的JSON到Java对象?

如果一个JSON字符串里有一个字段,它的值又是一个完整的JSON字符串,那么这时候,它可能会含有转义字符。举个例子,我们有一个文件  codelast.json,它的内容为一行字符串:

{"aaa":"{\"ccc\":\"ccc\",\"ddd\":\"ddd\"}","bbb":{"ccc":"ccc","ddd":"ddd"}}

现在要用Jackson解析它为一个Java对象,怎么做?

阅读更多

[翻译] 在JAVA中,怎样周期性运行一个任务

本文是对这篇文章的翻译:《How to Schedule a Task to Run in an Interval》
我不知道原作者是否允许这样做,但我翻译本文仅在于传播知识的目的,在此向原作者表示深深的感谢:感谢你们的分享。

在程序中通常都有在后台周期性运行某些任务的需求。例如,类似于Java垃圾收集的后台运行任务。
我将在本文中向你展示3种不同的实现方法,如下:

[原创] Java动态添加一个目录到classpath中

通常我们写程序,会用到一些配置文件,这些文件与程序在同一个父目录下,配置文件可能放在config之类的目录下,程序中会使用这些配置文件。
我遇到了这么件事情:因为一个特殊需求,需要把配置文件放到jar包中,最终部署出去的只能是一个jar包(所有东西都在jar包里,包括程序和所需的资源),然后在程序中使用 getClass().getResourceAsStream(文件在jar包中的路径) 的方式来读取配置文件。这也倒没什么不爽的,但是在单元测试中怎么办?

阅读更多

[原创](翻译)什么是Java的永久代(PermGen)内存泄漏

本文是我对这篇文章的翻译:What is a PermGen leak? 为了便于阅读,我将原文附于此处,翻译穿插在其中。此外,为了防止原链接在未来某一天失效后,文中的图片再也看不到的问题,我将原文中的图片也保存到了本站的服务器上,我不知道原作者是否允许这样做,但我翻译本文仅在于传播知识的目的,在此向原作者表示深深的感谢:感谢你们的分享。

阅读更多

[原创]如何添加一个文件/目录到IntelliJ项目的classpath中

以下内容的背景:IntelliJ,Java项目。
在单元测试中,我们经常会使用与生产环境里不同的一些配置文件来为提供参数,而你的程序又是以类似下面的方法来读取配置文件:

String configFileName = "config.properties";
Properties properties = new Properties();
properties.load(MyClass.class.getClassLoader().getResourceAsStream(configFileName));

上面的代码中仅使用了配置文件名,而不是其完整路径,这就导致了可能在IntelliJ中运行一个单独的单元测试的时候,找不到该配置文件,因为你只提供文件名的话,该文件必须要在classpath中,否则是找不到它的。

阅读更多

[原创](翻译)Java版的各种Thrift server实现的比较

本文是我对这篇文章的翻译:Thrift Java Servers Compared,为了便于阅读,我将原文附于此处,翻译穿插在其中。此外,为了防止原链接在未来某一天失效后,文中的图片再也看不到的问题,我将原文中的图片也保存到了本站的服务器上,我不知道github或原作者是否允许这样做,但我翻译本文仅在于传播知识的目的,在此向原作者和github表示深深的感谢:感谢你们分享了这样好的文章。
       
       
       
Thrift Java Servers Compared
This article talks only about Java servers. See this page if you are interested in C++ servers.
本文仅讨论Java版的Thrift server.如果你对C++版的感兴趣,请参考 这个 页面。

阅读更多