赞
踩
学习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。
默认即可
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
修改内容:
第三台机器同理。
输入命令:systemctl stop firewalld
systemctl disable firewalld
执行以下命令:vim /etc/sysconfig/selinux
修改配置:SELINUX=disabled
三台机器执行命令:
hostnamectl set-hostname Hadoop01
将机器名修改为Hadoop01,三台机器执行如下:
执行命令:
vi /etc/hosts
修改配置:
执行命令:yum -y install ntpdate
执行命令:ntpdate ntp4.aliyun.com
执行命令:crontab -e
添加如下内容:
三台linux服务器统一添加普通用户hadoop,并给以sudo权限,统一设置普通用户的密码为 123456
useradd hadoop
passwd hadoop
执行如下命令:
visudo
增加如下内容
hadoop ALL=(ALL) ALL
执行命令:sudo reboot -h now
执行如下命令:
ssh-keygen -t rsa
执行命令:ssh-copy-id hadoop01
hadoop01服务器执行如下命令:
cd /home/hadoop/.ssh/
scp authorized_keys hadoop02:$PWD
scp authorized_keys hadoop03:$PWD
执行命令:cd /kkb/soft
解压压缩包:tar - xzvf jdk-8u361-linux-x64.tar.gz -C /kkb/install(在本地使用WinSCP上传压缩包到虚拟机)
修改配置:sudo vim /etc/profile
使配置生效,执行命令:
source /etc/profile
查看是否安装成功,命令:java -version
Hadoop01执行命令:
cd /kkb/install/hadoop-3.3.1/etc/hadoop/
vim hadoop-env.sh
修改配置,添加export JAVA_HOME=/kkb/install/jdk1.8.0_361
Hadoop01执行以下命令:
vim core-site.xml
修改文件,添加配置:
Hadoop01执行命令:
vim hdfs-site.xml
修改文件:
hadoop01执行如下命令:
vim mapred-site.xml
修改文件:
hadoop01执行如下命令:
vim yarn-site.xml
修改文件:
hadoop01执行如下命令:
vim workers
修改文件,原内容替换如下:
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
通过scp进行不同服务器之间的文件或文件夹的复制
hadoop01执行如下命令:
cd /kkb/install/
scp -r hadoop-3.3.1/ hadoop02:$PWD
scp -r hadoop-3.3.1/ hadoop03:$PWD
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)需求:循环复制文件到所有节点的相同目录下
(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
虚拟机均执行如下命令:
sudo vim /etc/profile
修改文件,添加配置:
修改完成后使配置生效
执行命令:
source /etc/profile
要启动 Hadoop 集群,需要启动 HDFS 和 YARN 两个集群。
注意:首次启动HDFS时,必须对其进行格式化操作。本质上是一些清理和准备工作,因为此时的 HDFS 在物理上还是不存在的。格式化操作只有在首次启动的时候需要,以后再也不需要了
hadoop01执行一遍即可
命令如下:
hdfs namenode -format 或 hadoop namenode –format
启动集群有两种方式:
① 脚本一键启动;
②单个进程逐个启动
如果配置了 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
为了便于一键启动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)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地址
我们也可以通过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
各节点进程如下图:
执行命令:
hadoop jar /kkb/install/hadoop-3.3.1/share/hadoop/mapreduce/
hadoop-mapreduce-examples-3.3.1.jar pi 5 5
结果如下:
需求:现有数据格式如下,每一行数据之间都是使用空格进行分割,求取每个单词出现的次数
hadoop hadoop
banzhang
xue
cls cls
jiao
ss ss ss
yhy yhy
<?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>
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); } } }
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); } }
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); } }
运行结果:
输出结果:
将程序进行打成jar包
修改不带依赖的jar包名称为wc.jar,并拷贝该jar包到Hadoop集群的/kkb/install/hadoop-3.1.3路径。
执行WordCount程序:
hadoop jar wc.jar com.hadoop.mapreduce.wordcount.WordCountDriver /input /output
运行结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。