wordpress博客网站多少钱,北京建工集团有限公司官网,烟台网站排名优化报价,seo网络推广机构HDFS 集群
HDFS 集群是建立在 Hadoop 集群之上的#xff0c;由于 HDFS 是 Hadoop 最主要的守护进程#xff0c;所以 HDFS 集群的配置过程是 Hadoop 集群配置过程的代表。
使用 Docker 可以更加方便地、高效地构建出一个集群环境。
每台计算机中的配置
Hadoop 如何配置集群…HDFS 集群
HDFS 集群是建立在 Hadoop 集群之上的由于 HDFS 是 Hadoop 最主要的守护进程所以 HDFS 集群的配置过程是 Hadoop 集群配置过程的代表。
使用 Docker 可以更加方便地、高效地构建出一个集群环境。
每台计算机中的配置
Hadoop 如何配置集群、不同的计算机里又应该有怎样的配置
HDFS 命名节点对数据节点的远程控制是通过 SSH 来实现的因此关键的配置项应该在命名节点被配置非关键的节点配置要在各个数据节点配置。也就是说数据节点与命名节点的配置可以不同不同数据节点之间的配置也可以有所不同。
为了方便建立集群我使用相同的配置文件通过 Docker 镜像的形式同步到所有的集群节点
具体步骤
总体思路是先用一个包含 Hadoop 的镜像进行配置配置成集群中所有节点都可以共用的样子然后再以它为原型生成若干个容器构成一个集群。
配置原型
首先使用之前准备的 hadoop_proto 镜像启动为容器
docker run -d --namehadoop_temp --privileged hadoop_proto /usr/sbin/init进入 Hadoop 的配置文件目录
cd $HADOOP_HOME/etc/hadoop文件作用workers记录所有的数据节点的主机名或 IP 地址core-site.xmlHadoop 核心配置hdfs-site.xmlHDFS 配置项mapred-site.xmlMapReduce 配置项yarn-site.xmlYARN 配置项
集群的原型配置完毕后退出容器并上传容器到新镜像 cluster_proto
docker stop hadoop_temp
docker commit hadoop_temp cluster_proto部署集群
首先要为 Hadoop 集群建立专用网络 hnet
docker network create --subnet172.20.0.0/16 hnet接下来创建集群容器
docker run -d --namenn --hostnamenn --networkhnet --ip172.20.1.0 --add-hostdn1:172.20.1.1 --add-hostdn2:172.20.1.2 --privileged cluster_proto /usr/sbin/init
docker run -d --namedn1 --hostnamedn1 --networkhnet --ip172.20.1.1 --add-hostnn:172.20.1.0 --add-hostdn2:172.20.1.2 --privileged cluster_proto /usr/sbin/init
docker run -d --namedn2 --hostnamedn2 --networkhnet --ip172.20.1.2 --add-hostnn:172.20.1.0 --add-hostdn1:172.20.1.1 --privileged cluster_proto /usr/sbin/init进入命名节点
docker exec -it nn su hadoop格式化 HDFS
hdfs namenode -format如果没有出错那么下一步就可以启动 HDFS
start-dfs.sh成功启动之后jps 命令应该能查到 NameNode 和 SecondaryNameNode 的存在。命名节点不存在 DataNode 进程因为这个进程在 dn1 和 dn2 中运行。
MapReduce 使用
Word Count 就是词语统计这是 MapReduce 工作程序中最经典的一种。它的主要任务是对一个文本文件中的词语作归纳统计统计出每个出现过的词语一共出现的次数。
Hadoop 中包含了许多经典的 MapReduce 示例程序其中就包含 Word Count。
注意这个案例在 HDFS 不运行的状态下依然可以运行所以我们先在单机模式下测试
首先启动一个之前制作的 hadoop_proto 镜像的新容器
docker run -d --nameword_count hadoop_proto进入容器
docker exec -it word_count bash进入 HOME 目录
cd ~现在我们准备一份文本文件 input.txt
I love China
I like China
I love hadoop
I like hadoop将以上内容用文本编辑器保存。
执行 MapReduce
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.4.jar wordcount input.txt output解释一下含义
hadoop jar从 jar 文件执行 MapReduce 任务之后跟着的是示例程序包的路径。
wordcount表示执行示例程序包中的 Word Count 程序之后跟这两个参数第一个是输入文件第二个是输出结果的目录名因为输出结果是多个文件。
执行之后应该会输出一个文件夹 output在这个文件夹里有两个文件_SUCCESS 和 part-r-00000。
集群模式
现在我们在集群模式下运行 MapReduce。
启动在上一章配置好的集群容器
docker start nn dn1 dn2进入 NameNode 容器
docker exec -it nn su hadoop进入 HOME
cd ~编辑 input.txt
I love China
I like China
I love hadoop
I like hadoop启动 HDFS
start-dfs.sh创建目录
hadoop fs -mkdir /wordcount
hadoop fs -mkdir /wordcount/input上传 input.txt
hadoop fs -put input.txt /wordcount/input/执行 Word Count
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.4.jar wordcount /wordcount/input /wordcount/output查看执行结果
hadoop fs -cat /wordcount/output/part-r-00000如果一切正常将会显示以下结果
I 4
hadoop 2
like 2
love 2
China 2MapReduce 编程
在学习了 MapReduce 的使用之后已经可以处理 Word Count 这类统计和检索任务但是客观上 MapReduce 可以做的事情还有很多。
MapReduce 主要是依靠开发者通过编程来实现功能的开发者可以通过实现 Map 和 Reduce 相关的方法来进行数据处理。
为了简单的展示这一过程我们手工编写一个 Word Count 程序。
注意MapReduce 依赖 Hadoop 的库但我使用的 Hadoop 运行环境是 Docker 容器难以部署开发环境所以真实的开发工作包含调试将需要一个运行 Hadoop 的计算机。
MyWordCount.java 文件代码
/*** 引用声明* 本程序引用自 http://hadoop.apache.org/docs/r1.0.4/cn/mapred_tutorial.html*/
package com.runoob.hadoop;
import java.io.IOException;
import java.util.*;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.*;
/*** 与 Map 相关的方法*/
class Map extends MapReduceBase implements MapperLongWritable, Text, Text, IntWritable {private final static IntWritable one new IntWritable(1);private Text word new Text();public void map(LongWritable key,Text value,OutputCollectorText, IntWritable output,Reporter reporter)throws IOException {String line value.toString();StringTokenizer tokenizer new StringTokenizer(line);while (tokenizer.hasMoreTokens()) {word.set(tokenizer.nextToken());output.collect(word, one);}}
}
/*** 与 Reduce 相关的方法*/
class Reduce extends MapReduceBase implements ReducerText, IntWritable, Text, IntWritable {public void reduce(Text key,IteratorIntWritable values,OutputCollectorText, IntWritable output,Reporter reporter)throws IOException {int sum 0;while (values.hasNext()) {sum values.next().get();}output.collect(key, new IntWritable(sum));}
}
public class MyWordCount {public static void main(String[] args) throws Exception {JobConf conf new JobConf(MyWordCount.class);conf.setJobName(my_word_count);conf.setOutputKeyClass(Text.class);conf.setOutputValueClass(IntWritable.class);conf.setMapperClass(Map.class);conf.setCombinerClass(Reduce.class);conf.setReducerClass(Reduce.class);conf.setInputFormat(TextInputFormat.class);conf.setOutputFormat(TextOutputFormat.class);// 第一个参数表示输入FileInputFormat.setInputPaths(conf, new Path(args[0]));// 第二个输入参数表示输出FileOutputFormat.setOutputPath(conf, new Path(args[1]));JobClient.runJob(conf);}
}将此 Java 文件的内容保存到 NameNode 容器中去建议位置
/home/hadoop/MyWordCount/com/runoob/hadoop/MyWordCount.java注意根据当前情况有的 Docker 环境中安装的 JDK 不支持中文所以保险起见请去掉以上代码中的中文注释。
进入目录
cd /home/hadoop/MyWordCount编译
javac -classpath ${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.1.4.jar -classpath ${HADOOP_HOME}/share/hadoop/client/hadoop-client-api-3.1.4.jar com/runoob/hadoop/MyWordCount.java打包
jar -cf my-word-count.jar com执行
hadoop jar my-word-count.jar com.runoob.hadoop.MyWordCount /wordcount/input /wordcount/output2查看结果
hadoop fs -cat /wordcount/output2/part-00000输出
I 4
hadoop 2
like 2
love 2
China 2