一、实行目标
学习Hadoop 开源云盘算平台的安装、配置和应⽤。训练MapReduce 并⾏盘算程序编程。
二、实行内容
2.1 部署方式
Hadoop紧张有两种安装方式,即传统解压包方式和Linux标准方式。安装Hadoop的同时,还要明确工作情况的构建模式。Hadoop部署情况分为单机模式、伪分布模式和分布式模式三种。下面紧张举行单机模式和分布式安装
2.2 部署步调(简述)
步调1:订定部署规划;
步调2:部署前工作;
步调3:部署Hadoop;
步调4:测试Hadoop。
2.3 准备情况
由于分布式盘算需要用到许多机器,部署时用户须提供多台机器。本节利用Linux较成熟的发行版CentOS部署Hadoop,须注意的是新装系(CentOS)的机器不可以直接部署Hadoop,须做些设置后才可部署,这些设置紧张为:改机器名,添加域名映射,关闭防火墙,安装JDK。
2.4 关于Hadoop依靠软件
Hadoop部署前提仅是完成修改机器名、添加域名映射、关闭防火墙和安装JDK这四个操作,其他都不需要。
2.5 传统解压包部署
相对于标准Linux方式,解压包方式部署Hadoop有利于用户更深入理解Hadoop体系架构,发起先采用解压包方式部署Hadoop,熟悉后可采用标准Linux方式部署Hadoop。以下将实现在三台机器上部署Hadoop。
三、实行步调及结果分析
1.1 Linux服务器的安装
- 通过安装VMware安装Linux机器,点击创建新捏造机,选择自界说配置
默认即可
10.挂载操作系统
通过捏造机设置挂载操作系统
设置完成,启动捏造机举行配置
11.举行网络配置
登录捏造机,编辑网络配置文件
输入编辑下令
编辑文件
更改配置后,重启网络服务
12.克隆机器
13.更改克隆机器地点
三台机器ip地点分别为192.168.51.129、192.168.51.130、192.168.51.131
克隆机器ip均为192.168.51.129,启动捏造机编辑网络配置文件的ip地点即可
下令:vi /etc/sysconfig/network-scripts/ifcfg-ens33
修改内容:
第三台机器同理。
1.2 部署大数据集群前的情况准备
1.2.1 关闭防火墙
输入下令:systemctl stop firewalld
systemctl disable firewalld
1.2.2 机器关闭selinux
执行以下下令:vim /etc/sysconfig/selinux
修改配置:SELINUX=disabled
1.2.3 机器更改主机名
三台机器执行下令:
hostnamectl set-hostname Hadoop01
将机器名修改为Hadoop01,三台机器执行如下:
1.2.4 主机名与IP地点的映射
执行下令:
vi /etc/hosts
修改配置:
1.2.5 时钟同步
执行下令:yum -y install ntpdate
执行下令:ntpdate ntp4.aliyun.com
执行下令:crontab -e
添加如下内容:
1.2.6 添加普通用户
三台linux服务器同一添加普通用户hadoop,并给以sudo权限,同一设置普通用户的密码为 123456
useradd hadoop
passwd hadoop
执行如下下令:
visudo
增加如下内容
hadoop ALL=(ALL) ALL
1.2.7 关机重启
执行下令:sudo reboot -h now
1.2.8 hadoop用户免密码登录
- 机器在hadoop用户下执行以下下令生成公钥与私钥
执行如下下令:
ssh-keygen -t rsa
- 三台机器在hadoop用户下,执行下令拷贝公钥到hadoop01服务器
执行下令:ssh-copy-id hadoop01
- hadoop01服务器将公钥拷贝给hadoop02与hadoop03
hadoop01服务器执行如下下令:
cd /home/hadoop/.ssh/
scp authorized_keys hadoop02PWD
scp authorized_keys hadoop03PWD
1.2.9 安装JDK
执行下令:cd /kkb/soft
解压压缩包:tar - xzvf jdk-8u361-linux-x64.tar.gz -C /kkb/install(在本地利用WinSCP上传压缩包到捏造机)
修改配置:sudo vim /etc/profile
使配置生效,执行下令:
查看是否安装乐成,下令:java -version
1.3 Hadoop集群的安装
配置文件代码
1.3.1 修改系统配置文件
Hadoop01执行下令:
- cd /kkb/install/hadoop-3.3.1/etc/hadoop/
- vim hadoop-env.sh
复制代码 修改配置,添加export JAVA_HOME=/kkb/install/jdk1.8.0_361
1.3.2 修改core-site.xml
Hadoop01执行以下下令:
修改文件,添加配置:
1.3.3 修改hdfs-site.xml
Hadoop01执行下令:
修改文件:
1.3.4 修改mapred-site.xml
hadoop01执行如下下令:
修改文件:
1.3.5 修改yarn-site.xml
hadoop01执行如下下令:
修改文件:
1.3.6 修改workers文件
hadoop01执行如下下令:
修改文件,原内容替换如下:
1.3.7 创建文件存放目录
Hadoop01执行如下下令创建目录:
- mkdir -p /kkb/install/hadoop-3.3.1/hadoopDatas/tempDatas
- mkdir -p /kkb/install/hadoop-3.3.1/hadoopDatas/namenodeDatas
- mkdir -p /kkb/install/hadoop-3.3.1/hadoopDatas/datanodeDatas
- mkdir -p /kkb/install/hadoop-3.3.1/hadoopDatas/dfs/nn/edits
- mkdir -p /kkb/install/hadoop-3.3.1/hadoopDatas/dfs/snn/name
- mkdir -p /kkb/install/hadoop-3.3.1/hadoopDatas/dfs/nn/snn/edits
复制代码 1.3.8 安装包的分发scp与rsync
1.3.8.1 通过scp直接拷贝
通过scp举行不同服务器之间的文件或文件夹的复制
hadoop01执行如下下令:
- cd /kkb/install/
- scp -r hadoop-3.3.1/ hadoop02:$PWD
- scp -r hadoop-3.3.1/ hadoop03:$PWD
复制代码 1.3.8.2 通过rsync来实现增量拷贝
rsync 远程同步工具
rsync紧张用于备份和镜像。具有速度快、制止复制相同内容和支持符号链接的优点。
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去
捏造机都执行如下下令举行安装rsync工具:
- ```bash
- sudo yum -y install rsync
- ```
复制代码 基本语法
hadoop01执行以下下令同步zk安装包
- rsync -av /kkb/soft/apache-zookeeper-3.6.2-bin.tar.gz node02:/kkb/soft/
复制代码 下令 选项参数 要拷贝的文件路径/名称 目标用户@主机:目标路径/名称
选项参数说明
选项功能-a归档拷贝-v显示复制过程 1.3.8.3 xsync集群分发脚本
(1)需求:循环复制文件到所有节点的相同目录下
(2)需求分析:
(a)rsync下令原始拷贝:
rsync -av /opt/module hadoop@hadoop01:/opt/
(b)期望脚本:
xsync要同步的文件名称
(c)期望脚本在任何路径都能利用
(3)脚本实现
(a)在/home/hadoop目录下创建bin目录,并在bin目录下xsync创建文件,文件内容如下:
hadoop01执行如下下令:
cd ~
cd /home/hadoop/bin
touch xsync
vim xsync
文件内容如下:
b)修改脚本 xsync 具有执行权限
chmod +x xsync
(c)测试脚本
xsync /home/hadoop/bin
(d)将脚本复制到/usr/local/bin中,以便全局调用
sudo cp xsync /usr/local/bin
1.3.9 配置hadoop的情况变量
捏造机均执行如下下令:
sudo vim /etc/profile
修改文件,添加配置:
修改完成后使配置生效
执行下令:
source /etc/profile
1.3.10 格式化集群
要启动 Hadoop 集群,需要启动 HDFS 和 YARN 两个集群。
注意:首次启动HDFS时,必须对其举行格式化操作。本质上是一些清理和准备工作,因为此时的 HDFS 在物理上照旧不存在的。格式化操作只有在首次启动的时候需要,以后再也不需要了
hadoop01执行一遍即可
下令如下:
hdfs namenode -format 或 hadoop namenode –format
1.3.11 集群启动
启动集群有两种方式:
① 脚本一键启动;
②单个进程逐个启动
1.3.11.1 启动HDFS、YARN、Historyserver
如果配置了 etc/hadoop/workers 和 ssh 免密登录,则可以利用程序脚本启动所有Hadoop 两个集群的相关进程,在主节点所设定的机器上执行。
启动集群
主节点hadoop01节点上执行以下下令
启动集群
start-dfs.sh
start-yarn.sh
mapred --daemon start historyserver
停止集群(主节点hadoop01节点上执行):
stop-dfs.sh
stop-yarn.sh
mapred --daemon stop historyserver
1.3.11.2 一键启动hadoop集群的脚本
为了便于一键启动hadoop集群,我们可以编写shell脚本
在hadoop01服务器的/home/hadoop/bin目录下创建脚本
执行下令:
cd /home/hadoop/bin/
vim hadoop.sh
文件内容如下:
修改脚本权限
执行如下下令:
chmod 777 hadoop.sh
[hadoop@hadoop01 bin]$ ./hadoop.sh start # 启动hadoop集群
[hadoop@hadoop01 bin]$ ./hadoop.sh stop # 停止hadoop集群
1.3.12 验证集群
1.3.12.1 查看网站
(1)Web端查看HDFS的NameNode
(a)浏览器中输入:http://hadoop01:9870
(b)查看HDFS上存储的数据信息
(2)Web端查看YARN的ResourceManager
(a)浏览器中输入:http://hadoop01:8088
(b)查看YARN上运行的Job信息
(3)查看JobHistory
浏览器输入:http://hadoop01:19888/jobhistory
注意:未配置本地电脑hosts文件的根据ip地点举行修改,将主机名称改为ip地点
1.3.12.2 查看进程脚本
我们也可以通过jps在每台机器上面查看进程名称,为了方便我们以后查看进程,我们可以通过脚本一键查看所有机器的进程
在hadoop01服务器的/home/hadoop/bin目录下创建文件xcall
执行下令:
vim xcall
文件内容如下:
修改脚本权限并分发
下令如下:
chmod 777 /home/hadoop/bin/xcall
xsync /home/hadoop/bin/
将脚本复制到/usr/local/bin中,以便全局调用
sudo cp xcall /usr/local/bin
调用脚本
xcall jsp
各节点进程如下图:
1.3.12.3 运行一个mr例子
执行下令:
hadoop jar /kkb/install/hadoop-3.3.1/share/hadoop/mapreduce/
hadoop-mapreduce-examples-3.3.1.jar pi 5 5
结果如下:
四、[MapReduce]编程实行:单词计数统计实现
需求:现有数据格式如下,每一行数据之间都是利用空格举行分割,求取每个单词出现的次数
- hadoop hadoop
- banzhang
- xue
- cls cls
- jiao
- ss ss ss
- yhy yhy
复制代码 2.1 创建maven工程并导入以下jar包
- <?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>org.example</groupId>
- <artifactId>WordCount</artifactId>
- <version>1.0-SNAPSHOT</version>
- <properties>
- <maven.compiler.source>8</maven.compiler.source>
- <maven.compiler.target>8</maven.compiler.target>
- <hadoop.version>3.0.0</hadoop.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.apache.hadoop</groupId>
- <artifactId>hadoop-client</artifactId>
- <version>${hadoop.version}</version>
- </dependency>
- <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>
- <!-- https://mvnrepository.com/artifact/junit/junit -->
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.11</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.testng</groupId>
- <artifactId>testng</artifactId>
- <version>RELEASE</version>
- </dependency>
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>1.2.17</version>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.1</version>
- <configuration>
- <source>1.8</source>
- <target>1.8</target>
- <encoding>UTF-8</encoding>
- <!-- <verbal>true</verbal>-->
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-shade-plugin</artifactId>
- <version>2.4.3</version>
- <executions>
- <execution>
- <phase>package</phase>
- <goals>
- <goal>shade</goal>
- </goals>
- <configuration>
- <minimizeJar>true</minimizeJar>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- </project>
复制代码 2.2 界说WordCountMapper类
- package com.hadoop.mapreduce.wordcount;
- import org.apache.hadoop.io.IntWritable;
- import org.apache.hadoop.io.LongWritable;
- import org.apache.hadoop.io.Text;
- import org.apache.hadoop.mapreduce.Mapper;
- import java.io.IOException;
- /**
- * KEYIN, map阶段输入的key的类型:LongWritable
- * VALUEIN,map阶段输入value类型:Text
- * KEYOUT,map阶段输出的Key类型:Text
- * VALUEOUT,map阶段输出的value类型:IntWritable
- */
- public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
- private Text outK = new Text();
- private IntWritable outV = new IntWritable(1);
- @Override
- protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
- // 1 获取一行
- String line = value.toString();
- // 2 切割
- String[] words = line.split(" ");
- // 3 循环写出
- for (String word : words) {
- // 封装outk
- outK.set(word);
- // 写出
- context.write(outK, outV);
- }
- }
- }
复制代码 2.3 界说WordCountReducer类
- package com.hadoop.mapreduce.wordcount;
- import org.apache.hadoop.io.IntWritable;
- import org.apache.hadoop.io.Text;
- import org.apache.hadoop.mapreduce.Reducer;
- import java.io.IOException;
- /**
- * KEYIN, reduce阶段输入的key的类型:Text
- * VALUEIN,reduce阶段输入value类型:IntWritable
- * KEYOUT,reduce阶段输出的Key类型:Text
- * VALUEOUT,reduce阶段输出的value类型:IntWritable
- */
- public class WordCountReducer extends Reducer<Text, IntWritable,Text,IntWritable> {
- private IntWritable outV = new IntWritable();
- @Override
- protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
- int sum = 0;
- // 累加
- for (IntWritable value : values) {
- sum += value.get();
- }
- outV.set(sum);
- // 写出
- context.write(key,outV);
- }
- }
复制代码 2.4 界说WordCountDriver类
- package com.atguigu.mapreduce.wordcount2;
- 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.FileInputFormat;
- import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
- import java.io.IOException;
- public class WordCountDriver {
- public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
- // 1 获取job
- Configuration conf = new Configuration();
- Job job = Job.getInstance(conf);
- // 2 设置jar包路径
- job.setJarByClass(WordCountDriver.class);
- // 3 关联mapper和reducer
- job.setMapperClass(WordCountMapper.class);
- job.setReducerClass(WordCountReducer.class);
- // 4 设置map输出的kv类型
- job.setMapOutputKeyClass(Text.class);
- job.setMapOutputValueClass(IntWritable.class);
- // 5 设置最终输出的kV类型
- job.setOutputKeyClass(Text.class);
- job.setOutputValueClass(IntWritable.class);
- // 6 设置输入路径和输出路径
- FileInputFormat.setInputPaths(job, new Path(args[0]));
- FileOutputFormat.setOutputPath(job, new Path(args[1]));
- // 7 提交job
- boolean result = job.waitForCompletion(true);
- System.exit(result ? 0 : 1);
- }
- }
复制代码 运行结果:
输出结果:
2.5 集群测试
将程序举行打成jar包
修改不带依靠的jar包名称为wc.jar,并拷贝该jar包到Hadoop集群的/kkb/install/hadoop-3.1.3路径。
执行WordCount程序:
hadoop jar wc.jar com.hadoop.mapreduce.wordcount.WordCountDriver /input /output
运行结果:
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |