点此下载 10000_access.log,使用“右键另存为”保存文件。
MapReduce用户接口Mapper、Reducer——job的核心
作业的核心
应用程序通常实现Mapper和Reducer接口以提供map和reduce方法。 这些构成了job(作业)的核心。
Mapper
Mapper将输入的键/值对key/value映射为一组中间键/值对key/value。映射是将输入记录转换为中间记录的单个任务。 转换后的中间记录不必与输入记录具有相同的类型。 给定的输入对可能映射为零或许多输出对。
Hadoop MapReduce框架为每个InputSplit生成一个map任务。InputSplit是由InputFormat生成的。
总体而言,Mapper 的实现类要传递给 Job 使用,须调用 Job.setMapperClass(Class) 方法设置job的map函数;然后,MP框架为该任务的 InputSplit 中的每个键/值对调用map(WritableComparable,Writable,Context)方法。 然后,应用程序可以重写cleanup(Context)方法来执行任何必需的清理。
map函数的输出对的类型不一定要与输入对的类型一样。 给定的输入对可能 map 映射为零或许多个输出对。 通过调用 context.write(WritableComparable, Writable) 方法来收集输出对。
Application应用程序可以使用Counter来报告它的统计信息。
与给定输出键 key 相关联的所有中间值 values 随后被MR框架分组,然后传递给 Reducer 以得到最终输出。用户可以通过 Job.setGroupingCompatorClass(Class) 方法指定一个 Comparator 来控制分组。
对Mapper的输出进行排序,然后按每个Reducer进行划分(partition)。分区(partitions) 的总数与作业(job)的reduce任务数相同。
用户可以通过实现自定义的 Partitioner 类来控制哪些键 key (以及记录 records )进入哪个Reducer进行处理。
用户还可以通过 Job.setCombinerClass(Class) 方法指定一个 Combiner ,以在本地执行中间输出的聚合(local aggregation)操作,这样可以减少Mapper到Reducer之间的数据传输量。实际上就是在map操作之后,在本地再执行一次 reduce操作,可以参考前面写的PartitionApp类的代码。
The intermediate, sorted outputs are always stored in a simple (key-len, key, value-len, value) format. Applications can control if, and how, the intermediate outputs are to be compressed and the CompressionCodec to be used via the Configuration.
原文是这样,这句话不是很理解。
多少个 Map
map 的数量通常由输入的总大小(即输入文件的块总数 the total number of blocks of the input files)决定。
map 的正确并行度似乎是每个节点大约10-100个 map ,尽管已经为 very cpu-light map(CPU非常轻的任务)任务设置了300个map。 因为任务的设置需要一段时间,所以执行map的时间最好满足至少一分钟。
因此,如果您期望的输入数据大小为10TB,块大小为128MB,那么最终将获得82,000个映射map, (10 * 1024 * 1024 ÷ 128 = 81920),除非使用 Configuration.set(MRJobConfig.NUM_MAPS, int)(它只给框架提供了一个提示 hint)将其设置得更高。
Reducer
Reducer 将同一个 key 对应的一组中间值的集合归约为一个更小的values的集合。
用户通过 Job.setNumReduceTasks(int) 方法设置作业的 reduce的数量。
相似地,Reducer 的实现类要传递给 Job 使用,须调用 Job.setReducerClass(Class) 方法设置job的reduce函数;然后,MP框架为分组输入(grouped inputs)中的每个键/值对调用reduce(WritableComparable, Iterable<Writable>, Context)方法。 然后,应用程序可以重写cleanup(Context)方法来执行任何必需的清理。
Reducer 主要有三个主要阶段:shuffle, sort 和 reduce。
Shuffle
Reducer 的输入是 Mapper 的排序输出。在这个阶段,MP框架通过HTTP获取所有mapper输出的相关的分区(relevant partition)。
Sort
在此阶段,框架按键 key对Reducer的输入进行分组(因为不同的mapper可能输出相同的键key)。shuffle和sort阶段同时发生;当获取mapper的输出时,它们被合并。
Secondary Sort
如果 将中间键分组的等价规则 与 归约前的键分组的等价规则 需要不同,则可以通过 Job.setSortCompatorClass(Class) 指定一个 Comparator。由于 Job.setGroupingComparatorClass(Class)能够用来控制中间键(intermediate keys)的分组方式,这些可以被结合起来以模拟对值values的二次排序 secondary sort。
Reduce
在这个阶段对分组输入中的所有<key, (list of values)> pair调用 reduce(WritableComparable, Iterable<Writable>, Context)方法。
reduce任务的输出通常通过 Context.write(WritableComparable,Writable)写入HDFS文件系统(FileSystem)。
和Map一样,Applications可以使用Counter来报告它的统计信息。
Reducer的输出是没有经过排序的。
多少个 Reduce
正确的 reduce 数似乎是 0.95或1.75乘以(<no.of nodes> * <no.of maximum containers per node>) 。
对于0.95,所有的reduce都可以立即启动,并在map完成时开始传输map输出。对于1.75,速度更快的节点将完成他们的第一轮reduce,并启动第二轮reduce,在负载均衡方面做得更好。
增加reduce的数量,会增加框架的开销,但是也增加了负载均衡和降低了故障成本。
上面的缩放因子(如0.95,1.95)略小于整数 ( whole numbers ),以便在框架中为推测性任务和失败任务保留少部分的reduce插槽(reduce slots)。
Reducer NONE
如果不需要归约是可以将reduce tasks的数量设置为0的。
在这种情况下,map tasks的输出将直接写到FileSystem,输出的路径是通过 FileOutputFormat.setOutputPath(Job, Path)方法设置的路径。框架不会在将map的输出写到FileSystem之前对它们进行排序。
Partitioner
Partitioner对key空间进行划分。
Partitioner控制map的中间输出的keys的划分。key或key的子集通常通过hash散列函数得到划分分区(partitions)。partitions的总数与reduce任务数相同。因此,这控制了中间key(以及记录record)被发送到m个reduce任务中哪一个reduce任务进行归约操作。
HashPertitioner是默认的Partitioner。
Counter
Counter是MapReduce应用程序报告其统计信息的工具。Mapper和Reducer的实现类可以使用Counter报告统计信息。
Hadoop Mapreduce提供了一个library,org.apache.hadoop.mapreduce包含有用的 mappers, reducers, partitioners。
Java中的静态导入import static(导入类的静态成员)
Hadoop入门案例(一): WordCount
MapReduce作业的输入与输出
MapRecude计算框架是在键值对<key, value>上进行操作的。MapReduce计算框架将作业的输入视为一组<key,value>对,并生成一组<key, value>对作为其输出,可能是不同类型的。<key, value>中:
- key和value的类都要由框架实现序列化,所以都需要实现
org.apache.hadoop.io.Writable接口; - 除此之外key的类还需要实现
org.apache.hadoop.io.WritableComparable接口,因为在map操作之后还需要对key进行排序操作。
MapReduce作业的输入和输出类型:
(input) <k1, v1> -> map -> <k2, v2> -> combine -> <k2, v2> -> reduce -> <k3, v3> (output)
Linux/macOS Shell终端快捷键
1。有时候调用历史命令,都是很长的那种,然后发现并不是自己想要的,需要重新输入,如何快速删除已有/已输入的命令/内容?
Ctrl + C
2。Linux/moacOS 终端命令行输入的常用快捷键。
ssh配置免密码登录至Linux—已配置密钥仍无法登陆等问题
SSH连接免密码登录配置
方法一:手动复制公钥至服务器
ssh-keygen -t rsa在客户端生成密钥对- 把公钥拷贝给要登录的目标主机,手动复制粘贴
- 目标主机上将这个公钥加入到授权列表
cat id_rsa.pub >>authorized_keys - 目标主机还要将这个授权列表文件权限修改为
600,chmod 600 authorized_keys - 在用户目录下即
~执行以下步骤:rm -rf .ssh/# 会删除已有的密钥,谨慎删除ssh-keygen -t rsacat .ssh/id_rsa.pub >> .ssh/authorized_keyschmod 700 .sshchmod 600 .ssh/authorized_keys
这种方法容易出错,推荐使用方法二
使用Github Actions CI / CD 自动化部署Hexo到Github/Gitee Pages

在当前仓库 hexobackup 配置以下工作流,实现向当前仓库提交更新时,触发 GitPages 自动编译。
graph TD;
1(手动执行 hexo g 和 hexo d 部署命令)-->自动推送GiteePages仓库-->2(已推送至 Gitee Pages 仓库)-->官方自动部署GiteePages要钱;
1-->自动推送GithubPages仓库-->已推送至GithubPages仓库-->官方自动部署GithubPages-->完成同步更新;
2-->3;
手动推送更新至hexobackup仓库触发Actions-->3(Actions等待工作流中配置的部署GiteePages作业被触发执行)-->自动部署GiteePages-->完成同步更新;
完成_config.yml文件的deploy配置-->1;
Something about Continuously Integrity / Continuously Deploy…
Github Actions.
.github/workflows/main.yml文件代码:
1 | name: Sync |
SSH
CI 持续集成
Git Bash中使用ssh远程连接至macOS/Linux服务器中文乱码 附Git Bash for Windows主题美化和字体设置
Windows Git Bash 主题美化和字体设置
ssh远程连接至服务器,终端命令提示符等乱码
问题描述:
远程服务器上我使用的是oh-my-zsh终端并且使用了agnoster主题以及Meslo LG L DZ Regular for Powerline字体,在Windows上使用ssh远程连接至服务器时由于Windows没有Powerline字体,终端命令提示符有些非ASCII字符会乱码。
解决方法:
- 下载并安装字体
在Windows上安装上述字体,点击 Meslo LG L DZ Regular for Powerline 下载字体至本地,双击下载的字体文件,安装字体。 - 修改Git Bash配置文件使用安装好的字体
在Git Bash的Option中的Text选项卡也能设置字体,但是它的字体列表显示的不完全,很多Windows上已有的和上述新安装的Powerline字体在Git bash的设置里面都找不到。解决方法是直接修改Git Bash的配置文件,一般这个配置文件都是用户目录下的.minttyrc文件,即~/.minttyrc,如果没有这个文件也不影响下面的操作,会自动创建。在~/.minttyrc文件中填写以下配置:
1 | Font=Meslo LG L DZ Regular for Powerline |
主题配色和隐藏用户主机名
- 主题美化:
主题美化很简单,事实上已经配置完成了。以上配置文件中已经配置了字体Font和字体大小FontHeight,同时也配置了MinGW的主题配色为mintty-colors-solarized。重启Git Bash就能看到新的主题配色和字体。 - 隐藏命令提示符前的 ‘用户名@主机名’:
打开Git Bash,输入命令vi ~/.profile打开.profile文件,按i进入INSERT模式,在文件末尾添加一行export PS1="\W\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ ",按ESC,输入:wq保存退出。再次重启Git Bash,用户名和主机名都不会显示啦。如果想只显示用户名而不显示电脑主机名,就把输入的那一行改为改成啥来着,忘了,百度一下吧。
使用ssh远程连接时中文乱码
问题描述:
在本地Windows系统的Git Bash上使用ssh连接至远程的macOS服务器(Linux同理),中文还是乱码。
解决方法:
- 在Windows上编辑
~/.minttyrc文件,填入Locale=zh_CN和Charset=UTF-8这两行(上面修改主题部分给出的配置中已经有了这两行,没有就添加)以修改字符集为UTF-8; - 在
ssh username@host连接上远程服务器之后,输入export LANG="zh_CN.UTF-8",中文即可显示正常。 - 第2点的命令只对本次连接有效,下次使用ssh重新连接远程服务器时还是会出现中文乱码。为使之永久生效,可以将上述export命令添加到远程主机(macOS/Linux)的环境变量中。
写完才发现我远程oh-my-zsh(macOS上)使用的字体是 Menlo-for-Powerline ,虽然Windows本地的Git Bash上配置的字体和远程终端不一样,但是也不影响,因为两者都是支持非ASCII字符显示的Powerline字体。
链接:macOS终端iTerm2及其主题美化:
- macOS使用oh-my-zsh美化Terminal,iTerm2,VSCode命令行终端配置教程
- Mac OS 終端機美化(Mac OS Terminal)
- 【vscode】windows中使用zsh美化vscode终端
- 一款基于 Electron 的跨平台终端 Terminal Emulator: Hyper
Linux/macOS终端命令之——basename / dirname,从完整文件名获取文件名/路径名
Linux/macOS终端命令之——find
查找命令