本实验的环境:VMware Workstation,CentOS7操作系统,hadoop-3.0.0-alpha2
实验要点:虚拟机配置静态ip,hadoop配置文件设置
一、软件安装
1. 此处略去,网上教程很多,自行搜索
假定已安装好一个CentOS7系统,虚拟机名字叫serverone,安装必要的编程环境java,eclipse,参考CentOS7下yum源搭建编程环境。
2. 解压hadoop-3.0.0-alpha2到/opt
目录下:
sudo tar -zxvf hadoop-3.0.0-alpha2.tar.gz -C /opt
二、虚拟机配置多个静态ip
1. 可以参考vmware_workstation网络配置实操详解,了解虚拟机的几种不同的联网方式的差异
2. 选用NAT方式配置网络
编辑—>虚拟网络编辑器—>vmnet8进行设置。子网IP可以随便给一个值,网关设置成需要ip同一网段的一个值(不懂网络的可以查查资料),配置本地主机的VMware8,和虚拟机在同一网段,否则主机ping不通虚拟机
3. 设置主机名
sudo vim /etc/sysconfig/network
, HOSTNAME=severone,如果修改/etc/hosts和/etc/sysconfig/network两个文件不能生效,使用命令 : sudo hostnamectl set-hostname severone
进行修改
4. 设置私有ip和主机对应关系
sudo vim /etc/hosts
,假设需要三台机器,每台机器主机=别名,这是为了便于记忆ip
5. 网卡配置:进入网卡文件
增加的设置如下:mac地址,ip地址,子网掩码,网关和域名服务器同时把ipv6相关信息注释掉,mac地址使用ifconfig查看,完成后不要忘记重启网络/etc/init.d/network restart
三、修改配置文件
Hadoop配置文件采用XML格式,文本打开在configuration中进行设置,每个配置项一般包括配置属性的名称name、值value。
环境变量,方便运行路径设置:运行vim /etc/profile
,添加hadoop的解压位置到环境变量
#Hadoop 3.0
export HADOOP_HOME=/opt/hadoop-3.0.0-alpha2
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
使生效
sudo source /etc/profile
hadoop-env.sh文件:找到并设置自己的jdk版本,javac -version
可以查找版本号
export JAVA_HOME=/usr/java/jdk1.8.0_91
conf/core-site.xml文件:Hadoop Common组件,全局配置
<property>
<name>fs.defaultFS</name>
<value>hdfs://serverone:9000</value>
<!--hadoop namenode 服务器地址和端口,以域名形式-->
</property>
hdfs-site.xml 文件:HDFS NameNode, Secondary NameNode, 和 DataNode 数据存储目录配置
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/var/data/hadoop/hdfs/nn</value>
</property>
<property>
<name>fs.checkpoint.dir</name>
<value>file:/var/data/hadoop/hdfs/snn</value>
<!--hadoop secondary 数据存储路径,可以配置成多个目录,用,号分隔。-->
</property>
<property>
<name>fs.checkpoint.edits.dir</name>
<value>file:/var/data/hadoop/hdfs/snn</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/var/data/hadoop/hdfs/dn</value>
</property>
<property>
<name>dfs.http.address</name>
<value>serverone:50070</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>serverone:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value></property>
<!--HDFS数据保存份数,通常是3-->
</property>
yarn-site文件:
<property>
<name>yarn.resourcemanager.hostname</name>
<value>serverone</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
mapred-site.xml文件:
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
workers文件:
serverone
server
agent
四、系统克隆
1. 为了节省时间,直接克隆系统
需要修改这个系统的和主机名有关的配置文件
2. 需要修改克隆系统的network文件,网卡文件,配置文件中有关主机名文件
3. ssh免密码登陆
ssh会把你每个你访问过计算机的公钥都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥
#本地主机设置
[server@serverone ~]$ mkdir ~/.ssh #用户目录下创建文件夹,也可以在其他位置
[server@serverone ~]$ ssh-keygen -t rsa #回车,生成公钥
[server@serverone ~]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys #复制公钥文件到authorized_keys,创建公钥集合文件
[server@serverone ~]$ sudo scp ~/.ssh/id_rsa.pub server@server:/home/server/.ssh/authorized_keys_from_serverone
#把公钥发送到server@server(前一个server为目的主机用户登录名,后一个server为hostname名字),生成authorized_keys_from_serverone文件
#目的主机
[server@server .ssh]$ cat authorized_keys_from_serverone >> authorized_keys
#权限配置700和600:以下两个命令在本机和目的主机都要配置,否则还需要密码登陆
[server@server ~]$ sudo chmod 700 ~/.ssh
[server@server ~]$ sudo chmod 600 ~/.ssh/authorized_keys
照此把所有本地主机公钥加入目的主机authorized_keys,再把此文件拷回到所有本地主机
4. 创建相应文件夹
[server@server ~]$ sudo mkdir -p /var/data/hadoop/hdfs/nn #NameNode数据存储目录
[server@server ~]$ sudo mkdir -p /var/data/hadoop/hdfs/snn #Secondary NameNode数据存储目录
[server@server ~]$ sudo mkdir -p /var/data/hadoop/hdfs/dn #DataNode 数据存储目录
[server@server ~]$ sudo chown –R server:server /var/data/hadoop/hdfs
[server@server ~]$ sudo mkdir -p /var/log/hadoop/yarn #yarn文件目录
[server@server ~]$ sudo chown -R server@server /var/log/hadoop/yarn
5.启动命令
随便选择一个机器作为主节点,另外两个用作附属节点
[server@server ~]$ hdfs namenode -format #格式化主节点
[server@server ~]$ hdfs --daemon.sh start namenode #启动主节点
[server@server ~]$ hdfs --daemon.sh start secondarynamenode #启动secondarynamenode
[server@server ~]$ hdfs --daemon.sh start datanode #启动数据节点
[server@server ~]$ yarn --daemon.sh start resourcemanager # 启动yarn服务
#最后在从节点上启动存储从服务和资源管理从服务(以下两条命令要在两台机器上分别执行)
[server@server ~]$ hdfs --daemon.sh start datanode #启动从存储服务
[server@server ~]$ yarn --daemon.sh start nodemanager #启动资源管理从服务
namenode使用jps得到:
停止,命令相同,将start换为stop
五、windows下远程连接hadoop
1. 软件准备
1.windows7
2.jdk:版本和hadoop集群保持一致
3.eclipse:注意和jdk版本相匹配
4.Hadoop :集群中的的hadoop解压
5.将hadoop-eclipse-plugin-2.5.2.jar拷贝至eclipse的plugins目录下
6.需要hadoop.dll,winutils.exe ;直接拷贝hadoop-common-2.2.0-bin-master\bin目录下内容覆盖hadoop-2.5.2\bin
2. 系统配置
1.添加host映射:C:\Windows\System32\drivers\etc\hosts文件加入master主机对应的ip
2.配置hadoop的环境变量
3.修改主机名和master用户名相同
3. eclipse配置
1.打开菜单Window–Preference–Hadoop Map/Reduce进行配置,选择hadoop路径
2.显示Hadoop连接配置窗口:Window–Show View–Other-MapReduce Tools,如下图所示,选择windows->show view->Project Explore显示出DFS Location
3.配置连接Hadoop
1)Location name:是你给hadoop起的name (随意)。
2)左边 port填写是参照yarn-site.xml 中的yarn.resourcemanager.resource-tracker.address
右边port参考core-site.xml中的fs.defaultFS
3)host填主机ip;user name:hadoop的用户名
4.创建log4j.properties文件
4.WordCount代码
新建项目 File–New–Other–Map/Reduce Project 命名为MR,
然后创建包org.apache.hadoop.examples,类WordCount:
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.examples;
import java.io.IOException;
import java.util.StringTokenizer;
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.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
public class WordCount {
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
public static class IntSumReducer
extends Reducer<Text,IntWritable,Text,IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
/*String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length < 2) {
System.err.println("Usage: wordcount <in> [<in>...] <out>");
System.exit(2);
}
*/
Job job = new Job(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//for (int i = 0; i < otherArgs.length - 1; ++i) {
// FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
// }
//FileOutputFormat.setOutputPath(job,
// new Path(otherArgs[otherArgs.length - 1]));
FileInputFormat.addInputPath(job, new Path("hdfs://172.16.0.53:8020/input/testMapReduce.txt"));//路径1
FileOutputFormat.setOutputPath(job, new Path("hdfs://172.16.0.53:8020/output"));//输出路径
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
六、Hadoop相关进程介绍
在分布式存储和分布式计算方面,Hadoop都是用从/从(Master/Slave)架构。在一个配置完整的集群上,需要在集群中运行一系列后台(deamon)程序。后台程序由NameNode、DataNode、 Secondary NameNode、JobTracker、TaskTracker组成。其中NameNode、Secondary NameNode、JobTracker运行在Master节点上,而在每个Slave节点上,部署一个DataNode和TaskTracker,以便 这个Slave服务器运行的数据处理程序能尽可能直接处理本机的数据。对Master节点需要特别说明的是,在小集群中,Secondary NameNode可以属于某个从节点;在大型集群中,NameNode和JobTracker被分别部署在两台服务器上。
1.NameNode
Namenode 管理者文件系统的Namespace。它维护着文件系统树(filesystem tree)以及文件树中所有的文件和文件夹的元数据(metadata)。Namenode记录着每个文件中各个块所在的数据节点的位置信息,但是他并不持久化存储这些信息,因为这些信息会在系统启动时从数据节点重建。
2.Secondary NameNode
Secondary NameNode作为一个辅助的Namenode对Namenode 文件系统元数据备份,它的主要作用是定期的将Namespace镜像与操作日志文件(edit log)合并,以防止操作日志文件(edit log)变得过大
3.Datanode
Datanode是文件系统的工作节点,他们根据客户端或者是namenode的调度存储和检索数据,并且定期向namenode发送他们所存储的块(block)的列表。集群中的每个服务器都运行一个DataNode后台程序,这个后台程序负责把HDFS数据块读写到本地的文件系统。当需要通过客户端读/写某个 数据时,先由NameNode告诉客户端去哪个DataNode进行具体的读/写操作,然后,客户端直接与这个DataNode服务器上的后台程序进行通 信,并且对相关的数据块进行读/写操作。
4.JobTracker
JobTracker后台程序用来连接应用程序与Hadoop。用户代码提交到集群以后,由JobTracker决定哪个文件将被处理,并且为 不同的task分配节点。同时,它还监控所有的task,一旦某个task失败了,JobTracker就会自动重新开启这个task,在大多数情况下这 个task会被放在不用的节点上。每个Hadoop集群只有一个JobTracker,一般运行在集群的Master节点上。
5.TaskTracker
TaskTracker与负责存储数据的DataNode相结合,其处理结构上也遵循主/从架构。JobTracker位于主节点,统领 MapReduce工作;而TaskTrackers位于从节点,独立管理各自的task。每个TaskTracker负责独立执行具体的task,而 JobTracker负责分配task。虽然每个从节点仅有一个唯一的一个TaskTracker,但是每个TaskTracker可以产生多个java 虚拟机(JVM),用于并行处理多个map以及reduce任务。TaskTracker的一个重要职责就是与JobTracker交互。如果 JobTracker无法准时地获取TaskTracker提交的信息,JobTracker就判定TaskTracker已经崩溃,并将任务分配给其他 节点处理。
参考:
[1].CentOS7下yum源搭建编程环境
[2].Hadoop Cluster Setup
[3].hadoop3.0 alpha1 安装配置
[4].hadoop中NameNode、DataNode、Secondary、NameNode、JobTracker TaskTracker介绍