地址 http://k2:8088/cluster/apps http://k1:19888/jobhistory http://k1:9870/dfshealth.html#tab-overview kafka http://k1:9011/ 背景 服务器 172.29.32.81 k1 172.29.32.82 k2 172.29.32.83 k3 软件版本 Hadoop:3.1.3;安装目录:/opt/module/ Java:jdk-8u361-linux-x64;安装目录:/opt/software/ 集群部署规划 k1 k2 k3 HDFS NameNode DataNode DataNode SecondaryNameNode DataNode YARN NodeManager ResourceManager NodeManager NodeManager
安装步骤
- Hadoop和Java下载/上传至服务器
- 解压安装包到安装目录 tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/ tar -zxvf jdk-8u361-linux-x64.tar.gz -C /opt/software/
- 配置环境变量 vim /etc/profile export JAVA_HOME=/opt/software/jdk1.8.0_361 export HADOOP_HOME=/opt/module/hadoop-3.1.3 export PATH=HADOOP_HOME/bin:$PATH
- 关闭防火墙、禁用swap、配置免密登录 关闭防火墙 systemctl stop firewalld
- 配置集群 进入Hadoop配置目录/opt/module/hadoop-3.1.3/etc/hadoop 1)核心配置文件 用于定义系统级别的参数,如 HDFS URL 、Hadoop 的临时目录等
修改core-site.xml
fs.defaultFS hdfs://k1:8020 hadoop.tmp.dir /opt/module/hadoop-3.1.3/data hadoop.http.staticuser.user root hadoop.proxyuser.root.hosts * hadoop.proxyuser.root.groups * hadoop.proxyuser.root.users * 2)HDFS配置文件 如名称节点和数据节点的存放位置、文件副本的个数、文件的读取权限等修改hdfs-site.xml
dfs.replication 3 dfs.namenode.http-address k1:9870 dfs.namenode.secondary.http-address k3:9868 dfs.permissions false 3)YARN 配置文件 修改yarn-site.xml yarn.nodemanager.aux-services mapreduce_shuffle yarn.resourcemanager.hostname k2 yarn.application.classpath 具体的hadoop classpath(在命令行输入:hadoop classpath的内容) 4)MapReduce 配置文件 修改mapred-site.xml mapreduce.framework.name yarn 5)Hadoop环境变量配置文件 修改hadoop-env.sh export JAVA_HOME=/opt/software/jdk1.8.0_361 export HADOOP_CONF_DIR=/opt/module/hadoop-3.1.3/etc/hadoop 生效 source /opt/module/hadoop-3.1.3/etc/hadoop/hadoop-env.sh-
启动集群 1)格式化NameNode 如果集群是第一次启动,需要在k1格式化 NameNode(注意:格式化NameNode,会产生新的集群 id,导致 NameNode 和 DataNode 的集群 id 不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化 NameNode 的话,一定要先停止 namenode 和 datanode 进程,并且要删除所有机器的 data 和 logs 目录,然后再进行格式化。) 进入Hadoop安装目录 cd /opt/module/hadoop-3.1.3/ 在所有节点删除data及log目录 rm -rf data/ logs/ k1节点格式化 bin/hdfs namenode -format 2)启动hdfs sbin/start-dfs.sh jps检查节点是否正常 k1:NameNode、DataNode k2:DataNode k3:DataNode、SecondaryNameNode 3)在配置了 ResourceManager 的节点(k2)启动 YARN sbin/start-yarn.sh jps检查节点是否正常 k1:NameNode、DataNode、NodeManager k2:DataNode、NodeManager、ResourceManager k3:DataNode、SecondaryNameNode、NodeManager 注意:NameNode 和 ResourceManger 如果不是同一台机器,不能在 NameNode 上启动 YARN,应该在 ResouceManager 所在的机器上启动 YARN。
-
测试集群 Web 端查看 SecondaryNameNode (a)浏览器中输入:http://k1:9870 (b)查看 HDFS 上存储的数据信息 Web 端查看 YARN 的 ResourceManager (a)浏览器中输入:http://k2:8088 (b)查看 YARN 上运行的 Job 信息
-
配置历史服务器 为了查看程序的历史运行情况,需要配置一下历史服务器。 1)修改mapred-site.xml
- 配置日志的聚集 1)修改yarn-site.xml
常用端口 Namenode 端口: dfs.namenode.https-address The namenode secure http server address and port. dfs.namenode.http-address The address and the base port where the dfs namenode web ui will listen on.
fs.defaultFS 指定HDFS运行时nameNode地址 Secondary NN 端口: dfs.namenode.secondary.https-address The secondary namenode HTTPS server address and port dfs.namenode.secondary.http-address The secondary namenode HTTP server address and port Datanode 端口: dfs.datanode.ipc.address The datanode ipc server address and port. dfs.datanode.address The datanode server address and port for data transfer. dfs.datanode.https.address The datanode secure http server address and port dfs.datanode.http.address The datanode http server address and port Yarn 端口 yarn.resourcemanager.webapp.address http服务端口
MapReduce实战 - wordcount 1、准备数据:上传小文件供wordcount计算 1)hadoop fs -mkdir -p /input 2)mkdir wcinput 3)vim wcinput/wc.input 添加如下内容: hadoop yarn hadoop mapreduce whd whd 4)本地路径上传到hdfs hadoop fs -put wcinput/wc.input /input 5)查看hdfs文件 [root@k1 ~]# hadoop fs -ls /input Found 1 items -rw-r--r-- 3 root supergroup 37 2023-03-14 15:59 /input/wc.input [root@k1 ~]# hadoop fs -cat /input/wc.input 2023-03-15 14:31:02,101 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false hadoop yarn hadoop mapreduce whd whd
2、新建maven项目
3、添加maven依赖 修改pom.xml文件 org.apache.hadoop hadoop-common 3.1.3 org.apache.hadoop hadoop-hdfs 3.1.3 org.apache.hadoop hadoop-mapreduce-client-core 3.1.3 4、编写mapReduce代码 1)Mapper package demo;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper;
/**
-
KEYIN: 默认情况下,是mr框架所读到的一行文本的起始偏移量,Long,但是在hadoop中有自己的更精简的序列化接口,所以不直接用Long,而用LongWritable
-
VALUEIN:默认情况下,是mr框架所读到的一行文本的内容,String,同上,用Text
-
KEYOUT:是用户自定义逻辑处理完成之后输出数据中的key,在此处是单词,String,同上,用Text
-
VALUEOUT:是用户自定义逻辑处理完成之后输出数据中的value,在此处是单词次数,Integer,同上,用IntWritable */ public class WordcountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
/**
- map阶段的业务逻辑就写在自定义的map()方法中
- maptask会对每一行输入数据调用一次我们自定义的map()方法 */ @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { //将maptask传给我们的文本内容先转换成String String line = value.toString(); System.out.println(line+"===================="); //根据空格将这一行切分成单词 String[] words = line.split(" "); //将单词输出为<单词,1> for(String word:words){ //将单词作为key,将次数1作为value,以便于后续的数据分发,可以根据单词分发,以便于相同单词会到相同的reduce task context.write(new Text(word), new IntWritable(1)); } }
} 2)Reducer package demo;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer;
/**
-
KEYIN, VALUEIN 对应 mapper输出的KEYOUT,VALUEOUT类型
-
KEYOUT, VALUEOUT 是自定义reduce逻辑处理结果的输出数据类型
-
KEYOUT 是单词
-
VALUEOUT 是总次数 */ public class WordcountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
/**
- <hadoop,1><hadoop,1>
- <mapreduce,1>
- <whd,1><whd,1>
- 入参key,是一组相同单词kv对的key */ @Override protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { int count=0; System.out.println(key.toString()+"-------------------"); for(IntWritable value:values){ count += value.get(); } System.out.println(count+"+++++++++++++++"); context.write(key, new IntWritable(count)); }
} 3)Driver package demo;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.CombineTextInputFormat; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.util.UUID;
/**
- 相当于一个yarn集群的客户端
- 需要在此封装我们的mr程序的相关运行参数,指定jar包
- 最后提交给yarn
*/ public class WordcountDriver {
public static void main(String[] args) throws Exception {
if (args == null || args.length == 0) {
args = new String[2];
args[0] = "hdfs://k1:8020/input/wc.input";
args[1] = "hdfs://k1:8020/wordcount/output";
}
Configuration conf = new Configuration();
Job job = Job.getInstance(conf);
job.setJobName("wordCount"+ UUID.randomUUID().toString());
//指定本程序的jar包所在的本地路径
job.setJarByClass(WordcountDriver.class);
//指定需要使用combiner,以及用哪个类作为combiner的逻辑,,其实WordCountCombiner 就是WordCountReducer
job.setCombinerClass(WordcountReducer.class);
//如果小文件过多,可以设置,让小文件放入一个task里
job.setInputFormatClass(CombineTextInputFormat.class);
CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);//切片最大4M,根据业务可以进行设置
CombineTextInputFormat.setMinInputSplitSize(job, 2097152);//切片最小2M
//指定本业务job要使用的mapper/Reducer业务类
job.setMapperClass(WordcountMapper.class);
job.setReducerClass(WordcountReducer.class);
//指定mapper输出数据的kv类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//指定最终输出的数据的kv类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//指定job的输入原始文件所在目录
FileInputFormat.setInputPaths(job, new Path(args[0]));
//指定job的输出结果所在目录
FileOutputFormat.setOutputPath(job, new Path(args[1]));
//将job中配置的相关参数,以及job所用的java类所在的jar包,提交给yarn去运行
boolean res = job.waitForCompletion(true);
System.exit(res?0:1);
}
}
5、配置maven插件打包 maven-assembly-plugin package single jar-with-dependencies true demo.WordcountDriver org.apache.maven.plugins maven-compiler-plugin 6 6 6、运行测试 运行Hadoop程序 yarn jar mr-1.0.jar demo.WordcountDriver 查看hdfs结果 [root@k1 jar]# hadoop fs -ls /wordcount/output Found 2 items -rw-r--r-- 3 root supergroup 0 2023-03-15 16:02 /wordcount/output/_SUCCESS -rw-r--r-- 3 root supergroup 34 2023-03-15 16:02 /wordcount/output/part-r-00000 [root@k1 jar]# hadoop fs -cat /wordcount/output/part-r-00000 2023-03-15 16:31:12,748 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false hadoop 2 mapreduce 1 whd 2 yarn 1
hdfs下载文件 hadoop fs -get /hadoop-3.1.3.tar.gz ./
冷知识 hadoop fs、hadoop dfs与hdfs dfs命令的区别 hadoop fs:通用的文件系统命令,针对任何系统,比如本地文件、HDFS文件、HFTP文件、S3文件系统等。 hadoop dfs:特定针对HDFS的文件系统的相关操作,但是已经不推荐使用。 hdfs dfs:与hadoop dfs类似,同样是针对HDFS文件系统的操作,替代hadoop dfs。