一.简单介绍
二.安装部署
三.执行hadoop样例并測试部署环境
四.注意的地方
一.简单介绍
Hadoop是一个由Apache基金会所开发的分布式系统基础架构,Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;并且它提供高吞吐量(high throughput)来訪问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,能够以流的形式訪问(streaming access)文件系统中的数据,则MapReduce为海量的数据提供了计算。Hadoop easy开发和执行处理大规模数据的平台。
HDFS是Java语言开发。因此不论什么支持Java的机器都可以部署Namenode或Datanode,HDFS採用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。Namenode是一个中心server,负责管理文件系统的名字空间(namespace)以及client对文件的訪问。集群中的Datanode通常是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户可以以文件的形式在上面存储数据。从内部看,一个文件事实上被分成一个或多个数据块。这些块存储在一组Datanode上。Namenode运行文件系统的名字空间操作。比方打开、关闭、重命名文件或文件夹。
它也负责确定数据块到详细Datanode节点的映射。Datanode负责处理文件系统client的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。如图所看到的所看到的:
Hadoop Map/Reduce是一个使用简易的软件框架,基于它写出来的应用程序可以执行在由上千个商用机器组成的大型集群上,并以一种可靠容错的方式并行处理上T级别的数据集。一个Map/Reduce 作业(job) 一般会把输入的数据集切分为若干独立的数据块,由 map任务(task)以全然并行的方式处理它们。
框架会对map的输出先进行排序。 然后把结果输入给reduce任务。通常作业的输入和输出都会被存储在文件系统中。
整个框架负责任务的调度和监控,以及又一次执行已经失败的任务。
Hadoop是一个可以让用户轻松架构和使用的分布式计算平台。用户可以轻松地在Hadoop上开发和执行处理海量数据的应用程序。
它主要有下面几个长处:
1.高可靠性。Hadoop按位存储和处理数据的能力值得人们信赖。
2.高扩展性。Hadoop是在可用的计算机集簇间分配数据并完毕计算任务的,这些集簇能够方便地扩展到数以千计的节点中。
3.高效性。Hadoop可以在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度很快。
4.高容错性。
Hadoop可以自己主动保存数据的多个副本,而且可以自己主动将失败的任务又一次分配。
5.低成本。与一体机、商用数据仓库以及QlikView、Yonghong Z-Suite等数据集市相比。hadoop是开源的,项目的软件成本因此会大大减少。
Hadoop 伪分布式模式是在单机上模拟 Hadoop 分布式。条件有限。所以linux虚拟机上部署Hadoop 伪分布式模式来模拟 Hadoop 分布式。
二.安装部署
Linux虚拟机上安装JDK配置。这里就不介绍,我之前文章有介绍过了。
第一步:ssh无password验证配置
1.查看一下SSH是否有安装
2.基于空口令创建一个新的SSH密钥,启用无password登录
#ssh-keygen -t rsa -P '' -f~/.ssh/id_rsa
#cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys
3.測试一下是否须要password登陆
#ssh localhost 如图所看到的:
这说明已经成功安装,第一次登录时会询问你是否继续链接,输入yes就可以进入。
说明:
由于在Hadoop的安装过程中,假设不配置无password登录,每次启动Hadoop。须要输入password登陆到DataNode,我们一般会做集群。所以这样就不方便我们操作。
第二步:部署hadoop
1.下载 http://hadoop.apache.org/
我们这边下载的是hadoop-2.6.0.tar.gz
2.mkdir /usr/local/hadoop
3.#tar -zxvf hadoop-2.6.0.tar.gz//解压
4.#vi /etc/profile //配置hadoop
export HADOOP_HOME=/usr/local/hadoop/hadoop-2.6.0
export PATH=$HADOOP_HOME/bin:$PATH
export HADOOP_LOG_DIR=${HADOOP_HOME}/logs
#source/etc/profile //使配置生效5.配置core-site.xml,hdfs-site.xml及mapred-site.xml
#cd hadoop-2.6.0//进入hadoop解压的文件夹
etc/hadoop/core-site.xml <configuration> <property> <name>fs.default.name</name> <value>hdfs://192.168.74.129:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/hadoop-2.6.0/tmp</value> </property> </configuration> etc/hadoop/hdfs-site.xml <configuration> <property> <name>dfs.name.dir</name> <value>/usr/local/hadoop/hadoop-2.6.0/hdfs/name</value> <description>对namenode存储路径</description> </property> <property> <name>dfs.data.dir</name> <value>/usr/local/hadoop/hadoop-2.6.0/hdfs/data</value> <description>对datanode存储路径</description> </property> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration> etc/hadoop/mapred-site.xml <configuration> <property> <name>mapred.job.tracker</name> <value>hdfs://192.168.74.129:9001</value> </property> <property> <name>mapred.local.dir</name> <value>/usr/local/hadoop/hadoop-2.6.0/mapred/local</value> <description>存储mapred自己使用的路径</description> </property> <property> <name>mapred.system.dir</name> <value>/usr/local/hadoop/hadoop-2.6.0/mapred/system</value> <description>存储mapred系统级别的路径。能够共享</description> </property> </configuration>6.改动hadoop-env.sh的jdk路径
#vi etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_67
7.#hadoop namenode -format //格式化HDFS文件系统以创建一个空大文件系统。
运行成功如图所看到的:
生成core-site.xml,hdfs-site.xml及mapred-site.xml相应的文件夹,如图所看到的:
第三步:启动hadoop服务
1.#sbin/start-all.sh //启动 sbin/stop-all.sh //关闭
2.#jps//验证一下
3.在浏览器查看hadoop信息
http://192.168.74.129:50070
http://192.168.74.129:8088 hadoop管理页面
4.能够在 cd /usr/local/hadoop/hadoop-2.6.0/logs 查看日志
三.执行hadoop样例并測试部署环境
1.我们从官方网的样例来执行一下,看看我们部署的hadoop环境是否正确,统计数代码例如以下:
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; 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(); Job job = Job.getInstance(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); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ?0 : 1); } }
上传到hadoop解压的文件夹,如图所看到的:
2.查看有没有文件夹
#hadoop fs –ls //刚部署完。我们还没创建文件夹,所以会显示没文件夹如图所看到的:
3.我们新建一个file0.txt文本,输入内容,也就是我们要统计的单词,如图所看到的:
4.创建输入和输出文件夹
先在hdfs上建个目录
#bin/hdfs dfs -mkdir –p /user/root/input
#bin/hdfs dfs -mkdir -p /user/root/output
5.把要统计的文本上传到hdfs的输入文件夹下
# bin/hdfs dfs -put/usr/local/hadoop/hadoop-2.6.0/test/* /user/root/input //把tes/file0文件上传到hdfs的/user/root/input中
6.查看
#bin/hdfs dfs -cat /user/root/input/file0
7.编译我们刚才写的统计Java类WordCount.java
#bin/hadoop com.sun.tools.javac.Main WordCount.java
8.编译好的WordCount.class创建一个 jar
jar cf wc.jar WordCount*.class
9.运行统计
#bin/hadoop jar wc.jar WordCount /user/root/input/user/root/output/count
10.查看输出output
#bin/hdfs dfs -cat/user/root/output/count/part-r-00000
四.注意的地方
1.#hadoop namenode -format格式化时,HostName配置不正确时,会报这个错误。如图所看到的:
分析:
#hsotname
这时在/etc/hosts文件里找不到相应的这个hostname
解决方法:
1)vi /etc/hosts //改动设置的ip
2)#vi /etc/sysconfig/network //改动hostname
3)/etc/rc.d/init.d/network restart //重新启动一下
假设没改动过来,就重新启动一下Linux虚拟机
2.#hadoop fs –ls会出现
Java HotSpot(TM) Server VM warning: Youhave loaded library/usr/local/hadoop/hadoop-2.6.0/lib/native/libhadoop.so.1.0.0 which might havedisabled stack guard. The VM will try to fix the stack guard now.
It's highly recommended that you fix thelibrary with 'execstack -c <libfile>', or link it with '-z noexecstack'.
解决:
#vi /etc/profile
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
#source /etc/profile
在运行一下hadoop fs –ls就不会出现这种问题,如图所看到的: