vmware虚拟机上的centos安装Hadoop,以及在本地eclipse上运行mapReduce项目,并将文件输出到HDFS中

831 阅读7分钟

注意centos主机名不支持下划线,所以文章中若出现centos_02.com,请替换为

centos02.com

vmware虚拟机上的centos安装Hadoop

  • 安装vmware虚拟机
  • 虚拟机上安装centos
  • centos上安装hadoop

一。安装vmware虚拟机

下载VMware Workstation Pro下载地址

下载这个

安装

参考这篇文章

二。虚拟机上安装centos

打开vmware,点击创建新的虚拟机

虚拟机名称指的是给自己创建的这个虚拟机起个名字, 位置是指你要存放的地址。

这个根据自己电脑的内存大小决定, 因为我电脑的内存是8GB, 所以这里我给虚拟机分配的内存为1GB

到这里虚拟机创建完成,因为刚才选择的是创建空白虚拟机,所以这里开始给虚拟机装 centos操作系统

点击‘CD/DVD’

选择刚才下载的centos镜像文件的存放地址, 然后点击确定

点击开启此虚拟机

过一会点击‘重新引导’

此时centos系统安装完毕, 接下来给centos系统进行一些简单的配置

这里没有创建用户, 你们想创建的话,也可以。

设置一下当前日期和时间

我这里因为内存不够,所以kdump无法启用, 如果你们的内存够的话,就选择启用(默认), 然后点击完成

进入centos后发现无法从windows复制内容到centos

解决办法安装VMware Tools

进入centos, 更改centos主机名

vi /etc/sysconfig/network

重启,然后执行hostname, 会发现主机名更改成功

设置网络映射 vi /etc/hosts

通过ping centos_02.com 检查是否设置成功

编辑DNS解析配置文件vi /etc/sysconfig/network-scripts/ifcfg-eth0

编辑本地hosts文件,添加到此虚拟机的DNS映射

hosts文件位置:C:\Windows\System32\drivers\etc

三。centos上安装hadoop

  • 在/opt/下创建以下四个文件夹 software moduels datas tools

  • 使用xshell上传JDKhadoop压缩包到/opt/software/

  • 解压jdk和hadoop压缩包到/opt/moduels/

    tar -zxf ../software/jdk-8u162-linux-x64.tar.gz -C ./

    tar -zxf ../software/hadoop-2.5.0-cdh5.3.6.tar.gz -C ./

  • 编辑selinux 文件,将SELINUX改为disabled

vi /etc/sysconfig/selinux

  • 关闭防火墙

service iptables status 查看防火墙状态

service iptables stop 关闭防火墙

chkconfig iptables off禁止防火墙开机自启动

  • 配置JDK

查看是否自带JDK:rpm -qa | grep java

因为我们要的不是openjdk,所以删掉这里所有的openjdk,用我们自己下载的 jdk, 卸载命令:rpm -e --nodeps <文件名>

编辑profile文件, 配置JDK路径( vi /etc/profile)。
在文件的末尾添加
export JAVA_HOME=/opt/moduels/jdk1.8.0_162
export PATH="$PATH:$JAVA_HOME/bin"
运行:source /etc/profile 使配置生效
最后通过Java -version进行验证

  • 配置Hadoop

首先在centos桌面上建立startHDFS.bat,和stopHDFS.bat文件。留待以后使用 startHDFS.bat文件的内容为

 ../../opt/moduels/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh start namenode
 ../../opt/moduels/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh start datanode
 ../../opt/moduels/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh start secondarynamenode
 ../../opt/moduels/hadoop-2.5.0-cdh5.3.6/sbin/mr-jobhistory-daemon.sh start historyserver
 ../../opt/moduels/hadoop-2.5.0-cdh5.3.6/sbin/yarn-daemon.sh start resourcemanager
 ../../opt/moduels/hadoop-2.5.0-cdh5.3.6/sbin/yarn-daemon.sh start nodemanager
echo ****启动的服务有****
jps

stopHDFS.bat文件的内容为

 ../../opt/moduels/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh stop namenode
 ../../opt/moduels/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh stop datanode
 ../../opt/moduels/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh stop secondarynamenode
 ../../opt/moduels/hadoop-2.5.0-cdh5.3.6/sbin/mr-jobhistory-daemon.sh stop historyserver
 ../../opt/moduels/hadoop-2.5.0-cdh5.3.6/sbin/yarn-daemon.sh stop resourcemanager
 ../../opt/moduels/hadoop-2.5.0-cdh5.3.6/sbin/yarn-daemon.sh stop nodemanager
echo ***关闭一些服务后***
jps

Hadoop在文章开头已经上传过了, 它位于/opt/moduels/hadoop-2.5.0-cdh5.3.6
1.删除/opt/moduels/hadoop-2.5.0-cdh5.3.6/share/doc/下的所有文件,这一步不是必须的,只是因为这里面的东西非常大,而我们又用不上,删除可以避免浪费不必要的空间。
2.编辑hadoop安装目录下etc/hadoop/hadoop-env.sh,更改JAVA_HOME路径

3.编辑hadoop安装目录下etc/hadoop/mapred-env.sh,更改JAVA_HOME路径

4.编辑hadoop安装目录下etc/hadoop/yarn-env.sh,更改JAVA_HOME路径

5.编辑Hadoop安装目录下的etc/hadoop/core-site.xml文件

<configuration>
    <property>
        <name>fs.defaultFS</name>不变
        <value>hdfs://centos_02.com:9007</value>变
    </property>
    <!--用来指定使用hadoop时产生文件的存放目录-->
    <property>
        <name>hadoop.tmp.dir</name>不变
        <value>/opt/moduels/hadoop-2.5.0-cdh5.3.6/data/temp</value>根据安装路径的不同会有所变化
    </property>
</configuration>

6.编辑Hadoop安装目录下的etc/hadoop/hdfs-site.xml文件

<configuration>
    <property>
        <name>dfs.replication</name>不变
        <value>1</value>不变
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>不变
        <value>centos_02.com:50090</value>变
    </property>
   <property>
        <name>dfs.permissions</name>  
        <value>false</value> 允许访问hdfs
 </property>
</configuration>

6.编辑Hadoop安装目录下的etc/hadoop/slaves文件,填写主机名

7.hadoop安装目录下进行格式化 bin/hdfs namenode -format

8.启动namenode, secondarynamenode,和datanode,  并执行jps查看是否启动成功
在安装目录下依次执行以下三条命令
sbin/hadoop-daemon.sh start namenode
sbin/hadoop-daemon.sh start datanode
sbin/hadoop-daemon.sh start secondarynamenode
jps

9.通过centos02.com:50070可访问到页面

10.创建lee文件夹, Hadoop安装目录下执行 bin/hdfs dfs -mkdir -p lee
访问centos02.com:50070,可看到lee文件

11.上传文件,Hadoop安装目录下执行
bin/hdfs dfs -put etc/hadoop/core-site.xml /user/root/lee

12.读取文件, bin/hdfs dfs -text /user/root/lee/core-site.xml

13.下载文件,bin/hdfs dfs -get /user/root/lee/core-site.xml /home

14.此时可以进入centos02.com:50090

  • 配置mapreduce
1.在Hadoop安装目录下执行
mv etc/hadoop/mapred-site.xml.template  etc/hadoop/mapred-site.xml
vi etc/hadoop/mapred-site.xml 
更改文件为以下内容
<configuration>
       <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
       <property>
                       <name>mapreduce.jobhistory.address</name>
                        <value>centos02.com:10020</value>
         </property>
         <property>
                  <name>mapreduce.jobhistory.webapp.address</name>
                  <value>centos02.com:19888</value>
         </property>

</configuration>

2.在Hadoop安装目录下执行
vi etc/hadoop/yarn-site.xml 
更改文件为以下内容
<configuration>

<!-- Site specific YARN configuration properties -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>


   <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>centos02.com</value>
    </property>

           <property>
                   <name>yarn.log-aggregation-enable</name>
                   <value>true</value>
            </property>
   <property>
           <name>yarn.log-aggregation.retain-seconds</name>
           <value>604800</value>
     </property>

</configuration>
3.启动resourcemanager, nodemanager
Hadoop安装目录下执行
sbin/yarn-daemon.sh start resourcemanager
sbin/yarn-daemon.sh start nodemanager
并用jps命令进行检验

4.此时centos02.com:8088是可以访问的

  • 现在跑一个单词统计的任务 首先建立/opt/datas/file.input文件,内容在网上随便搜一遍英语文章放里面就好
1.创建文件
bin/hdfs dfs -mkdir -p mapreduce/input
2.上传文件
bin/hdfs dfs -put /opt/datas/file.input /user/root/mapreduce/input
3.在yarn上运行的脚本必须打包成jar包,所以执行以下命令
bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0-cdh5.3.6.jar wordcount /user/root/mapreduce/input /user/root/mapreduce/output
4.打开centos02.com,点击
Utilities->Browse the file system->user->root->mapreduce->output
可看到执行后输出的文件
5.通过bin/hdfs dfs -text /user/root/mapreduce/output/p* 可查看结果

6.打开centos02.com:8088,可看到这里生成了一条记录

7.执行sbin/mr-jobhistory-daemon.sh start historyserver开启historyserver服务

eclipse上运行mapReduce项目, 并将文件输出到HDFS中

  • 配置hadoop的环境变量
  • 配置jdk的环境变量
  • 官网下载eclipse Java版
  • 打开eclipse window ->> show view ->>Other->> Map/Reduce locations 然后新建location

以下这个样子则代表连接centos上的hdfs成功

  • 从centos导出hadoop安装包放到本地, 并在引入到eclipse中 点击windows=>preferences

package hdfs; //所在的目录名字

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 CountMapReduce {


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(otherArgs.length);
System.err.println("Usage: wordcount <in> <out>");
System.exit(2);
}
Job job = new Job(conf, "word count");
job.setJarByClass(CountMapReduce.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
  • 新建Hadoop项目, 并引入CountMapReduce.java

  • 在eclipse中引入Hadoop的所有依赖包,方法请自行百度
  • 运行,请右键CountMapReduce.java,点击Run as=>run Configurations, 选择Arguments选项框, 来给CountMapReduce.java配置输入输出地址

eclipse 搭建hadoop环境时遇到的问题,及解决方法

问题1

java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0

  • 解决方法
拷贝
hadoop-2.5.0-cdh5.3.6\src\hadoop-common-project\hadoop-common\src\main\java\org\apache\hadoop\io\nativeio文件夹下的NativeIO.java到项目中,并修改572行为 return true;

问题二 tmp无权限

  • 解决方法
修改centos上的hdfs-site.xml加上以下内容 
<property> 
<name>dfs.permissions</name> 
<value>false</value> 
</property>