同步发在:java
https://evergreen-tree.github.io/articles/2016-05/daily-hadoop-singleNode-setupnode
如下内容摘自网路:linux
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 用户能够在不了解分布式底层细节的状况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。git
Hadoop实现了一个分布式文件系统(
Hadoop Distributed File System
),简称HDFS
。HDFS
有高容错性的特色,而且设计用来部署在低廉的(low-cost
)硬件上;并且它提供高吞吐量(high throughput
)来访问应用程序的数据,适合那些有着超大数据集(large data set
)的应用程序。HDFS放宽了(relax)POSIX的要求,能够以流的形式访问(streaming access)文件系统中的数据。github
Hadoop的框架最核心的设计就是:
HDFS
和MapReduce
。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.
简单介绍一下上面的命令所体现出来的内容:
运行cat以后的结果以下(看起来全部的文件中存在dfs[a-z.]+正则匹配的只是出现了一次,此次叫作dfsadmin)
1 dfsadmin
上面的启动方式固然不够炫酷,并且单机运行的时候实际上除了有个结果以外并无法让你看到任何hadoop的痕迹,因此hadoop提供了第二种单机运行的方式,伪分布式,在伪分布式中,hadoop将会启动两个进程,一个为hdfs进程,一个为mapreduce的管理进程,若是已经配置了yarn的,那么将会启动的就是yarn的进程。
启动一个分布式的hadoop的过程其实就是分别启动hadoop的四个基本元素的过程,即
其中,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
bin/hdfs namenode -format
sbin/start-dfs.sh
bin/hdfs dfs -mkdir /user
- 建立工做目录bin/hdfs dfs -mkdir /user/test
- 建立工做目录,按照官方文档,这里面新建的目录应该是当前linux系统登陆的用户,为了区别起见,咱们使用testbin/hdfs dfs -put etc/hadoop /user/test/input
- 将本地文件导入到hadoop系统中的HDFSbin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jar grep /user/test/input output 'dfs[a-z.]+'
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以前,建议首先删除掉原来的/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