注:笔记有参考这篇文章,但实际还是碰到了不少坑,所以做了一些整理;程序来源于这篇文章,稍做了修改。
我安装的是oracleJDK 1.8
1.先将含有相关包的清单导入。
$ sudo add-apt-repository ppa:webupd8team/java
2.然后更新一下包列表。
$ sudo apt-get update
3.安装oracleJDK
$ sudo apt-get install oracle-java8-installer
4.最后会有个图形界面的安装程序,选择 [OK] -> [Yes] ,然后静候安装完毕即可。
我安装的是 hadoop 2.6.0(伪分布模式)
$ sudo useradd -m hadoop -s /bin/bash #创建hadoop用户,并使用/bin/bash作为shell
$ sudo passwd hadoop #为hadoop用户设置密码,之后需要连续输入两次密码
$ sudo adduser hadoop sudo #为hadoop用户增加管理员权限
$ su - hadoop #切换当前用户为用户hadoop
$ sudo apt-get update #更新hadoop用户的apt,方便后面的安装
之后的配置都在hadoop用户的状态下进行。
在集群中,Hadoop控制脚本依赖SSH来执行针对整个集群的操作,所以,需要安装SSH,但是,SSH远程登陆的时候,需要密码验证,为了方便,配置SSH无密码登录。
$ sudo apt-get install openssh-server #安装SSH server
$ ssh localhost #登陆SSH,第一次登陆输入yes
$ exit #退出登录的ssh localhost
$ cd ~/.ssh/ #如果没法进入该目录,执行一次ssh localhost
$ ssh-keygen -t rsa
输入完 $ ssh-keygen -t rsa 语句以后,需要连续敲击三次回车,如下图:
其中,第一次回车是让KEY存于默认位置,以方便后续的命令输入。第二次和第三次是确定passphrase,相关性不大。两次回车输入完毕以后,如果出现类似于下图所示的输出,即成功:
之后再输入:
$ cat ./id_rsa.pub >> ./authorized_keys #加入授权
$ ssh localhost
此时已不需密码即可登录localhost,并可见下图(如果失败则可以搜索SSH免密码登录来寻求答案)。以后都用这种方式登录即可。
先下载hadoop-2.6.0.tar.gz
进入下载目录,解压并安装
$ sudo tar -zxvf hadoop-2.6.0.tar.gz -C /usr/local #解压到/usr/local目录下
$ cd /usr/local
$ sudo mv hadoop-2.6.0 hadoop #重命名为hadoop
$ sudo chown -R hadoop ./hadoop #修改文件权限
给hadoop配置环境变量,编辑.bashrc文件
$ vi ~/.bashrc
将下面代码添加到.bashrc文件最后并保存。
export HADOOP_HOME=/usr/local/hadoop
export CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
执行使设置生效
$ source ~./bashrc
查看hadoop是否安装成功
$ hadoop version
Hadoop可以在单节点上以伪分布式的方式运行,Hadoop进程以分离的Java进程来运行,节点既作为NameNode也作为DataNode,同时,读取的是HDFS中的文件,需要对其进行配置。我的Hadoop的配置文件位 /usr/local/hadoop/etc/hadoop/ 中。
首先讲jdk路径添加到hadoop-env.sh配置文件中(/usr/local/hadoop/etc/hadoop/ 下,后面默认),我的jdk路径为/usr/lib/jvm/java-8-oracle , 将下面代码添加在hadoop-env.sh的最后
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
接下来需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。
修改core-site.xml文件:
<configuration>
<property>
<name>hadoop.tmp.dirname>
<value>file:/usr/local/hadoop/tmpvalue>
<description>Abase for other temporary directories.description>
property>
<property>
<name>fs.defaultFSname>
<value>hdfs://localhost:9000value>
property>
configuration>
修改文件 hdfs-site.xml:
<configuration>
<property>
<name>dfs.replicationname>
<value>1value>
property>
<property>
<name>dfs.namenode.name.dirname>
<value>file:/usr/local/hadoop/tmp/dfs/namevalue>
property>
<property>
<name>dfs.datanode.data.dirname>
<value>file:/usr/local/hadoop/tmp/dfs/datavalue>
property>
<property>
<name>dfs.permissionsname>
<value>falsevalue>
property>
configuration>
注:这里我添加了dfs.permissions设置false,因为后面在访问dfs的时候出现了用户权限的问题,所以我干脆将检查取消了。
配置完成后,在hadoop文件夹下执行,执行 NameNode 的格式化
$ cd /usr/local/hadoop #我的hadoop路径
$ ./bin/hdfs namenode -format #执行 NameNode 的格式化
启动namenode和datanode进程,并查看启动结果
$ ./sbin/start-dfs.sh
$ jps
启动完成后,可以通过命令 jps 来判断是否成功启动,若成功启动则会列出如下进程,如图所示: “NameNode”、”DataNode” 和 “SecondaryNameNode”
成功启动后,可以访问 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。
下载官网的installer
我的安装版本为 Eclipse IDE for Java EE Developers,直接点安装就可以了。
下载eclipse-hadoop插件
将插件文件hadoop-eclipse-plugin-2.6.0.jar 拷贝到eclipse安装目录下的dropins文件夹下。(挺多教程是放到plugins文件夹下,但是我放进去没反应)
选择菜单 window->Preference->Hadoop Map/Reduce,如图所示,设置hadoop的安装路径
选择菜单 Window->Show View->other->MapReduce Tools->MapReduce Locations 打开MapReduce窗口
在MapReduce Locations窗口右击新建一个location
作为刚起步的小白,我选择运行wordcount程序作为hadoop的第一个小程序作为入门。
程序来源于这篇文章,稍做了修改,这里只是运行了一下,对于细节和hadoop的机制还不是特别清楚,有待学习。
先在hdsf创建一个in文件夹并且上传一个简单的文本文件,作为程序的输入。
直接复制粘贴一个WordCount类,运行程序,代码如下
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.LongWritable;
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.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
import org.apache.hadoop.mapreduce.Reducer.Context;
public class WordCount {
// 继承Mapper类,Mapper类的四个泛型参数分别为:输入key类型,输入value类型,输出key类型,输出value类型
public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1); // output value
private Text word = new Text(); // output key
@Override
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
context.write(word, one);
}
}
}
// Reduce类,继承了Reducer类
public static class Reduce extends
Reducer<Text, IntWritable, Text, IntWritable> {
@Override
public void reduce(Text key, Iterable<IntWritable> values,
Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
context.write(key, new IntWritable(sum));
}
}
public static void main(String[] args) throws Exception {
Job job = new Job(); // 创建一个作业对象
job.setJarByClass(WordCount.class); // 设置运行/处理该作业的类
job.setJobName("WordCount");
FileInputFormat.addInputPath(job, new Path("hdfs://localhost:9000/in"));
FileOutputFormat.setOutputPath(job, new Path("hdfs://localhost:9000/out"));
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
运行结果可以在out文件夹下看到,这里可能需要刷新一下文件夹。
终于看到了运行结果,下面就可以继续hadoop的学习啦