- IP地址:在学校校园网Wifi下连接下 VMWare自己DHCP分配的是
192.168.190.xxx
- 内存:4G(根据自己机器确定 我需要三台机器 我的内存是16G)
- 硬盘:50G
- OS:CentOS7 x64
1.1.2 环境工具安装
ping www.baidu.com
先查看能否正常上网yum install -y epel-release
安装额外的软件包yum install -y net-tools
:如果是最小化安装(只有命令行)需要安装,包含ifconfig
命令yum install -y vim
:vim编辑器
1.1.3 关闭防火墙
systemctl stop firewalld
关闭防火墙systemctl disable firewalld.service
关闭防火墙开机自启动
1.1.4 创建hadoop用户 设置密码
- useradd hadoop
- passwd hadoop
1.1.5 配置hadoop用户具有root权限
修改
etc/sudoers
文件在%whell ALL=(ALL) ALL
语句下增加:hadoop ALL=(ALL) NOPASSWD:ALL
。实现免密功能。
1.1.6 在/opt下创建module和software两个软件 修改主和所属组
mkdir /opt/module
mkdir /opt/software
chown hadoop:hadoop /opt/module
chown hadoop:hadoop /opt/software
1.1.7 卸载虚拟机自带的JDK
rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps
1.1.8 重启虚拟机
reboot
1.2 克隆三台虚拟机
通过VMWare克隆模板机器,此处可以不使用静态IP, 但是要记得对应虚拟机的IP地址。
1.2.1 修改主机名
这里因为我的IP是192.168.190.135所以我改为hadoop135
vim /etc/hostname
-> hadoop135
1.2.2 增加主机映射
因为后续集群部署是三个机器所以要添加域名映射
vim /etc/hosts
192.168.190.135 hadoop135192.168.190.136 hadoop136192.168.190.137 hadoop137
重启即可。
reboot
1.3 在hadoop136上安装JDK
1.3.1 上传JDK Hadoop资源文件
通过远程链接软件Xshell或者FinalShell连接到虚拟机,上传JDK文件到/opt/software。
1.3.2 解压到/opt/module目录下
tar -zxvf jdkxxxx.gz -C /opt/module
1.3.3 配置JDK环境变量
在
/etc/profile.d/
新建jdk_path.sh
文件
写入:
sh#JAVA_HOMEexport JAVA_HOME=/opt/module/jdk1.8.0_212export PATH=$PATH:$JAVA_HOME/bin
让资源文件生效:source /etc/profile
1.3.4 测试是否安装成功
java -version
1.4 在hadoop136上安装hadoop
1.4.1 上传Hadoop
1.4.2 解压Hadoop
1.4.3 配置Hadoop环境变量
1.4.3 测试Hadoop是否安装成功
2.本地模式
2.1 Hadoop目录结构
- bin目录:存放对 Hadoop 相关服务(hdfs,yarn,mapred)进行操作的脚本
- etc目录:Hadoop 的配置文件目录,存放 Hadoop 的配置文件
- lib目录:存放 Hadoop 的本地库(对数据进行压缩解压缩功能)
- sbin目录:存放启动或停止 Hadoop 相关服务的脚本
- share目录:存放 Hadoop 的依赖 jar 包、文档、和官方案例
2.2 本地运行模式(官方WordCount)
2.2.1 在hadoop-3.1.3 文件下创建wcinput文件夹
mkdir wcinput
2.2.2 在同文件夹下创建wcoutput
mkdir wcoutput
2.2.3 在wcinput文件夹下创建word.txt
vim word.txt
hadoop yarnhadoop mapreducedengschoodeng schoo
2.2.4 执行程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount wcinput wcoutput
deng 1dengschoo 1hadoop 2mapreduce 1schoo 1yarn 1
3.集群模式(完全分布式运行模式)
3.1 集群规划
3.2 配置文件说明
3.3 配置集群
cd $HADOOP_HOME/etc/hadoop
3.3.1 核心配置文件
vim core-site.xml
<configuration> <!-- 指定 NameNode 的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop136:8020</value> </property> <!-- 指定 hadoop 数据的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-3.1.3/data</value> </property> <!-- 配置 HDFS 网页登录使用的静态用户为 atguigu --> <property> <name>hadoop.http.staticuser.user</name> <value>dengschoo</value> </property></configuration>
3.3.2 HDFS配置文件
vim hdfs-site.xml
<configuration><!-- nn web 端访问地址--><property> <name>dfs.namenode.http-address</name> <value>hadoop136:9870</value> </property><!-- 2nn web 端访问地址--> <property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop137:9868</value> </property></configuration>
3.3.3 YARN配置文件
vim yarn-site.xml
<configuration> <!-- 指定 MR 走 shuffle --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定 ResourceManager 的地址--> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop135</value> </property> <!-- 环境变量的继承 --> <property> <name>yarn.nodemanager.env-whitelist</name> <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value> </property></configuration>
3.3.4 MapReduce配置文件
vim maored-site.xml
<configuration><!-- 指定 MapReduce 程序运行在 Yarn 上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property></configuration>
3.3.5 分发配置文件
将配置好的文件下发到hadoop135,hadoop136, hadoop137
最好的效果是三个worker的配置文件是一样的。
4.4 启动集群
4.1 配置worker
vim etc/hadoop/workers
删除localhost,文中不可以有空格 空行
hadoop135hadoop136hadoop137
4.2 启动集群
4.2.1 格式化节点
需要再hadoop136下格式化NameNode
hdfs namenode -format
4.2.2 启动hdfs
启动HDFS
sbin/start-dfs.sh
4.2.3 在部署yarn节点上(hadoop135)启动yarn
sbin/start-yarn.sh
4.2.4 web查看hdfs
http://hadoop136:9870
查看存储的数据信息
4.2.5 web查看YARN的ResourceManager
http:hadoop135:8088
查看yarn上运行的job信息
4.实验1 HDFS Shell命令
4.1 命令
hadoop fs [命令选项]
4.2 常用命令实例
在HDFS文件系统上建立一个目录,将本地文件系统上传到该目录。
hadoop fs -mkdir test
: 在HDFS创建test目录hadoop fs -ls /
:显示HDFS目录结构echo "Hello Hadoop DengSchoo" > file.txt
: 创建一个文件hadoop fs -put file.txt /test/
: 上传该文件到/test/hadoop fs -ls /test/
:显示HDFS路径hadoop fs -cat /test/file.ext
:查看HDFS内容
5.实验2 HDFS Java接口调用
5.0 Hadoop Win依赖Path配置
添加依赖:hadoop bin 到系统环境变量。
5.1 创建Maven工程导入依赖
xml<dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.1.3</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.30</version> </dependency></dependencies>
5.2 API操作
5.2.1 创建文件夹
javapackage com.dengschoo.hdfs;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;import org.junit.Test;import java.io.IOException;import java.net.URI;import java.net.URISyntaxException;/** * @author :Deng Schoo * @version :V1.0 * @className :HdfsClient * @description :TODO * @date :2021/11/28 19:57 */public class HdfsClient { @Test public void testMkdirs() throws URISyntaxException, IOException, InterruptedException { // 1. 获取文件系统 Configuration configuration = new Configuration(); FileSystem fs = FileSystem.get(new URI("hdfs://192.168.190.136:8020"), configuration, "hadoop"); // 2. 创建目录 fs.mkdirs(new Path("/javaAPI/test/")); // 3. 关闭资源 fs.close(); }}
输出 成功通过测试
5.2.2 上传文件
javapackage com.dengschoo.hdfs;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;import org.junit.Test;import java.io.IOException;import java.net.URI;import java.net.URISyntaxException;/** * @author :Deng Schoo * @version :V1.0 * @className :HdfsClient * @description :TODO * @date :2021/11/28 19:57 */public class HdfsClient { @Test public void testMkdirs() throws URISyntaxException, IOException, InterruptedException { // 1. 获取文件系统 Configuration configuration = new Configuration(); FileSystem fs = FileSystem.get(new URI("hdfs://192.168.190.136:8020"), configuration, "hadoop"); // 2. 创建目录 fs.mkdirs(new Path("/javaAPI/test/")); // 3. 关闭资源 fs.close(); } @Test public void testCopyFromLocalFile() throws URISyntaxException, IOException, InterruptedException { // 1. 获取文件系统 Configuration configuration = new Configuration(); FileSystem fs = FileSystem.get(new URI("hdfs://192.168.190.136:8020"), configuration, "hadoop"); // 2. 上传文件 fs.copyFromLocalFile(new Path("D:\\Study\\GradeFour\\Course\\CloudComputingProjects\\src\\main\\java\\com\\dengschoo\\hdfs\\file.txt"), new Path("/javaAPI/test/")); //3.关闭资源 fs.close(); }}
输出:
5.2.3 文件下载
java@Test public void testCopyToLocalFile() throws URISyntaxException, IOException, InterruptedException { // 1. 获取文件系统 Configuration configuration = new Configuration(); FileSystem fs = FileSystem.get(new URI("hdfs://192.168.190.136:8020"), configuration, "hadoop"); // 指向文件下载操作 // boolean 是否删除源文件 // src // des // 是否开启文件校验 fs.copyToLocalFile(false,new Path("/javaAPI/test/file.txt"), new Path("D:\\Environment\\TestEnv"), true); //3.关闭资源 fs.close(); }
5.2.4 文件更名和移动
java@Test public void testRename() throws IOException, InterruptedException, URISyntaxException{ // 1 获取文件系统 Configuration configuration = new Configuration(); FileSystem fs = FileSystem.get(new URI("hdfs://192.168.190.136:8020"), configuration, "hadoop"); // 2 修改文件名称 fs.rename(new Path("/javaAPI/test/file.txt"), new Path("/javaAPI/test/file——new.txt")); // 3 关闭资源 fs.close(); }
5.2.5 HDFS删除文件和目录
java@Test public void testDelete() throws IOException, InterruptedException, URISyntaxException{ // 1 获取文件系统 Configuration configuration = new Configuration(); FileSystem fs = FileSystem.get(new URI("hdfs://192.168.190.136:8020"), configuration, "hadoop"); // 2 执行删除 fs.delete(new Path("/javaAPI/test"), true); // 3 关闭资源 fs.close(); }
5.2.6 文件详情查看
java@Test public void testListFiles() throws IOException, InterruptedException, URISyntaxException { // 1 获取文件系统 Configuration configuration = new Configuration(); FileSystem fs = FileSystem.get(new URI("hdfs://192.168.190.136:8020"), configuration, "hadoop"); // 2 获取文件详情 RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true); while (listFiles.hasNext()) { LocatedFileStatus fileStatus = listFiles.next(); System.out.println("========" + fileStatus.getPath() + "========="); System.out.println(fileStatus.getPermission()); System.out.println(fileStatus.getOwner()); System.out.println(fileStatus.getGroup()); System.out.println(fileStatus.getLen()); System.out.println(fileStatus.getModificationTime()); System.out.println(fileStatus.getReplication()); System.out.println(fileStatus.getBlockSize()); System.out.println(fileStatus.getPath().getName()); // 获取块信息 BlockLocation[] blockLocations = fileStatus.getBlockLocations(); System.out.println(Arrays.toString(blockLocations)); } // 3 关闭资源 fs.close(); }
5.2.7 HDFS文件和文件夹判断
java@Test public void testListStatus() throws IOException, InterruptedException, URISyntaxException{ // 1 获取文件配置信息 Configuration configuration = new Configuration(); FileSystem fs = FileSystem.get(new URI("hdfs://192.168.190.136:8020"), configuration, "hadoop"); // 2 判断是文件还是文件夹 FileStatus[] listStatus = fs.listStatus(new Path("/")); for (FileStatus fileStatus : listStatus) { // 如果是文件 if (fileStatus.isFile()) { System.out.println("f:"+fileStatus.getPath().getName()); }else { System.out.println("d:"+fileStatus.getPath().getName()); } } // 3 关闭资源 fs.close(); }
6.实验3 MapReduce应用程序
6.1 编写Mapper类
javapublic static class MyMapper extends Mapper<Object, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1);//one表示单词在该行 中的出现次数 private final Text word = new Text(); //word存放一行中的单词 /*定义map方法,分割文本行中的单词,将单词及其在该行中的出现次数1写入conte xt;形参value表示一行文本*/ public void map(Object key, Text value, Context context ) throws IOException, InterruptedException { StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one);//把word、one写入到context中 } } }
6.2 编写Reducer类
javapublic static class MyReducer extends Reducer<Text, IntWritable,Text,IntWritable> { private final IntWritable result = new IntWritable();//result表示单词出现的总次数 public void reduce(Text key, Iterable<IntWritable> values, Context context ) throws IOException, InterruptedException { int sum = 0;//sum存放该单词出现的总次数 for (IntWritable val : values) { sum += val.get(); } result.set(sum); //result表示单词的总次数,是最后输出的“值” context.write(key, result); } }
6.3 编写主类
javapublic static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException { Configuration conf = new Configuration(); System.setProperty("HADOOP_USER_NAME","hadoop"); Job job = Job.getInstance(conf, "wordcount"); //创建一个job对象 job.setUser("hadoop"); job.setJarByClass(MapReduceTest.class); //创建一个job对象 job.setMapperClass(MyMapper.class); //设置自定义的Mapper类 job.setCombinerClass(MyReducer.class); job.setReducerClass(MyReducer.class);//设置自定义的Reducer类 job.setOutputKeyClass(Text.class);//设置map()方法输出的key类型 job.setOutputValueClass(IntWritable.class);//设置输出的value的类型 job.setUser("hadoop"); FileInputFormat.addInputPath(job, new Path("hdfs://192.168.190.136:8020/javaAPI/test/input"));//job作业执行时输入文件的路径 FileOutputFormat.setOutputPath(job, new Path("hdfs://192.168.190.136:8020/javaAPI/test/out")); System.exit(job.waitForCompletion(true) ? 0 : 1);//设置job作业执行的输出路 }