[ Hadoop ] 单机伪集群配置试验和分析

同步发在:java

https://evergreen-tree.github.io/articles/2016-05/daily-hadoop-singleNode-setupnode

 

如下内容摘自网路:linux

Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 用户能够在不了解分布式底层细节的状况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。git

Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFSHDFS有高容错性的特色,而且设计用来部署在低廉的(low-cost)硬件上;并且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,能够以流的形式访问(streaming access)文件系统中的数据。github

Hadoop的框架最核心的设计就是:HDFSMapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。。正则表达式

从网络上摘抄出来的内容看出来,hadoop的确已经彻底造成了本身的体系。apache

从准备开始学习hadoop到真正开始使用hadoop的过程当中感受本身走了不少弯路,其中最主要的一个就是一直以来把hadoop当成了一款开源软件来进行学习,开源软件学习的过程通常是经过阅读tutorial(说明书)来进行最初的设定,而且完成最基本的接入操做,而后逐步深刻,阅读和使用分布式的配置,阅读和使用更多的feature。例如学习activeMQ,就能够经过阅读user guide来完成入门,而后经过阅读配置部分加java的demo,基本完成对于activemq的设定和使用,但是这一招在面对hadoop的时候失效了。windows

为何失效?这是个让我很头痛的问题,后来通过一系列的学习和分析终于对hadoop有所掌握以后发现hadoop实际上不是一款开源软件,而是一个分布式运算的体系或者平台,咱们能够把hadoop认为是一种分布式运算的操做系统,提供了不少底层的API的定义,而后在hadoop这个体系的内部呢,有不少的开源软件的实现,好比mapreduce,好比hdfs,好比yarn等等,这些软件被集成在hadoop平台内部,从而经过hadoop平台的分配掉用来完成真正的工做。固然了上面的说法可能不尽准确,可是这样进行思考可让你更快的学会使用hadoop。网络

经过上面的说法咱们能够制定接下里的方向,操做系统咱们要学习的固然是命令了,就是hadoop基本的CLI的命令(具体的命令见附件部分)。经过这一系列的命令咱们能够操做在hadoop这个系统中的文件,以及执行一些特定的操做,甚至于运行咱们本身编写的软件(如jar命令)。架构

学习完操做系统,接下来要想作事情就须要学习运行在操做系统上面的软件了,好比咱们的硬盘存储HDFS,好比咱们的资源管理和计算操做软件YARN,经过学习逐渐的发觉,学习hadoop其实就是学习HDFS跟MAPREDUCE的过程,由于实际上启动hadoop就是启动hadoop的存储并运行分布式运算的过程。

扯了这么多,咱们如今先回来感觉一把hadoop的魅力:

首先要说明一点的就是hadoop的更新实在太快了,因此网络上面不少的文章已经不是特别的准确,若是须要阅读相关的文档,英文够好的话建议直接阅读发行包里面的文档,它就在你下载的发行包的share/doc底下。

另外不建议你们再windows下玩儿hadoop,有条件的最好安装linux操做系统,或者使用虚拟机,没有条件的也建议使用cygwin而不是在windows下使用bat进行操做。

单点启动方式

hadoop下载完成以后并非说下载了操做系统,而后须要安装软件,它的软件是集成在里面的。好比咱们下载的2.6.4的发型包里面就是集成了HDFS跟YARN的。

hadoop下载完成以后,不须要任何的配置便可以单点方式运行,这时候hadoop并不会启动hdfs跟yarn或者maprduce,而仅仅以单一的java进程来处理你的命令。

$ mkdir input
  $ cp etc/hadoop/*.xml input
  $ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jar grep input output 'dfs[a-z.]+'
  $ cat output/*

上面的命令可让你体验一下hadoop竟然是能够运行的,惟一的前提条件是你要安装过JAVA,而且配置了JAVA_HOME.

简单介绍一下上面的命令所体现出来的内容:

  1. mdkir和cp部分是新建一个来源文件目录
  2. 紧跟其后的hadoop jar命令,指定hadoop装载本地的一个jar文件而且以mapreduce的方式运行该jar中的mapreduce对象(具体该jar怎么被建立出来后面的章节会介绍)。
  3. grep命令是demo里面所须要的运行时参数,input是输入文件的路径,output是结果的输出路径,最后的正则表达式是grep的规则。也就是说但愿hadoop将input中全部的文件经过提供的正则表达式的规则过滤到output中。
  4. 最后是检查在output中到底有什么内容:

运行cat以后的结果以下(看起来全部的文件中存在dfs[a-z.]+正则匹配的只是出现了一次,此次叫作dfsadmin)

1       dfsadmin

伪分布式单机启动

上面的启动方式固然不够炫酷,并且单机运行的时候实际上除了有个结果以外并无法让你看到任何hadoop的痕迹,因此hadoop提供了第二种单机运行的方式,伪分布式,在伪分布式中,hadoop将会启动两个进程,一个为hdfs进程,一个为mapreduce的管理进程,若是已经配置了yarn的,那么将会启动的就是yarn的进程。

启动一个分布式的hadoop的过程其实就是分别启动hadoop的四个基本元素的过程,即

  • NameNode
  • DataNode
  • ResourceManager
  • NodeManager

其中,NameNode & DataNode在默认的发行版里面是经过start-dfs来完成,即NameNode&DataNode是HDFS的组成部分,而ResourceManager&NodeManager发行版里面有默认的实现以及yarn,鉴于官方的文档也建议使用yarn来进行资源管理,咱们的配置也使用yarn进行配置。

依次更改下面的配置文件:

etc/hadoop/core-site.xml(基本配置,这个配置文件在集群里面全部的机器应该配置为相同的): ```xml

fs.defaultFS hdfs://localhost:9000

etc/hadoop/hdfs-site.xml(在NameNode/DataNode不一样的配置文件,咱们如今经过一台机器进行模拟,因此不须要进行多余的配置):
```xml
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>

至此咱们没有使用yarn进行mapreduce的操做,而是使用hadoop默认的mapreduce,若是须要使用其余的mapreduce实现,那么须要修改: etc/hadoop/mapred-site.xml

这个文件的修改咱们接下里会说。

完成上面两个文件的修改以后,咱们就拥有了一个伪分布式的环境,在这个环境里面NameNode,DataNode,ResourceManger跟NodeManager都分别以独立的进程来运行。

接下来咱们来运行咱们的hadoop操做系统。

由于hadoop是经过ssh来进行各个节点的启动和中止操做的,因此须要ssh的支持,为了简单起见咱们能够设置ssh免密码登录,具体的原理请参照https://evergreen-tree.github.io/articles/2016-05/daily-ssh-authorized-keys

咱们本地须要设置的是对于localhost的免密码登录:

依次执行下面的命令便可

$ ssh localhost
If you cannot ssh to localhost without a passphrase, execute the following commands:

  $ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
  $ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
  • 第一步,格式化硬盘(格式化NameNode)
    • bin/hdfs namenode -format
  • 第二步,启动硬盘管理系统(启动hdfs)
    • sbin/start-dfs.sh
    • 硬盘(HDFS)管理器启动以后,有一个UI可让你更加直观的看到本地hdfs里面的内容,访问方式以下:
    • http://localhost:50070/
  • 第三步,硬盘 (HDFS)启动成功以后经过操做系统(hadoop)来向硬盘写入数据以备计算使用。(这一步官方的文档存在bug,最好使用我给的命令)
    • bin/hdfs dfs -mkdir /user - 建立工做目录
    • bin/hdfs dfs -mkdir /user/test - 建立工做目录,按照官方文档,这里面新建的目录应该是当前linux系统登陆的用户,为了区别起见,咱们使用test
    • bin/hdfs dfs -put etc/hadoop /user/test/input - 将本地文件导入到hadoop系统中的HDFS
  • 第四步,从新运行咱们在单点模式的时候运行的JOB
    • bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jar grep /user/test/input output 'dfs[a-z.]+'
    • 在上面单点运行的时候结果会直接被写入到运行命令的当前目录的output文件夹,可是在使用hadoop执行命令的时候,命令实际上是被运行在了hadoop系统里面,因此结果被写入到了hadoop平台的output文件夹里面
  • 检查成果
    • bin/hdfs dfs -cat output/*
    • 最终的结果会被写入到/user/root/output默认是linux的登录用户的用户名。
  • 若是不想继续了请关闭sbin/stop-dfs.sh

对上面的操做进行一些分析:

启动dfs以后,其实在后台启动了NameNode跟SecondNameNode(secondNameNode是NameNode的容灾)

root     24225     1 17 14:28 ?        00:00:07 /etc/alternatives/java_sdk/bin/java -Dproc_namenode -Xmx1000m -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/opt/hadoop-2.6.4/logs -Dhadoop.log.file=hadoop.log -Dhadoop.home.dir=/opt/hadoop-2.6.4 -Dhadoop.id.str=root -Dhadoop.root.logger=INFO,console -Djava.library.path=/opt/hadoop-2.6.4/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/opt/hadoop-2.6.4/logs -Dhadoop.log.file=hadoop-root-namenode-localhost.localdomain.log -Dhadoop.home.dir=/opt/hadoop-2.6.4 -Dhadoop.id.str=root -Dhadoop.root.logger=INFO,RFA -Djava.library.path=/opt/hadoop-2.6.4/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -Dhadoop.security.logger=INFO,RFAS -Dhdfs.audit.logger=INFO,NullAppender -Dhadoop.security.logger=INFO,RFAS -Dhdfs.audit.logger=INFO,NullAppender -Dhadoop.security.logger=INFO,RFAS -Dhdfs.audit.logger=INFO,NullAppender -Dhadoop.security.logger=INFO,RFAS org.apache.hadoop.hdfs.server.namenode.NameNode
root     24326     1 21 14:28 ?        00:00:08 /etc/alternatives/java_sdk/bin/java -Dproc_datanode -Xmx1000m -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/opt/hadoop-2.6.4/logs -Dhadoop.log.file=hadoop.log -Dhadoop.home.dir=/opt/hadoop-2.6.4 -Dhadoop.id.str=root -Dhadoop.root.logger=INFO,console -Djava.library.path=/opt/hadoop-2.6.4/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/opt/hadoop-2.6.4/logs -Dhadoop.log.file=hadoop-root-datanode-localhost.localdomain.log -Dhadoop.home.dir=/opt/hadoop-2.6.4 -Dhadoop.id.str=root -Dhadoop.root.logger=INFO,RFA -Djava.library.path=/opt/hadoop-2.6.4/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -server -Dhadoop.security.logger=ERROR,RFAS -Dhadoop.security.logger=ERROR,RFAS -Dhadoop.security.logger=ERROR,RFAS -Dhadoop.security.logger=INFO,RFAS org.apache.hadoop.hdfs.server.datanode.DataNode
root     24529     1 17 14:28 ?        00:00:05 /etc/alternatives/java_sdk/bin/java -Dproc_secondarynamenode -Xmx1000m -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/opt/hadoop-2.6.4/logs -Dhadoop.log.file=hadoop.log -Dhadoop.home.dir=/opt/hadoop-2.6.4 -Dhadoop.id.str=root -Dhadoop.root.logger=INFO,console -Djava.library.path=/opt/hadoop-2.6.4/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/opt/hadoop-2.6.4/logs -Dhadoop.log.file=hadoop-root-secondarynamenode-localhost.localdomain.log -Dhadoop.home.dir=/opt/hadoop-2.6.4 -Dhadoop.id.str=root -Dhadoop.root.logger=INFO,RFA -Djava.library.path=/opt/hadoop-2.6.4/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -Dhadoop.security.logger=INFO,RFAS -Dhdfs.audit.logger=INFO,NullAppender -Dhadoop.security.logger=INFO,RFAS -Dhdfs.audit.logger=INFO,NullAppender -Dhadoop.security.logger=INFO,RFAS -Dhdfs.audit.logger=INFO,NullAppender -Dhadoop.security.logger=INFO,RFAS org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode

进入tmp目录会发现有下面的目录结构:

[root@localhost tmp]# ll
drwxr-xr-x. 3 root root 4096 May 25 14:28 hadoop-root
-rw-r--r--. 1 root root    6 May 25 14:28 hadoop-root-datanode.pid
-rw-r--r--. 1 root root    6 May 25 14:28 hadoop-root-namenode.pid
-rw-r--r--. 1 root root    6 May 25 14:28 hadoop-root-secondarynamenode.pid
drwxr-xr-x. 2 root root 4096 May 25 14:28 hsperfdata_root
drwxr-xr-x. 4 root root 4096 May 25 14:28 Jetty_0_0_0_0_50070_hdfs____w2cu08
drwxr-xr-x. 4 root root 4096 May 25 14:28 Jetty_0_0_0_0_50075_datanode____hwtdwq
drwxr-xr-x. 4 root root 4096 May 25 14:28 Jetty_0_0_0_0_50090_secondary____y6aanv

经过UI界面(http://10.132.65.77:50070/)(个人UI)咱们能够看到如今机器上面已经启动了一个datanode:

而后执行完全部的命令以后咱们看到的结果以下;

[root@localhost hadoop]# bin/hdfs dfs -cat output/*
16/05/25 14:34:35 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
cat: `output/output': No such file or directory
6       dfs.audit.logger
4       dfs.class
3       dfs.server.namenode.
2       dfs.period
2       dfs.audit.log.maxfilesize
2       dfs.audit.log.maxbackupindex
1       dfsmetrics.log
1       dfsadmin
1       dfs.servers
1       dfs.replication
1       dfs.file

至此咱们已经完成了经过一台机器启动NameNode & DataNode的过程,secondNameNode的启动你们能够暂时先忽略掉,咱们看到若是不想要使用特定的mapreduce方案,那么只要启动namenode跟datanode便可。

经过刚才的设置,咱们已经搭建好一个基本的运行环境,若是你刚才设置core-site.xml的时候绑定的是0.0.0.0那么你如今已经能够经过下面的java方法来远程链接你的hdfs而且进行一些简单的操做了!

package distributed.lock.hadoopJob;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

import java.io.InputStream;
import java.net.URI;

public class HDFSTest {
	public static void main(String[] args) throws Exception {
		String uri = "hdfs://10.132.65.77:9000/";
		Configuration config = new Configuration();
		FileSystem fs = FileSystem.get(URI.create(uri), config);

		FileStatus[] statuses = fs.listStatus(new Path("/user/root"));
		for (FileStatus status : statuses) {
			System.out.println(status);
		}

		FSDataOutputStream os = fs.create(new Path("/user/root/input/test.log"));
		os.write("Hello World!".getBytes());
		os.flush();
		os.close();

		InputStream is = fs.open(new Path("/user/root/test.log"));
		IOUtils.copyBytes(is, System.out, 1024, true);
	}
}

上面的类我在执行的时候发生了一些小问题,不过用来验证能够进行链接操做仍是蛮好的。不深究了。

使用yarn进行mapreduce

在使用yarn以前,建议首先删除掉原来的/tmp的全部文件而且从新format

依次修改下面的配置文件:

etc/hadoop/mapred-site.xml - 指定使用yarn做为mapreduce的调度者

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

etc/hadoop/yarn-site.xml

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
</configuration>

而后启动yarn便可 sbin/start-yarn.sh(上面的dfs须要重启)

启动yarn以后,会发觉多出来两个进程(ResourceManager跟NodeManager):

root     29518     1 99 15:08 pts/2    00:00:09 /etc/alternatives/java_sdk/bin/java -Dproc_resourcemanager -Xmx1000m -Dhadoop.log.dir=/opt/hadoop-2.6.4/logs -Dyarn.log.dir=/opt/hadoop-2.6.4/logs -Dhadoop.log.file=yarn-root-resourcemanager-localhost.localdomain.log -Dyarn.log.file=yarn-root-resourcemanager-localhost.localdomain.log -Dyarn.home.dir= -Dyarn.id.str=root -Dhadoop.root.logger=INFO,RFA -Dyarn.root.logger=INFO,RFA -Djava.library.path=/opt/hadoop-2.6.4/lib/native -Dyarn.policy.file=hadoop-policy.xml -Dhadoop.log.dir=/opt/hadoop-2.6.4/logs -Dyarn.log.dir=/opt/hadoop-2.6.4/logs -Dhadoop.log.file=yarn-root-resourcemanager-localhost.localdomain.log -Dyarn.log.file=yarn-root-resourcemanager-localhost.localdomain.log -Dyarn.home.dir=/opt/hadoop-2.6.4 -Dhadoop.home.dir=/opt/hadoop-2.6.4 -Dhadoop.root.logger=INFO,RFA -Dyarn.root.logger=INFO,RFA -Djava.library.path=/opt/hadoop-2.6.4/lib/native -classpath /opt/hadoop-2.6.4/etc/hadoop:/opt/hadoop-2.6.4/etc/hadoop:/opt/hadoop-2.6.4/etc/hadoop:/opt/hadoop-2.6.4/share/hadoop/common/lib/*:/opt/hadoop-2.6.4/share/hadoop/common/*:/opt/hadoop-2.6.4/share/hadoop/hdfs:/opt/hadoop-2.6.4/share/hadoop/hdfs/lib/*:/opt/hadoop-2.6.4/share/hadoop/hdfs/*:/opt/hadoop-2.6.4/share/hadoop/yarn/lib/*:/opt/hadoop-2.6.4/share/hadoop/yarn/*:/opt/hadoop-2.6.4/share/hadoop/mapreduce/lib/*:/opt/hadoop-2.6.4/share/hadoop/mapreduce/*:/etc/alternatives/java_sdk/lib/tools.jar:/contrib/capacity-scheduler/*.jar:/contrib/capacity-scheduler/*.jar:/contrib/capacity-scheduler/*.jar:/opt/hadoop-2.6.4/share/hadoop/yarn/*:/opt/hadoop-2.6.4/share/hadoop/yarn/lib/*:/opt/hadoop-2.6.4/etc/hadoop/rm-config/log4j.properties org.apache.hadoop.yarn.server.resourcemanager.ResourceManager

root     29623     1 99 15:08 ?        00:00:09 /etc/alternatives/java_sdk/bin/java -Dproc_nodemanager -Xmx1000m -Dhadoop.log.dir=/opt/hadoop-2.6.4/logs -Dyarn.log.dir=/opt/hadoop-2.6.4/logs -Dhadoop.log.file=yarn-root-nodemanager-localhost.localdomain.log -Dyarn.log.file=yarn-root-nodemanager-localhost.localdomain.log -Dyarn.home.dir= -Dyarn.id.str=root -Dhadoop.root.logger=INFO,RFA -Dyarn.root.logger=INFO,RFA -Djava.library.path=/opt/hadoop-2.6.4/lib/native -Dyarn.policy.file=hadoop-policy.xml -server -Dhadoop.log.dir=/opt/hadoop-2.6.4/logs -Dyarn.log.dir=/opt/hadoop-2.6.4/logs -Dhadoop.log.file=yarn-root-nodemanager-localhost.localdomain.log -Dyarn.log.file=yarn-root-nodemanager-localhost.localdomain.log -Dyarn.home.dir=/opt/hadoop-2.6.4 -Dhadoop.home.dir=/opt/hadoop-2.6.4 -Dhadoop.root.logger=INFO,RFA -Dyarn.root.logger=INFO,RFA -Djava.library.path=/opt/hadoop-2.6.4/lib/native -classpath /opt/hadoop-2.6.4/etc/hadoop:/opt/hadoop-2.6.4/etc/hadoop:/opt/hadoop-2.6.4/etc/hadoop:/opt/hadoop-2.6.4/share/hadoop/common/lib/*:/opt/hadoop-2.6.4/share/hadoop/common/*:/opt/hadoop-2.6.4/share/hadoop/hdfs:/opt/hadoop-2.6.4/share/hadoop/hdfs/lib/*:/opt/hadoop-2.6.4/share/hadoop/hdfs/*:/opt/hadoop-2.6.4/share/hadoop/yarn/lib/*:/opt/hadoop-2.6.4/share/hadoop/yarn/*:/opt/hadoop-2.6.4/share/hadoop/mapreduce/lib/*:/opt/hadoop-2.6.4/share/hadoop/mapreduce/*:/etc/alternatives/java_sdk/lib/tools.jar:/contrib/capacity-scheduler/*.jar:/contrib/capacity-scheduler/*.jar:/opt/hadoop-2.6.4/share/hadoop/yarn/*:/opt/hadoop-2.6.4/share/hadoop/yarn/lib/*:/opt/hadoop-2.6.4/etc/hadoop/nm-config/log4j.properties org.apache.hadoop.yarn.server.nodemanager.NodeManager

tmp下面也增长了相应的pid等文件:

drwxr-xr-x. 4 root root 4096 May 25 15:08 hadoop-root
-rw-r--r--. 1 root root    6 May 25 15:07 hadoop-root-datanode.pid
-rw-r--r--. 1 root root    6 May 25 15:07 hadoop-root-namenode.pid
-rw-r--r--. 1 root root    6 May 25 15:07 hadoop-root-secondarynamenode.pid
drwxr-xr-x. 2 root root 4096 May 25 15:08 hsperfdata_root
drwxr-xr-x. 4 root root 4096 May 25 15:07 Jetty_0_0_0_0_50070_hdfs____w2cu08
drwxr-xr-x. 4 root root 4096 May 25 15:07 Jetty_0_0_0_0_50075_datanode____hwtdwq
drwxr-xr-x. 4 root root 4096 May 25 15:07 Jetty_0_0_0_0_50090_secondary____y6aanv
drwxr-xr-x. 5 root root 4096 May 25 15:08 Jetty_0_0_0_0_8042_node____19tj0x
drwxr-xr-x. 5 root root 4096 May 25 15:08 Jetty_0_0_0_0_8088_cluster____u0rgz3
-rw-r--r--. 1 root root    6 May 25 15:08 yarn-root-nodemanager.pid
-rw-r--r--. 1 root root    6 May 25 15:08 yarn-root-resourcemanager.pid
相关文章
相关标签/搜索