Linux环境准备
1)防火墙配置
查看防火墙状态:systemctl status firewalld
关闭防火墙:systemctl stop firewalld
禁用防火墙:systemctl disable firewalld
2)网络ip地址配置
1> vi /etc/sysconfig/network-scripts/ifcfg-ens33
按字母a或者i进入编辑模式
2> 修改和添加内容并保存
BOOTPROTO=static
ONBOOT=yes
(IPADDR这里和vmware虚拟机工具中虚拟网络编辑器中NAT网段一致)
IPADDR=192.168.xx.101
GATEWAY=192.168.xx.2
NETMASK=255.255.255.0
DNS1=114.114.114.114
按ESC退出编辑模式,输入 :wq 保存退出
3> 重启网络 systemctl restart network
4> 输入ip addr 查看ip地址是否更改过来
3)主机名配置(3台)
1> vi /etc/hostname 将文件内容改为主机名 如 master、slave1、slave2
2> 为了马上可用分别设置,仅当前生效:hostnamectl set-hostname master/slave1/slave2
3> 输入 hostname 查看主机名是否改过来
4)主机映射配置(3台)
1> vi /etc/hosts 在最下面加入下列内容
192.168.xx.ip master
192.168.xx.ip slave1
192.168.xx.ip slave2
2> 测试:在master机上 直接输入 ping slave1 或者 ping slave2是否连通
5)ssh免密登录(在master机器上执行)
1> ssh-keygen -t rsa 产生秘钥
2> ssh-copy-id -i root@master 复制秘钥到其他机器
ssh-copy-id -i root@slave1 复制秘钥到其他机器
ssh-copy-id -i root@slave2 复制秘钥到其他机器
3> 测试: 在master机器上输入 ssh slave1 或者 ssh slave2 不输入密码表示成功登录
测试完毕输入 exit 退回原来机器
6)Jdk安装配置(因为大数据很多软件依赖jdk,所以需要先安装jdk)
1> 解压jdk压缩包到指定目录,如 /usr/local/src
tar -zxvf /xxx/jdk-8u212-linux-x64.tar.gz -C /usr/local/src
cd /usr/local/src //进入目录
mv jdk1.8.0_212/ jdk //改名
2> 配置jdk的环境变量(/etc/profile或者/root/.bash_profile都可以配置)
vi /root/.bash_profile
最后加入:
export JAVA_HOME=/usr/local/src/jdk
export PATH=$PATH:$JAVA_HOME/bin
3> 马上生效:
source /root/.bash_profile
4> 测试:输入 java 或者 javac
5> 将jdk远程拷贝至其他两台机器上
scp -r /usr/local/src/jdk slave1:/usr/local/src
scp -r /usr/local/src/jdk slave2:/usr/local/src
hadoop完全分布式搭建(3台机)
1> 解压hadoop到指定目录
tar -zxvf /xxx/hadoop3.1.3..tar.gz -C /usr/local/src
cd /usr/local/src
mv hadoop3.1.3.... hadoop
2> 配置环境变量
vi /root/.bash_profile
export HADOOP_HOME=/usr/local/src/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
保存退出,生效:
source /root/.bash_profile
3> 修改hadoop的配置文件(master机器上):
cd /usr/local/src/hadoop/etc/hadoop
A> vi hadoop-env.sh
export JAVA_HOME=/usr/local/src/jdk
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
B> vi core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/data/hadoop</value>
</property>
C> vi hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
D> vi mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
E> vi yarn-site.xml
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
F> vi workers (datanode的节点是哪几个机器)
master
slave1
slave2
G>(有可能需要修改yarn-env.sh)
export JAVA_HOME=/opt/jdk
4> 将master上配置好的hadoop拷贝到其他机器上
scp -r /usr/local/src/hadoop slave1:/usr/local/src
scp -r /usr/local/src/hadoop slave2:/usr/local/src
5> 格式化hadoop文件系统HDFS(如果重新格式化请删除配置的数据目录)
hdfs namenode -format
6> 启动hadoop集群:
1)一键启动:
start-all.sh
2)或按需启动:
start-dfs.sh
start-yarn.sh
7> 在master机器上输入jps 正常情况下:
master上5个进程:namenode datanode nodemanager resourcemanager secondarynamenode
slave1和slave2上2个进程:datanode nodemanager
8> 进入hadoop的webUI管理界面查看:9870
在window上浏览器打开:http://master的ip:9870
数据清洗、统计
本地创建一个空文本文件,写入一些单词,空格分开,将其上传到hdfs中
1)创建目录:hdfs dfs -mkdir /hotel
2)将文件放入某个目录: hdfs dfs -put /本地路径/xxx.csv /hotel
3)将hdfs文件下载下来:hdfs dfs -get /hdfs路径 /本地路径
4)查看hdfs文件内容:hdfs dfs -cat /hdfs路径/文件名
查看hdfs文件行数:hdfs dfs -cat /hdfs路径/文件名 | wc -l
hdfs dfs -cat /hotel/hotel.csv | head -5
5)删除目录 hdfs dfs -rm -r /hdfs目录
注意:hadoop3.X版本需要在yarn-site.xml中添加配置,否则运行程序报错:
错误: 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster
为了能正常执行mapreduce自带的案例,需要如下操作:
直接命令行输入: hadoop classpath 将出现的内容全部复制一下,在yarn-site.xml里面加入:
<property>
<name>yarn.application.classpath</name>
<value>将上面的内容粘贴到这里</value>
</property>
将修改后的文件复制给另外两台机器
scp /usr/local/src/hadoop/etc/hadoop/yarn-site.xml slave1:/usr/local/src/hadoop/etc/hadoop
scp /usr/local/src/hadoop/etc/hadoop/yarn-site.xml slave2:/usr/local/src/hadoop/etc/hadoop
自带经典统计单词个数
[root@master hadoop]# hadoop jar /usr/local/src/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /hotel/test.txt /out1
查看结果
[root@master hadoop]# hdfs dfs -cat /out1/part-r-00000
删除结果
(生成的目录不允许已经存在,因此每次生成时,如果有的话,先删除该输出目录)
[root@master hadoop]# hdfs dfs -rm -r /out1
自己编写的数据清洗:
创建maven项目,编写java类,最后打包jar文件,功能:统计一个文件中的每个单词的数量,以空格分隔:
maven项目的pom.xml加入以下
<!--添加项目开发mapreduce程序所需的依赖-->
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.1.3</version>
</dependency>
</dependencies>
package com.mhys;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
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 java.io.IOException;
public class MyWordCount {
//编写Map部分 <进入map的数据key-value类型,map出去的数据key-value类型>
//其中Map端进入的k-v类型是固定的,返回的是根据业务需要自己分析的
static class MyWordMapper extends Mapper<LongWritable, Text,Text, IntWritable>{
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//读取每行数据的处理操作
String[] arr = value.toString().split(" ");//将读取的行数据进行分隔 hadoop java hadoop java mysql html
//将数组循环按每个 单词,1的格式输出去
for(String word:arr){
context.write(new Text(word),new IntWritable(1));//单词,1的格式返回
}
}
}
//编写Reduce部分
static class MyWordReduce extends Reducer<Text, IntWritable,Text, IntWritable> {
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
for(IntWritable iw : values){
sum+=1; //将每个1加起来
}
context.write(key,new IntWritable(sum));
}
}
//编写一个驱动main方法
public static void main(String[] args) throws Exception{
Configuration conf = new Configuration();//创建一个执行mapreduce的默认配置
Job job = Job.getInstance(conf); //根据默认配置创建一个任务
job.setJarByClass(MyWordCount.class);//指明当前类名.class是运行的主类
job.setMapperClass(MyWordMapper.class);
job.setReducerClass(MyWordReduce.class);
//告诉任务 map端输出的key-value的类型是什么
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//告诉任务 reduce端输出的key-value类型是什么
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//告诉任务输入单词计数文件在哪里
FileInputFormat.addInputPath(job,new Path("/hotel/test.txt"));
//告诉任务输出结果的文件目录在哪里
FileOutputFormat.setOutputPath(job,new Path("/out1"));
//运行程序
boolean flag = job.waitForCompletion(true); //提交运行
System.exit(flag?1:0); //根据结果退出程序
}
}
该类的使用:因为该类内部写好了要处理的文件和要输出生成的文件名,所以,将该文件上传Linux,直接使用即可(需要删除hadoop中已有的out1目录,通过浏览器查看该目录)
[root@master hadoop]# hadoop jar /mysofts/mapreduce1-1.0-SNAPSHOT.jar com.mhys.MyWordCount
# 查看结果
[root@master hadoop]# hdfs dfs -cat /out1/part-r-00000