大数据01_hadoop入门基础知识
第二章Hadoop的安装
2.1 Hadoop的部署模式
本地模式(单机模式)
伪分布模式(一台机器模拟多个节点)
集群模式(生产环节使用多台机器,各台机器都有自己的角色)
2.2安装Hadoop时的环境准备以及步骤
2.2.1环境准备
准备Linux环境 这里用到了VMware(virtualBox)和CentOS 、Ubuntu
安装JDK1.7(Hadoop是用java书写的 其源码是java)
配置Hadoop (难点)
准备Linux环境:在windows下安装虚拟机 或者租用云主机(阿里云、UnitedStack等)
2.2.单机安装步骤
1.关闭防火墙
2.修改IP
3.修改hostname
4.设置ssh自动登录
5.安装JDK
6.安装hadoop
2.2.2.1 修改IP
Wiondow(宿主机)与虚拟机(客户机)网络连接进行通信的常用两种方式
Host-only:宿主机与客户机单独组网,不能通信。
好处就是:网络的隔离
坏处:虚拟机与其他的服务器之间不能进行通信
安装完Vmvare时会产生两个虚拟的网卡:Vmnet1 、Vmnet8
Bridge:宿主机与客户机在同一个局域网络中。
好处:都在同一个局域网能够进行通信。
坏处:不安全。
通过上图可以看出linux主机和window主机通过虚拟的网关组成一个网络,他们如果互相的通信就必须把ip地址配置在一个虚拟的网段中。
如虚拟网关的ip地址为192.168.2.1 linux主机的IP地址为192.168.2.100 window下的虚拟网卡地址为192.168.2.101
如虚拟网关的ip地址为192.168.1.1 linux主机的IP地址为192.168.1.100 window下的虚拟网卡地址为192.168.1.101
其中虚拟网关的Ip的设置是在vmware下设置的如:192.168.2.1
在windows主机下会生成虚拟的网卡如Vmnet8配置其ip地址为
设置Lunix主机的IP地址
在命令行中输入 Service network restart 重启网络使IP生效
测试:ifconfig
测试在windows下是否能够ping通linux主机修改的Ip
在windows下输入ping 192.168.2.100
关闭linux的图形界面
当开启多个虚拟机的时候图形界面会消耗内存
在命令行中输入init 3 这样的方式关闭当下次在开启虚拟机的时候,图形界面重新出现,要想不让其出现可以修改其配置文件
在linux命令行输入 su 切换到root用户 然后输入 vi /etc/sudoers
加入hadoop ALL=(ALL) ALL
然后切换到hadoop用户下输入 sudo vi /etc/inittab 并修改id 为3
输入 wq 保存
使用secure CRT 进行IP的链接
2.2.2.2 修改主机名
hostname:命令查看主机名
Hostname hadoop 命令修改主机名为hadoop
这种设置方式只对当前会话有用,重启电脑失效。
另一中方式就是修改配置文件做到一劳永逸的效果
vi /etc/sysconfig/network 接着修改主机名为hadoop
HOSTNAME=hadoop
按esc 退出编辑器 输入 wq命令保存退出。
验证:重启机器 输入hostname 。
把主机名和IP绑定
执行vi /etc/hosts 增加一行内容(linux 的ip) 如下
192.168.2.100 hadoop 保存退出即可。
验证:ping hadoop
2.2.2.3 关闭防火墙
命令:service iptables stop 验证:service iptables status
关闭防火墙的自动运行(类似windows下的服务)
执行命令:chkconfig iptables off
验证:chkconfig --list |grep iptables
2.2.2.4设置SSH免登陆
SSH(secure shell)
#生成ssh免登陆**
执行命令 cd .ssh 进入到ssh目录然后
执行命令 :ssh-****** -t rsa (四个回车)
执行完这个命令后,会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
执行命令:cp id_rsa.pub authorized_keys
执行命令:ls
2.2.2.5 安装JDK
使用FileZilla软件快速的上传windows文件到linux中
(将hadoop和jdk压缩包从windows中上传到linux中downloads文件夹)
清除local中的文件
将Downloads下的文件拷贝到local下(cp /root/Downloads/* .)
解压文件(./jdk-7u65-linux-i586.tar.gz 权限不足)
通过(ls -l命令)查看两个压缩文件只有读写权限没有执行权限
授予权限(执行chmod u+x jdk-7u65-linux-i586.tar.gz 命令)
查看权限(执行 ls -l 命令)这是发现jdk多了一个执行的权限
这时候再次执行(tar -zxvf jdk-7u65-linux-i586.tar.gz 命令进行jdk解压 tar -zxvf hadoop-2.4.1.tar.gz 进行hadoop的解压)
为了便于以后对jdk的引用需要重命名jdk
mv jdk1.7.0_65 jdk 命令
将JDK配置到文件中
执行命令 :vi /etc/profile
在空白处添加以下内容 并保存退出
export JAVA_HOME=/usr/local/jdk
export PATH=.:$PATH:$JAVA_HOME/bin:$PATH
执行 source /etc/profile命令 使其立即生效
验证配置(建议使用jdk1.6)
2.2.2.6 安装hadoop(版本2.4.1)
1)执行命令tar -zxvf hadoop-2.4.1.tar.gz 进行hadoop的解压
2)重命名 mv hadoop-2.4.1 hadoop
3)执行命令 vi /etc/profile 设置环境变量 保存退出 :wq
4)执行source /etc/profile使配置文件生效
5)修改hadoop的配置文件注意:hadoop2.x的配置文件$HADOOP_HOME/etc/hadoop目录
需要修改5个配置文件:hadoop-env.sh;core-site.xml;hdfs-site.xml;mapred-site.xml;yarn-site.xml
这时的修改可以使用FileZilla软件进行修改
5.1 hadoop-env.sh文件
执行 cd /hadoop/etc/hadoop 命令进入配置文件目录
执行vi hadoop-env.sh 命令修改其配置文件
export JAVA_HOME=/usr/local/jdk1.8.0
也可以把mapred-env.sh和yarn-env.sh一同修改。
5.2 core-site.xml
vi core-site.xml
在configuration中添加
<property>
<name>fs.default.name</name>
<value>hdfs://itcast02:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp/</value>
</property>
Note:itcast02为主机名
修改后的结果为
5.3 hdfs-site.xml
vim hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
指定副本的数量:因为是单机模式,这里的副本数量是1
5.4 mapred-site.xml
注意:
mapred-site.xml (mv mapred-site.xml.template mapred-site.xml)
vim mapred-site.xml命令进行编辑
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
指定Mapreduce运行在YARN上
5.5 yarn-site.xml
指定YARN的老大ResourcesManager的地址
<property>
<name>yarn.resourcemanager.hostname</name>
<value>itcast02</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
6)对hadoop进行格式化(配置hadoophome)
执行命令 hadoop namenode -format
7)启动hadoop(实际上启动的java进程)
切换到sbin目录下
先启动HDFS
sbin/start-dfs.sh
再启动YARN
sbin/start-yarn.sh
8)验证是否启动成功
jps命令验证(5个进程hadoop版本2)
27408 NameNode
27643 SecondaryNameNode
28066 NodeManager
27803 ResourceManager
27512 DataNode
Hadoop版本1的5个线程
http://192.168.2.100:50070 (HDFS管理界面)http://hadoop:50070/dfshealth.jsp
此界面能够显示表示HDFS正常的存活。
9)如何在windows下使用主机名登录linux的界面?
在windows下的C:\Windows\System32\drivers\etc修改目录hosts
添加如下 内容:
192.168.2.100 hadoop
10)去除hadoop的启动警告
关闭进程
stop-all.sh
在 vi /etc/profile 文件中添加
source /etc/profile使配置文件生效
NameNode进程启动不成功的原因:
1)没有格式化
2)配置文件只是copy,不修改。
3)SSH的免密码登录没设置成功
4)Hostname与ip没有绑定
5)多次格式化也会出现错误
方法:删除 usr/local/hadoop/tmp 文件夹 重新格式化
WordCount的小例子(Maven+eclipse+java)
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>org.conan.myhadoop.mr</groupId>
<artifactId>myHadoop</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>myHadoop</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>zookeeper</artifactId>
<version>3.3.1</version>
<exclusions>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
WCMapper类(注意不要导错包)
import java.io.IOException;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
/**
* hadoop-1.x 将此程序运行在Linux itcast02虚拟机上 Alt+shift+s 重写父类的方法
* 这是old version的hadoop版本
* @author Administrator
*
*/
public class WCMapper 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 s : words) {
// 循环出一次记为1
context.write(new Text(s), new LongWritable(1));
}
}
}
WCReducer类
import java.io.IOException;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
/**
* 自定义Reducer 并重写reduce()方法
*
* @author Administrator
*
*/
public class WCReducer extends Reducer<Text, LongWritable, Text, LongWritable> {
@Override
protected void reduce(Text text, Iterable<LongWritable> v1, Context context)
throws IOException, InterruptedException {
long count = 0;
for (LongWritable i : v1) {
count += i.get();
}
// 将结果输出
context.write(text, new LongWritable(count));
}
}
WordCount 类
import java.io.IOException;
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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
/**
* 提交作业
* 打成jar包在linux下执行
* 打成jar包的方式
* 1)JAR file :在linux下适用hadoop -jar 的方式执行
* 2)Runnable JAR file:在linux下使用java -jar的方式执行
* 在这里我们采用JAR file的方式执行
* 注意:在打成jar的时候 要指定 main方法 如果在打jar包的时候不去指定,只能在运行的时候去指定运行jar包的main方法
* 这里我们直接在打jar包的时候去指定main方法
* 将打成的jar包放在linux的/usr/local/project目录下面
* @author Administrator
*
*/
public class WordCount {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
// 创建一个Job对象
Job job = new Job();
// 设置main方法的类
job.setJarByClass(WordCount.class);
// 设置Mapper的相关的属性
job.setMapperClass(WCMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class);
FileInputFormat.setInputPaths(job, new Path("/words.txt"));// 这里的words是hdfs文件系统的路径
// 设置Reduce的相关的属性
job.setReducerClass(WCReducer.class);
job.setOutputKeyClass(Text.class);// reduce没有setReducerOutputKeyClass
// 但是这里的setOutputKeyClass对于Mapper和Reducer都适用
job.setOutputValueClass(LongWritable.class);
FileOutputFormat.setOutputPath(job, new Path("/wcount610"));// 自动的创建wcount610文件夹
job.waitForCompletion(true);// 提交job任务 设置为true 显示打印详情
}
}
打成JAR file 放在Linux的/usr/local目录下面
执行 hadoop jar /usr/local/wcount.jar 运行程序
当运行成功的时候会在 hdfs的根目录下的 wcount610目录下面存在一个
part-r-00000文件 这个文件就是统计的单词个数。
hadoop权威指南气象数据最高气温的统计temperature
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
/**
* hadoop-2.x 将此程序运行在Linux itcast02虚拟机上 Alt+shift+s 重写父类的方法 这是old
* version的hadoop版本
*
* @author Administrator
*
*/
public class MaxTemperatureMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
private static final int MISSING = 9999;
@Override
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
String year = line.substring(15, 19);
int airTemperature;
if (line.charAt(87) == '+') { // parseInt doesn't like leading plus
// signs
airTemperature = Integer.parseInt(line.substring(88, 92));
} else {
airTemperature = Integer.parseInt(line.substring(87, 92));
}
String quality = line.substring(92, 93);
if (airTemperature != MISSING && quality.matches("[01459]")) {
context.write(new Text(year), new IntWritable(airTemperature));
}
}
}
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
/**
* 自定义Reducer 并重写reduce()方法
*
* @author Administrator
*
*/
public class MaxTemperatureReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
@Override
public void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
int maxValue = Integer.MIN_VALUE;
for (IntWritable value : values) {
maxValue = Math.max(maxValue, value.get());
}
context.write(key, new IntWritable(maxValue));
}
}
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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
/**
* 提交作业 打成jar包在linux下执行 打成jar包的方式 1)JAR file :在linux下适用hadoop -jar 的方式执行
* 2)Runnable JAR file:在linux下使用java -jar的方式执行 在这里我们采用JAR file的方式执行 注意:在打成jar的时候
* 要指定 main方法 如果在打jar包的时候不去指定,只能在运行的时候去指定运行jar包的main方法 这里我们直接在打jar包的时候去指定main方法
* 将打成的jar包放在linux的/usr/local/project目录下面
*
* @author Administrator
*
*/
public class MaxTemperature {
public static void main(String[] args) throws Exception {
Job job = new Job();
job.setJarByClass(MaxTemperature.class);
job.setJobName("Max temperature");
FileInputFormat.addInputPath(job, new Path("/temperature.txt"));
FileOutputFormat.setOutputPath(job, new Path("/temperature610"));
job.setMapperClass(MaxTemperatureMapper.class);
job.setReducerClass(MaxTemperatureReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}