大数据01_hadoop入门基础知识

来源:互联网 发布:ssh无法连接linux 编辑:程序博客网 时间:2024/06/16 18:59

第二章Hadoop的安装

2.1 Hadoop的部署模式

本地模式(单机模式)

伪分布模式(一台机器模拟多个节点)

集群模式(生产环节使用多台机器,各台机器都有自己的角色)

2.2安装Hadoop时的环境准备以及步骤

2.2.1环境准备

准备Linux环境 这里用到了VMware(virtualBox)和CentOS 、Ubuntu

安装JDK1.7Hadoop是用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-keygen -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文件 这个文件就是统计的单词个数。

注意:在运行jar文件的时候,hdfs目录下面必须存在words.txt文件,还有就是不能存在wcount610目录。因为这个目录是在程序运行的时候自动的创建的。


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);
}
}



原创粉丝点击