今天在读hadoop源码时发现DefaultStringifier这个类很有意思,主要是用来从configuration对象中get或set key、value键值对的时候使用。

具体原因不是很清楚,在网上google了下:

写MapReduce程序通常要传递各种各样的参数,选择合适的方式来传递参数既能提高工作效率,也可以避免bug的产生。根据参数的大小,可以粗略的分为以下几种。

最直接的方式就是使用Configuration的各种set方法,对于基本数据类型都有很好的支持,比如传递kmeans聚类算法的中心点个数。

如何传递一个对象型参数?话说所有的对象都是由基本类型构建的,所以我们可以覆盖这个对象的toString()方法,将它的所有元素表示成字符串,然后使用Configuration.set(name, value)传递这个字符串。然后在Mapper端获得这个字符串,做析构。这种朴素的方法有两个缺点。首先,将对象变成字符串会有精度上的损失,比如 double类型转换成字符串,不仅精度有损失,而且8字节的空间用字符串来表示可能会变成几十字节。其次,由于字符串化和反字符串化分散在不同的地方,很容易产生bug,如果修改了这个对象的结构,这种bug产生的几率非常大。既然有这种需求存在,难道hadoop没有提供nice点的方法吗?有,不过在api文档中没有直接说明。

正确的方法是,让这个对象实现Writable接口,使它具有序列化的能力,然后使用org.apache.hadoop.io.DefaultStringifier的store(conf,  obj, keyname)和load(conf, keyname, itemclass)静态方法设置和获取这个对象。他的主要思想就是将这个对象序列化成一个字节数组后,用Base64编码成一个字符串,然后传递给 conf, 解析的时候与之类似。

如何传递更大的参数,比如分词用的语料库等等?可以使用hadoop的缓存文件DistributedCache。

1、使用configuration的set()和get()方法,这里的name和value都是String型

Configuration.set(name, value)

Configuration.get(name)

这种方法适合基本数据类型的传递。

2、使用Stringifier 接口。

DefaultStringifier.store(conf, object ,"key");

将object以序列化后以指定的key存在conf中。

object = DefaultStringifier.load(conf, "key", variableClass );

从conf中取出object。

需要指出的是使用第二种方法的对象必须是可序列化的。Hadoop的序列化是通过Writable接口来实现的,在org.apache.hadoop.io包下包含了大量的可序列化的组件,它们都实现了Writable接口,Writable接口提供了两个方法,write和readFields,分别用来序列化和反序列化,

hadoop 之DefaultStringifier相关推荐

  1. hadoop 023.0与hadoop 1.0 io.serializable分析

    2019独角兽企业重金招聘Python工程师标准>>> hadoop升级到0.23.0和1.0版本后,其IO底层除了自己实现的Writable序列化后,还增加了一个io.serial ...

  2. MapReduce基础开发之四参数传递

    Map和Reduce函数是在各节点进行,如果要在MapReduce数据加工中使用共同参数,要如何传参呢?方法有二: 1.Configuration类的set和get的方法读取xml/txt文件设置或自 ...

  3. hadoop 添加删除机器以及设置免密登录

    添加hadoop机器 先在slaves中添加机器 然后启动datanode $: ./usr/hadoop-0.20.2-cdh3u4/bin/hadoop-daemon.sh start datan ...

  4. linux环境下快速配置hadoop集群免密登录

    背景 在hadoop的日常使用过程中经常需要登录某些机器,如何更好的免密登录呢?这将为我们节省大量的时间 操作 假设你需要在A机器上免密登录B机器,那么你首先要确定B机器下是有秘钥文件的.如何确定是否 ...

  5. hadoop问题小结

    20220322 https://blog.csdn.net/lt5227/article/details/119459827 hadoop控制台设置密码 访问验证 20220314 进入hive 高 ...

  6. hadoop,spark,scala,flink 大数据分布式系统汇总

    20220314 https://shimo.im/docs/YcPW8YY3T6dT86dV/read 尚硅谷大数据文档资料 iceberg相当于对hive的读写,starrocks相当于对mysq ...

  7. spark,hadoop区别

    https://zhuanlan.zhihu.com/p/95016937 Spark和Hadoop的区别和比较: 1.原理比较: Hadoop和Spark都是并行计算,两者都是用MR模型进行计算 H ...

  8. 2021年大数据Hadoop(三十):Hadoop3.x的介绍

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 Hadoop3.x的介绍 介绍 Hadoop 3.0新特性 ...

  9. 2021年大数据Hadoop(二十九):​​​​​​​关于YARN常用参数设置

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 关于yarn常用参数设置 设置container分配最小内 ...

最新文章

  1. C#调用C++的dll文件方法
  2. shell 获取值 默认值
  3. IOS6 新特性之UIRefreshControl
  4. ACCESS中不支持left join解决方案
  5. PHP安装ZIP扩展
  6. Tensorflow之 CNN卷积神经网络的MNIST手写数字识别
  7. MCSE第六课-DHCP
  8. 为什么没有看到webcontent_环卫工人工资低工作辛苦,为什么还有那么多人愿意做呢?...
  9. 2017android 最强旗舰,2017年世界六大旗舰机,华为第五,第一惊艳全球!
  10. centos7下docker设置阿里云镜像(自定义阿里云镜像)
  11. Bugzilla简明使用手则
  12. pingfang css,前端项目,引入PingFang SC字体
  13. android手机通讯录格式转换,手机通讯录csv格式转vcf格式工具 安卓电话本数据格式转换程序...
  14. 网络规划设计师教程pdf版下载
  15. itext tif图片转为pdf
  16. Lrc文件与音乐的同步显示
  17. IR-61|1895075-34-9|七甲川吲哚类花菁染料near-infrared fluorophore
  18. PTA 7-114 用if-else语句编程百分制成绩转换为五分制成绩
  19. mysql端口号3306被占用_使用pandas将excel表格数据导入到mysql中
  20. web端禁止打开控制台

热门文章

  1. 聊聊elasticsearch的RoutingService
  2. 数据结构之——队列与循环队列
  3. 对DataSet,DataRow,DateTable转换成相应的模型
  4. eclips 的pydev的debug
  5. Entity Framework 无法对没有主键的视图映射实体的解决办法
  6. C++默认参数与函数重载
  7. 开启文件高级共享功能
  8. 黑马vue---10-11、Vue实现跑马灯效果
  9. 【面向对象设计与构造】第一次博客作业
  10. 跟我学JAVA / 第三课:Java流程控制与数组