
文章目录1. 登录实训云1.1 实训云网址1.2 登录实训云2. 创建网络2.1 网络概述2.2 创建步骤3. 创建路由器3.1 路由器名称3.1 创建路由器4. 连接子网5. 创建虚拟网卡5.1 创建原因5.2 查看端口5.3 创建虚拟网卡6. 管理安全组规则6.1 为什么要管理安全组规则6.2 在默认安全组里创建规则7. 创建云主机7.1 创建云主机bigdata17.2 创建云主机bigdata27.3 创建云主机bigdata38. 绑定浮动IP地址8.1 为何要绑定8.2 申请浮动IP地址8.3 绑定浮动IP地址9. 远程连接云主机9.1 启动FinalShell9.2 远程连接云主机bigdata19.3 远程连接云主机bigdata29.4 远程连接云主机bigdata310. 修改本地的IP与主机名映射文件11. 本机Ping云主机11.1 按IP地址来Ping11.2 按主机名来Ping12. 修改配置文件12.1 修改hdfs-site.xml文件12.2 修改log4j.properties文件13. 启动大数据集群服务14. 完成词频统计任务14.1 准备数据文件14.2 利用MR实现词频统计14.2.1 创建Maven项目14.2.2 添加hadoop依赖14.2.3 创建日志属性文件14.2.4 创建词频统计映射器类14.2.5 创建词频统计归并器类14.2.6 创建词频统计驱动器类14.2.7 运行程序查看结果14.3 利用Hive实现词频统计14.3.1 基于HDFS文件创建外部表14.3.2 展开每行单词14.3.3 基于查询结果创建视图14.3.4 基于视图分组统计14.4 利用Spark实现词频统计14.4.1 利用Spark RDD实现词频统计14.4.2 利用Spark SQL实现词频统计15. 关闭大数据集群服务16. 实战小结本次实训在华为云实训云上从零搭建三节点 Hadoop 集群再用 MapReduce、Hive、Spark 三套技术栈实现同一个词频统计任务完整走通「基础设施 → 网络安全 → 主机接入 → 集群配置 → 应用开发」全流程。1. 登录实训云1.1 实训云网址网址http://192.168.192.401.2 登录实训云输入用户名和密码登录成功后显示首页2. 创建网络2.1 网络概述网络名为huawei子网为huawei_subnet网络地址为192.168.1.0/24分配地址池192.168.1.2,192.168.1.254DNS设置为114.114.114.114。此网络结构清晰地址配置明确具备基础的网络配置要素可满足一般网络应用场景下的设备接入与通信需求。2.2 创建步骤显示【网络】页面单击【创建网络】按钮在弹出的对话框里设置网络基本信息单击【确定】按钮成功创建网络huawei3. 创建路由器3.1 路由器名称路由器名称huawei_router3.1 创建路由器显示【路由器】页面单击【创建路由器】按钮在弹出的对话框里设置路由器基本信息单击【确定】按钮成功创建路由器4. 连接子网显示【路由器】页面单击【更多】右边的箭头弹出下拉菜单单击【连接子网】菜单选项连接网络huawei与子网huawei_subnet单击【确定】按钮提示连接子网成功5. 创建虚拟网卡5.1 创建原因创建虚拟网卡是为了给云主机分配固定IP地址。云主机在网络中运行若需稳定的网络标识和连接固定IP不可或缺。虚拟网卡充当云主机与网络间的桥梁通过创建它并绑定固定IP可确保云主机在网络中的唯一性和稳定性便于管理与访问。5.2 查看端口显示【端口】页面5.3 创建虚拟网卡单击【创建虚拟网卡】按钮弹出对话框设置虚拟网卡基本信息单击【确定】按钮成功创建虚拟网卡port101同理创建虚拟网卡port102和port1036. 管理安全组规则6.1 为什么要管理安全组规则管理安全组规则至关重要因为后续使用FinalShell工具软件通过SSH连接云主机时需设置规则放开ICMP协议和TCP协议入口的全部端口。这样能确保连接的顺利进行同时保障网络安全在满足连接需求的前提下有效控制网络访问权限防止潜在的安全威胁。6.2 在默认安全组里创建规则显示【安全组】页面单击【创建规则】按钮弹出对话框设置所有TCP协议单击【确定】按钮提示“创建规则成功”单击【创建规则】按钮弹出对话框设置所有ICMP协议单击【确定】按钮提示“创建规则成功”7. 创建云主机7.1 创建云主机bigdata1显示【云主机】页面单击【创建云主机】按钮在弹出的对话框里设置云主机基本信息单击【下一步网络配置】按钮在弹出的对话框里选择port101端口勾选default安全组单击【下一步系统配置】按钮在弹出的对话框里设置名称与登录密码单击【下一步确认配置】按钮单击【确定】按钮成功创建云主机bigdata1有固定IP地址192.168.1.101内网IP有两个我们要解绑192.168.1.46云主机bigdata1内网IP192.168.1.1017.2 创建云主机bigdata2同理创建云主机bigdata2有固定IP地址192.168.1.1027.3 创建云主机bigdata3同理创建云主机bigdata3有固定IP地址192.168.1.1038. 绑定浮动IP地址8.1 为何要绑定绑定浮动IP地址是实现FinalShell远程连接云主机的关键步骤。浮动IP地址具有灵活性可与云主机动态绑定即便云主机发生故障迁移等情况IP地址仍可保持不变从而确保FinalShell能够稳定地远程连接到云主机保障远程操作的连续性和可靠性。8.2 申请浮动IP地址显示【浮动IP】页面单击【申请IP】按钮在弹出的对话框里设置网络信息与批量申请数量单击【确定】按钮成功申请了三个浮动IP地址8.3 绑定浮动IP地址显示【云主机】页面给云主机bigdata1绑定浮动IP地址【更多】下拉菜单的子菜单【关联资源】【关联资源】的子菜单【绑定浮动IP】单击【绑定浮动IP】菜单项将云主机IP与浮动IP地址进行绑定单击【确定】按钮成功给云主机bigdata1绑定浮动IP地址同理给云主机bigdata2和bigdata3绑定相应的浮动IP地址9. 远程连接云主机9.1 启动FinalShell启动FinalShell目前尚未创建任何远程连接9.2 远程连接云主机bigdata1弹出【连接管理器】新建SSH连接单击【SSH连接(Linux)】在弹出的对话框里设置常规和认证信息注意密码是123456单击【确定】按钮成功创建连接bigdata1单击bigdata1连接弹出【安全警告】对话框单击【接受并保存】按钮9.3 远程连接云主机bigdata2同理远程连接云主机bigdata29.4 远程连接云主机bigdata3同理远程连接云主机bigdata310. 修改本地的IP与主机名映射文件在文件C:\Windows\System32\drivers\etc\hosts里添加三条映射192.168.224.36bigdata1192.168.227.230bigdata2192.168.228.14bigdata311. 本机Ping云主机11.1 按IP地址来Ping执行命令ping 192.168.224.3611.2 按主机名来Ping执行命令ping bigdata112. 修改配置文件12.1 修改hdfs-site.xml文件执行命令cd $HADOOP_HOME/etc/hadoop执行命令vim hdfs-site.xml添加红框内属性禁用所有权限检查执行命令scp hdfs-site.xml rootbigdata2:$HADOOP_HOME/etc/hadoop执行命令scp hdfs-site.xml rootbigdata3:$HADOOP_HOME/etc/hadoop12.2 修改log4j.properties文件执行命令vim log4j.properties添加一句log4j.logger.org.apache.hadoopERROR执行命令scp log4j.properties rootbigdata2:$HADOOP_HOME/etc/hadoop执行命令scp log4j.properties rootbigdata3:$HADOOP_HOME/etc/hadoop13. 启动大数据集群服务在云主机bigdata1上执行命令allstart.sh执行命令jps查看Hadoop的Web UI页面 -http://bigdata1:9870查看HDFS文件系统14. 完成词频统计任务14.1 准备数据文件执行命令vim words.txthello world hello hadoop hello hive hello spark hello a big data world hello I love big data hello I learn big data执行命令hdfs dfs -mkdir -p /wordcount/input执行命令hdfs dfs -put words.txt /wordcount/input14.2 利用MR实现词频统计14.2.1 创建Maven项目设置项目基本信息单击【Create】按钮生成项目基本骨架14.2.2 添加hadoop依赖在pom.xml里添加hadoop和junit依赖刷新项目依赖14.2.3 创建日志属性文件在resources里创建log4j.properties文件log4j.rootLoggerERROR, stdout, logfilelog4j.appender.stdoutorg.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layoutorg.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern%d %p[%c]- %m%nlog4j.appender.logfileorg.apache.log4j.FileAppenderlog4j.appender.logfile.Filetarget/wordcount.loglog4j.appender.logfile.layoutorg.apache.log4j.PatternLayoutlog4j.appender.logfile.layout.ConversionPattern%d %p[%c]- %m%n14.2.4 创建词频统计映射器类创建net.huawei.mr包在net.huawei.mr包里创建WordCountMapper类packagenet.huawei.mr;importorg.apache.hadoop.io.IntWritable;importorg.apache.hadoop.io.LongWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Mapper;importjava.io.IOException;/** * 功能词频统计映射器 * 作者华卫 * 日期2025年12月03日 */publicclassWordCountMapperextendsMapperLongWritable,Text,Text,IntWritable{Overrideprotectedvoidmap(LongWritablekey,Textvalue,Contextcontext)throwsIOException,InterruptedException{// 获取行文本Stringlinevalue.toString();// 按空格拆分成单词数组String[]wordsline.split( );// 遍历单词数组生成输出键值对for(Stringword:words){context.write(newText(word),newIntWritable(1));}}}代码说明该代码定义了一个 Hadoop MapReduce 的 Mapper 类用于词频统计。它将输入的每行文本按空格拆分为单词对每个单词输出键值对单词, 1供后续 Reduce 阶段累加计数。继承自MapperLongWritable, Text, Text, IntWritable符合 WordCount 任务规范。14.2.5 创建词频统计归并器类在net.huawei.mr包里创建WordCountReducer类packagenet.huawei.mr;importorg.apache.hadoop.io.IntWritable;importorg.apache.hadoop.io.NullWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Reducer;importjava.io.IOException;/** * 功能词频统计归并器类 * 作者华卫 * 日期2025年12月03日 */publicclassWordCountReducerextendsReducerText,IntWritable,Text,NullWritable{Overrideprotectedvoidreduce(Textkey,IterableIntWritablevalues,Contextcontext)throwsIOException,InterruptedException{// 定义键单词出现次数intcount0;// 遍历值迭代器累加次数for(IntWritablevalue:values){countcountvalue.get();}// 生成新的输出键StringnewKey(key.toString(),count);// 输出新的键值对(newKey, null)context.write(newText(newKey),NullWritable.get());}}代码说明该代码实现 Hadoop MapReduce 的 Reducer 类用于词频统计。它接收相同单词的所有计数值为1的 IntWritable累加得到总频次并将结果格式化为 “(单词,次数)” 字符串作为新键输出值设为 NullWritable适用于仅需输出统计结果的场景。14.2.6 创建词频统计驱动器类在net.huawei.mr包里创建WordCountDriver类packagenet.huawei.mr;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.FSDataInputStream;importorg.apache.hadoop.fs.FileStatus;importorg.apache.hadoop.fs.FileSystem;importorg.apache.hadoop.fs.Path;importorg.apache.hadoop.io.IOUtils;importorg.apache.hadoop.io.IntWritable;importorg.apache.hadoop.io.NullWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Job;importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;importjava.net.URI;/** * 功能词频统计驱动器 * 作者华卫 * 日期2025年12月03日 */publicclassWordCountDriver{publicstaticvoidmain(String[]args)throwsException{// 创建配置对象ConfigurationconfnewConfiguration();// 设置客户端使用数据节点主机名属性conf.set(dfs.client.use.datanode.hostname,true);// 获取工作实例JobjobJob.getInstance(conf);// 设置作业启动类job.setJarByClass(WordCountDriver.class);// 设置Mapper类job.setMapperClass(WordCountMapper.class);// 设置map任务输出键类型job.setMapOutputKeyClass(Text.class);// 设置map任务输出值类型job.setMapOutputValueClass(IntWritable.class);// 设置Reducer类job.setReducerClass(WordCountReducer.class);// 设置reduce任务输出键类型job.setOutputKeyClass(Text.class);// 设置reduce任务输出值类型job.setOutputValueClass(NullWritable.class);// 定义uri字符串分布式文件系统前缀Stringurihdfs://bigdata1:9000;// 创建输入路径可以指向目录也可以指向文件PathinputPathnewPath(uri/wordcount/input);// 创建输出路径PathoutputPathnewPath(uri/wordcount/output);// 获取文件系统FileSystemfsFileSystem.get(newURI(uri),conf);// 删除输出路径第2个参数设置是否递归删除fs.delete(outputPath,true);// 给作业添加输入路径允许多个FileInputFormat.addInputPath(job,inputPath);// 给作业设置输出路径只能一个FileOutputFormat.setOutputPath(job,outputPath);// 等待作业完成job.waitForCompletion(true);// 输出统计结果System.out.println(统计结果);// 获取输出路径的文件状态数组FileStatus[]fileStatusesfs.listStatus(outputPath);// 遍历文件状态数组for(inti1;ifileStatuses.length;i){// 输出结果文件路径System.out.println(fileStatuses[i].getPath());// 获取文件系统字节输入流FSDataInputStreaminfs.open(fileStatuses[i].getPath());// 将结果文件显示在控制台IOUtils.copyBytes(in,System.out,4096,false);}}}代码说明该驱动类配置并提交 Hadoop 词频统计作业设置 Mapper 和 Reducer 类及其输入输出类型指定 HDFS 输入/输出路径自动删除已有输出目录作业完成后读取并打印结果文件内容到控制台。14.2.7 运行程序查看结果运行词频统计驱动器类14.3 利用Hive实现词频统计执行命令hive进入Hive客户端14.3.1 基于HDFS文件创建外部表执行语句create external table t_word(line string) location /wordcount/input;14.3.2 展开每行单词执行语句select explode(split(line, )) as word from t_word;14.3.3 基于查询结果创建视图执行语句create view v_word as select explode(split(line, )) as word from t_word;14.3.4 基于视图分组统计不排序统计执行语句select word, count(*) from v_word group by word;按词频排序统计执行语句select word, count(*) as count from v_word group by word order by count desc;14.4 利用Spark实现词频统计执行命令spark-shell14.4.1 利用Spark RDD实现词频统计执行代码sc.textFile(hdfs://bigdata1:9000/wordcount/input/words.txt).flatMap(_.split( )).map((_,1)).reduceByKey(__).sortBy(_._2,false).collect().foreach(println)14.4.2 利用Spark SQL实现词频统计读取文本文件生成数据帧执行命令val df spark.read.text(hdfs://bigdata1:9000/wordcount/input/words.txt)执行命令df.show()基于数据帧生成临时视图执行命令df.createOrReplaceTempView(t_value)对临时视图进行词频统计执行代码valwcspark.sql( select word, count(*) as count from (select explode(split(value, )) as word from t_value) group by word order by count desc )执行命令wc.show()15. 关闭大数据集群服务在云主机bigdata1上执行命令allstop.sh16. 实战小结通过本次实战我们完整地搭建并运行了一个基于Hadoop、Hive和Spark的大数据集群环境。从网络和云主机的创建、配置到集群服务的启动与管理再到利用MapReduce、Hive和Spark实现词频统计任务全面掌握了大数据平台的搭建与应用开发流程。在实战中我们成功实现了数据的分布式存储与处理验证了不同技术框架在数据处理中的优势和适用场景。通过FinalShell远程连接和配置文件修改进一步增强了对集群管理的理解。整个过程不仅提升了技术操作能力还加深了对大数据生态系统各组件协同工作的认识为后续更复杂的大数据项目积累了宝贵经验。