guava读取配置文件

在本文中,我们将为通过Context对象将配置参数传递给Hadoop Mapper提供新的思路。 通常,我们在启动map-reduce作业时将配置参数设置为Context对象上的键/值对。 然后在Mapper中,我们使用键来检索要用于我们的配置需求的值。 不同之处在于,我们将在Context对象上设置一个特殊格式的字符串,并在Mapper中检索值时,使用Guava MapSplitter将格式化后的字符串转换为将用于获取配置参数的HashMap 。 我们可能会问自己为什么要去解决这个麻烦? 通过这种方式进行配置,我们可以在Context对象上设置单个键值对的情况下将多个参数传递给Mapper。 为了说明一种可能的用法,我们将回顾上一篇文章 ,其中介绍了如何执行减少侧连接。 该职位提出的解决方案存在两个问题。 首先,我们假设要加入的键始终是文件中带分隔符的字符串中的第一个值。 其次,我们假设每个文件使用相同的定界符。 如果我们要从密钥位于每个文件中不同位置的文件中加入数据,而某些文件使用不同的定界符怎么办? 另外,我们希望对输出的所有数据使用相同的定界符(如果有),而不考虑任何输入文件中使用的定界符。 尽管这是人为的情况,但它将很好地用于演示目的。 首先让我们研究一下MapSplitter类是什么以及如何使用它。

MapSplitter

MapSplitterSplitter类中的一个嵌套类。 Spitter接受一个字符串,并使用给定的定界符将其拆分为多个部分。 MapSplitter通过从字符串创建Map <String,String>进一步走了一步,该字符串的键值对用一个定界符分隔,而对值本身则完全用另一个定界符分隔。 让我们看一个例子:

Map<String,String> configParams = Splitter.splitOn("#").withKeyValueSeparator("=").split("6=June#7=July#8=August");

在上面的示例中,字符串"6=June#7=July#8=August"将被转换为Map,键6,7和8分别映射到June,July和August。 MapSplitter是一个非常简单但功能强大的类。 现在我们知道了MapSplitter工作原理,让我们看一下如何使用它来帮助我们为map-reduce作业设置配置参数

使用MapSplitter进行配置

以前,我们通过在Context对象中为map-reduce作业设置值,来将连接键的索引位置和分隔符设置为对所有文件相同。 现在,我们希望能够根据需要在每个输入文件的基础上进行设置。 我们仍将根据需要提供默认值。 为了完成此更改,我们将创建一个属性文件,该属性文件将文件名作为键,并且该值将是格式设置为MapSplitter使用的MapSplitter 。 我们的属性文件如下所示:

oneToManyEmployer2.txt=keyIndex=1&separator=|
oneToManyVehicles2.txt=keyIndex=1&separator=#

在这里,我们指示文件oneToManyEmployer2.txt在索引位置1处具有我们的连接键,而分隔符为“ |” 竖线字符和oneToManyVehicles2.txt文件在索引位置1处具有连接键,并使用“,”逗号作为分隔符。 我们将对驱动程序类进行一些更改。 首先,我们将加载属性文件(假设我们已将文件放置在相对于调用hadoop的目录中)。

InputStream inputStream = new FileInputStream(new File("./jobs/join-config.properties"));
Properties properties = new Properties();
properties.load(inputStream);

首先,我们定义一个常规的Splitter对象,该对象将在斜杠“ /”上拆分文件名。 接下来,当我们遍历文件名时,通过对从Splitter.split方法调用返回的Iterable对象调用Iterables.getLast来获得文件的基本名称。 然后,我们尝试在Properties.getProperty方法中为每个文件检索配置的属性字符串。 请注意,如果找不到文件的属性,我们还将传递defaultMapConfig变量,该变量提供默认值。 我们还添加了一些其他配置键和值。 将值连接在一起时使用的定界符以及文件的连接顺序,该顺序由文件在提供给程序的参数中的位置确定。 然后,我们仅使用文件名作为键将格式化后的字符串放入Context对象。

String defaultMapConfig = "keyIndex=0&separator=,";
Splitter splitter = Splitter.on('/');
for (int i = 0; i < args.length - 1; i++) {String fileName = Iterables.getLast(splitter.split(args[i]));String mapConfig = properties.getProperty(fileName, defaultMapConfig);builder.append(mapConfig).append("&joinDelimiter=,&joinOrder=").append(i + 1);config.set(fileName, builder.toString());builder.setLength(0);filePaths.append(args[i]).append(",");
}

使用配置值

要使用我们的配置值,我们首先必须检索存储为包含我们的配置参数的字符串的HashMap

private Splitter.MapSplitter mapSplitter = Splitter.on("&").withKeyValueSeparator("=");
.......
private Map<String,String> getConfigurationMap(Context context){FileSplit fileSplit = (FileSplit)context.getInputSplit();String configString = context.getConfiguration().get(fileSplit.getPath().getName());return mapSplitter.split(configString);}

在这里,我们使用MapSplitter实例变量,并通过使用此Mapper使用的文件名检索存储在Context的格式化字符串来创建HashMap 。 现在,我们可以简单地从映射中拉出所需的配置参数,如setup方法中所示:

protected void setup(Context context) throws IOException, InterruptedException {Map<String,String> configMap = getConfigurationMap(context);keyIndex = Integer.parseInt(configMap.get("keyIndex"));String separator = configMap.get("separator");splitter = Splitter.on(separator).trimResults();String joinDelimiter = configMap.get("joinDelimiter");joiner = Joiner.on(joinDelimiter);joinOrder = Integer.parseInt(configMap.get("joinOrder"));}

map方法中的代码与我们先前的文章中的代码相同。现在我们每个文件都具有完全可配置的设置,而且我们不限于将join键放在一个位置,也不必每个文件使用相同的定界符。 当然,这只是一个示例,但是此处概述的方法可用于配置许多其他设置,并且只需要Context对象中的一个键即可。

结果

最初,我们的数据如下所示:

oneToManyEmployer2.txt:

Creative Wealth|cdd8dde3-0349-4f0d-b97a-7ae84b687f9c
Susie's Casuals|81a43486-07e1-4b92-b92b-03d0caa87b5f
Super Saver Foods|aef52cf1-f565-4124-bf18-47acdac47a0e
.....

oneToManyVehicles2.txt:

2003 Holden Cruze#cdd8dde3-0349-4f0d-b97a-7ae84b687f9c
2012 Volkswagen T5#81a43486-07e1-4b92-b92b-03d0caa87b5f
2009 Renault Trafic#aef52cf1-f565-4124-bf18-47acdac47a0e
.....

singlePersonRecords.txt:

cdd8dde3-0349-4f0d-b97a-7ae84b687f9c,Esther,Garner,4071 Haven Lane,Okemos,MI
81a43486-07e1-4b92-b92b-03d0caa87b5f,Timothy,Duncan,753 Stadium Drive,Taunton,MA
aef52cf1-f565-4124-bf18-47acdac47a0e,Brett,Ramsey,4985 Shinn Street,New York,NY
......

运行我们的map-reduce作业后,结果看起来就像我们想要的一样:

08db7c55-22ae-4199-8826-c67a5689f838,John,Gregory,258 Khale Street,Florence,SC,2010 Nissan Titan,Ellman's Catalog Showrooms
0c521380-f868-438c-9916-4ab4ea76d316,Robert,Eversole,518 Stratford Court,Fayetteville,NC,2002 Toyota Highlander,Specialty Restaurant Group
1303e8a6-0085-45b1-8ea5-26c809635da1,Joe,Nagy,3438 Woodstock Drive,El Monte,CA,2011 Hyundai ix35,Eagle Food Centers
15360125-38d6-4f1e-a584-6ab9d1985ab8,Sherri,Hanks,4082 Old House Drive,Alexandria,OH,2003 Toyota Solara,Odyssey Records & Tapes
......

资源资源

  • Jimmy Lin和Chris Dyer 使用MapReduce进行的数据密集型处理
  • Hadoop: Tom White 的权威指南
  • 来自博客的源代码和测试
  • 编程蜂巢爱德华卡普里奥罗,院长Wampler和Jason拉瑟格伦
  • 通过Alan Gates 编程Pig
  • Hadoop API
  • MRUnit用于单元测试Apache Hadoop映射减少工作
参考: 《 随机编码》博客上的JCG合作伙伴 Bill Bejeck提供的使用Guava MapSplitters配置Hadoop 。

翻译自: https://www.javacodegeeks.com/2013/09/configuring-hadoop-with-guava-mapsplitters.html

guava读取配置文件

guava读取配置文件_使用Guava MapSplitters配置Hadoop相关推荐

  1. 使用Guava MapSplitters配置Hadoop

    在本文中,我们将为通过Context对象将配置参数传递给Hadoop Mapper提供新的思路. 通常,我们在启动map-reduce作业时将配置参数设置为Context对象上的键/值对. 然后,在M ...

  2. springboot 读取配置文件_使用 @ConfigurationProperties 在 Spring Boot 中加载配置

    本文地址: 使用 @ConfigurationProperties 在 Spring Boot 中加载配置 使用 Spring Boot 加载配置文件的配置非常便利,我们只需要使用一些注解配置一下就能 ...

  3. 读取 配置文件_自动化测试中,如何读取配置文件内容?

    构建测试知识体系,欢迎关注 " 自动化中的配置信息,比如域名.数据库信息.kafka信息等,通常是放到配置文件中的.那么如何读取配置文件中的信息呢?" 自动化测试代码中,像请求域名 ...

  4. java错误无法读取配置文件_解决Java Web项目无法读取配置文件问题

    错误描述 报错信息如下图所示,Web应用后台在读取配置文件的时候,系统找不到指定的路径. 这是Java Web项目的目录结构: 这是报错部分的代码: static { try { Properties ...

  5. mysql路由器配置文件_如何安装并配置mysql 5.7.13解压缩版?

    如何安装并配置mysql 5.7.13解压缩版? MySQL是一个关系型数据库管理系统,官方网站是http://www.mysql.com/,分为MySQL Enterprise Edition(co ...

  6. mysql 多实例 独立配置文件_三、安装配置多实例MYSQL5.6-多独立配置文件方法

    三.安装配置多实例MYSQL5.6-多独立配置文件方法 1.准备工作 检查操作系统版本.内核版本.selinux是否关闭.防火墙策略.IP地址.主机名配置.host表配置.yum配置 上传cmake. ...

  7. classloader读取配置文件_类加载器加载配置文件的几种写法

    public static void main(String[] args) throws Exception{ // TODO Auto-generated method stub /*getRea ...

  8. linux c配置文件书写格式,读取配置文件源代码[linux c]

    转自:http://gcody.wwww.blog.ccidnet.com/blog-htm-do-showone-uid-36931-type-blog-itemid-114988.html 自己今 ...

  9. Linux C代码实现读取配置文件示例

    最近在看hostapd,该程序使用了conf配置文件,本文参考hostapd代码抽取出读取配置文件的示例,由于配置选项和业务密切相关,实际使用中仍需要做修改. 下面是代码示例: /** 读配置文件示例 ...

最新文章

  1. w ndows7启动后没有图标,Windows7下双击桌面图标无法打开怎么解决?
  2. python3.5.2-python升级 (2.6升级到3.5)
  3. DSP平台实现图像识别算法总体来说不如嵌入式?
  4. LeetCode 1004.最长连续1的个数
  5. ceres学习之平面拟合
  6. Github 王炸功能!Copilot 替代打工人编程?
  7. ECS事件通知之创建失败事件
  8. 一文带你认识HTML
  9. Ubuntu 各版本代号简介
  10. springboo集成axis2实现webservice服务
  11. 面向问题编程-切面+反射实现字段级别权限控制
  12. 吉林公主岭玉米丰收将成定局
  13. inverted dropout(反向随机失活)正则化
  14. Caused by: java.lang.invoke.LambdaConversionException: Invalid receiver type class redacted.BasicEnt
  15. 标准H.460公私网穿越视频解决方案
  16. antd ellipsis
  17. 记 · 再看 · 前端社区氛围
  18. redis数据一致性之延时双删详解
  19. 开启 Linux 版的 Window 子系统(WSL)
  20. 关于笔记本键盘进水,之后需注意的要点以及关闭win10内置键盘的步骤

热门文章

  1. 【背包】逃亡的准备 (ssl 1236)
  2. 汇编语言(三十二)之读写文件
  3. java8的函数指针
  4. JavaWeb的web.xml标签元素(二)
  5. MySQL 调优/优化的 101 个建议!
  6. 【php】正则无法截取\反斜杠的解决方法
  7. 你们考试,我们都有点紧张呢…
  8. 激动的时刻,终于成啦~
  9. 《走遍中国》珍藏版(六)
  10. bootstrap样式