本实验的环境: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不通虚拟机

centos配置分布式Hadoop centos7配置hadoop集群_vmware

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

centos配置分布式Hadoop centos7配置hadoop集群_hadoop_02

5. 网卡配置:进入网卡文件

centos配置分布式Hadoop centos7配置hadoop集群_centos_03


增加的设置如下: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. 为了节省时间,直接克隆系统

需要修改这个系统的和主机名有关的配置文件

centos配置分布式Hadoop centos7配置hadoop集群_vmware_04

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得到:

centos配置分布式Hadoop centos7配置hadoop集群_centos_05


停止,命令相同,将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

centos配置分布式Hadoop centos7配置hadoop集群_hdfs_06


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介绍