在Windows上部署hadoop以伪分布式模式工作
hadoop、MapReduce、IDEA、JDK
软件:Hadoop+IEDA2022+Jdk13
建议按照JDK-IDEA-Hadoop的顺序进行安装
1.JDK13下载、安装及环境配置
1.1 下载
- 直接使用华为的镜像下载:https://repo.huaweicloud.com/java/jdk/。
1.2安装
除了修改安装目录之外,其他的一路【下一步】。如果C盘空间够的话建议直接装在C:\Program Files\Java中
1.3配置环境变量
-
打开”系统属性-高级-环境变量“
-
在“系统环境变量”中新建环境变量“JAVA_HOME”变量值为JDK的安装目录
-
在用户变量中找到“path"点击编辑,添加"%JAVA_HOME%\bin"和"%JAVA_HOME%\jre\bin"
-
在系统变量名中添加新变量““CLASSPATH”,值".;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar"
1.4测试JDK是否安装完成
- win+R输出cmd打开cmd.exe。
- 输入
java -version
,若得到以下结果则证明JDK安装成功
2.IEDA下载安装
可以参考idea 2021 安装方法的下载安装方法。
3.Hadoop2.7.6下载、安装及文件配置
1.下载
百度网盘:https://pan.baidu.com/s/1t1bVzWzgCoIdAnhujGN3VA?pwd=b5l4 提取码:b5l4
2.安装
-
将下载好的文件解压,将Hadoop-2.7.6文件夹复制到D盘中,如下所示
-
在winutils-master选择Hadoop2.7.6 ,将bin目录下的hadoop.dll文件复制到C:\Windows\System32目录下
-
在winutils-master选择Hadoop2.7.6 ,将bin目录复制到D:\work_software\hadoop-2.7.6(也就是刚刚的Hadoop安装目录)替代原文件的bin
3. 配置环境变量
-
在系统变量中添加"HADOOP_HOME",变量值为安装路径。如下图所示
-
在用户变量-path中添加变量%HADOOP_HOME%\bin
-
在cmd中输入
hadoop -version
命令,出现下图信息则证明安装成功
4.集群配置
打开hadoop2.7.6的安装文件夹,打开etc/hadoop
接下来就是修改其中文件的代码,不然hadoop无法运行
4.1修改hadoop-env.cmd
将JAVA_HOME
的值修改为以下形式
JAVA_HOME=C:\PROGRA~1\Java\jdk-13
4.2 修改hdfs-site.xml
注意下列文件夹中的namespace_logs
和data
文件夹是需要自己先创建的
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>file:///D:/work_software/hadoop-2.7.6/namespace_logs</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>file:///D:/work_software/hadoop-2.7.6/data</value>
</property>
</configuration>
4.3修改 mapred-site.xml
若是没有mapred-site.xml
文件的话,将mapred-site.xml.template
改名为mapred-site.xml
注意:将代码中的username
改为自己的Windows用户名,查看用户名的方法如下
<configuration>
<property>
<name>mapreduce.job.user.name</name>
<value>username</value>
</property>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>yarn.apps.stagingDir</name>
<value>/user/username/staging</value>
</property>
<property>
<name>mapreduce.jobtracker.address</name>
<value>local</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>hdfs://localhost:9001</value>
</property>
</configuration>
4.4修改 yarn-site.xml
在configuration
添加下列代码
<configuration>
<property>
<name>yarn.server.resourcemanager.address</name>
<value>0.0.0.0:8020</value>
</property>
<property>
<name>yarn.server.resourcemanager.application.expiry.interval</name>
<value>60000</value>
</property>
<property>
<name>yarn.server.nodemanager.address</name>
<value>0.0.0.0:45454</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.server.nodemanager.remote-app-log-dir</name>
<value>/app-logs</value>
</property>
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>/dep/logs/userlogs</value>
</property>
<property>
<name>yarn.server.mapreduce-appmanager.attempt-listener.bindAddress</name>
<value>0.0.0.0</value>
</property>
<property>
<name>yarn.server.mapreduce-appmanager.client-service.bindAddress</name>
<value>0.0.0.0</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>-1</value>
</property>
<property>
<name>
yarn.application.classpath
</name>
<value>%HADOOP_CONF_DIR%,%HADOOP_COMMON_HOME%/share/hadoop/common/*,%HADOOP_COMMON_HOME%/share/hadoop/common/lib/*,%HADOOP_HDFS_HOME%/share/hadoop/hdfs/*,%HADOOP_HDFS_HOME%/share/hadoop/hdfs/lib/*,%HADOOP_MAPRED_HOME%/share/hadoop/mapreduce/*,%HADOOP_MAPRED_HOME%/share/hadoop/mapreduce/lib/*,%HADOOP_YARN_HOME%/share/hadoop/yarn/*,%HADOOP_YARN_HOME%/share/hadoop/yarn/lib/*</value>
</property>
</configuration>
4.5初始化变量环境及格式化文件系统
- 打开Windows的cmd
- 输入
%HADOOP_HOME%\etc\hadoop\hadoop-env.cmd
,完成初始化环境变量 - 输入
hadoop namenode -format
,完成格式化系统文件。这时候会有一大堆指令,只要看到下列代码就说明格式化成功。否则就应该去检查配置文件的时候是否出现错误。
INFO common.Storage: Storage directory D:\work_software\hadoop-2.7.6\namespace_logs has been successfully formatted.
4.6开启hadoop集群
在经历上述配置之后,我们就算配置完成了,接下来就可以打开hadoop集群。
在cmd中输入下列命令
%HADOOP_HOME%/sbin/start-all.cmd
这时候会跳出很多的窗口
继续再cmd中输入下列命令
jps
就可以查看目前有哪些节点打开了。
接着我们打开本地浏览器,输入localhost:50070
,如果能打开下列网页,说明hadoop就成功开启了
5.MapReduce测试之-Wordcount
接下来我们可以在IDEA上编写一些程序测试我们的hadoop集群,
5.1创建maven工程
5.2 修改pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>dblab</groupId>
<artifactId>WordCount</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<hadoop.version>2.7.6</hadoop.version>
</properties>
<dependencies>
<!-- Hadoop -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>${hadoop.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>${hadoop.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-jobclient</artifactId>
<version>${hadoop.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Java 1.8 -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
5.3导入maven仓库
文件->设置->构建、执行、部署->构建工具->Maven->仓库->选择类型为local的本地仓库,点击更新,再点击确定。
左边的外部库以及右边Maven中的依赖项中导入了许多的包,这就成功导入了maven仓库。
5.4编写log4j.proporties配置文件
在src/main/resources目录下创建log4j.proporties文件,注意这个资源包就是proporties文件
编写如下代码
log4j.rootLogger=debug, stdout, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=5
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
5.5编写java文件
在src/main/java/org.example中创建.java文件,命名为word_count。写入如下代码。
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
/**
* 单词统计
* map阶段 分组 java:1 java:1 hadoop:1 hadoop:1
* reduce阶段 聚合 java:{1,1} hadoop:{1,1} java:2
*/
public class Word_count {
public static class WordMapper extends Mapper<LongWritable,Text,Text,LongWritable>{
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
String[] words = line.split(",");
for (String word : words) {
context.write(new Text(word),new LongWritable(1));
}
}
}
//中间通过suffer阶段合并排序
// key:{1,1,1,1,1,1....}
public static class WordReduce extends Reducer<Text,LongWritable,Text,LongWritable>{
@Override
protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {
//统计每个单词的累加结果
int count = 0;
for (LongWritable value : values) {
count+=value.get();
}
context.write(key,new LongWritable(count));
}
}
// maia方法中构建mapreduce任务 通过Job类构建
public static void main(String[] args) throws Exception {
Job job = Job.getInstance();
job.setJobName("统计每行多少单词");
job.setJarByClass(Word_count.class);
//mapreduce的输出格式
job.setMapperClass(WordMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class);
job.setReducerClass(WordReduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
//指定路径 注意:输出路径不能已存在,输入输出路径指定Windows文件系统文件路径
Path input = new Path("D:\\word.txt");
Path output = new Path("D:\\output");
FileInputFormat.addInputPath(job,input);
//路径不能已存在
// 手动加上 如果存在就删除 FileSystem
FileSystem fileSystem = FileSystem.get(new Configuration());
if (fileSystem.exists(output)){
fileSystem.delete(output,true);//true代表迭代删除多级目录
}
FileOutputFormat.setOutputPath(job,output);
//启动job
job.waitForCompletion(true);
System.out.println("统计一行多少个单词");
}
}
注意:
-
在运行代码前要先在下图所示路径中创建word.txt文件,output不能提前创建。
-
要先启动hadoop才能运行代码。
5.6运行结果
在D:\output\part-r-00000中查看结果
代码运行完毕可以输入以下命令关闭集群
%HADOOP_HOME%/sbin/start-all.cmd
更多推荐
所有评论(0)