您的位置:首页 > 运维架构

Hadoop笔记之一:安装单节点集群

2016-10-10 20:11 369 查看

Hadoop入坑

搞数据挖掘的还不会Hadoop/spark,感觉各种丢人,看了一眼天池的比赛,都不知道从哪儿下手,决定痛下决心搞一搞Hadoop,也算是渣硕的救赎吧。之前还在犹豫是从Hadoop开始还是从spark开始,虽然spark最近很流行,据说还有替代Hadoop的趋势,不过毕竟spark是在Hadoop之后的,吸取了Hadoop的一些优点,也提出了新的优点比如(RDD之类的),不过本渣硕还是决定从最开始的搞起,毕竟Hadoop是Map/Reduce的祖宗。

Hadoop的安装

根据官方教程,最开始从单节点的集群开始,按照官方文档来一步一步还是比较简单的,但是中间还是有一些坑,这个官方文档也没有指出来,作为新手还是折腾了一会儿。本篇笔记就记一下安装过程中的那些坑。

我是在Ubuntu虚拟机下装的Hadoop的,版本是Hadoop2.7.3稳定版。

安装平台

Hadoop可以安装在GNU/Linux上,当然也可以安装在windows上,但是需要安装cygwin,之前安装过觉得很麻烦,所以直接选择装在Ubuntu上,简单方便

安装要求

需要安装Java环境,都现在了基本上是JDK1.7或者JDK1.8吧

其次还需要安装ssh(用以连接Datanode以及NameNode之用)这个很重要

步骤

1)安装java环境(不说了)

2)安装ssh环境:

$ sudo apt-get install ssh
$ sudo apt-get install rsync


这里说个坑,之前我以为我的Ubuntu上有ssh,毕竟经常连服务器,不过在后面的安装过程中发现ssh localhost失效了,所以还是老老实实的装一下。

3)下载Hadoop安装包,网址

4)解压安装包,找到 etc/hadoop/hadoop-env.sh文件,修改下面的代码

# set to the root of your Java installation
export JAVA_HOME=/usr/java/latest


这里的JAVA_HOME写上自己的JAVA_HOME环境即可,注意不用加上bin的文件路径,比如我的是:

export JAVA_HOME=/home/luchi/Documents/JAVA/jdk1.7.0_79


5)回到Hadoop安装根目录,执行:

$ bin/hadoop


可以看到很多Hadoop脚本文件的说明文档

6)选择安装的集群类别,官网提供了下面三个模式:

(Local Model)本地模式:节点安装在本地,不是分布式模式,就像一个单个的java线程,优点是比较容易调试,但是个人感觉既然选择了Hadoop,那就应该学习其分布式的管理和操作,要不饶也没啥意思,本地模式的安装比较简单。如下面:

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


(Fully-Distributed Mode)全分布模式

全分布模式还没接触,就不说了。

(Pseudo-Distributed Mode)伪分布模式

本文主要讲的是基于伪分布模式的情况。所谓“伪”的意思是不像Local Mode是就像运行在一个进程中,在伪模式中,每个Hadoop的守护,运行在不同的java进程中

i)修改几个配置文件:

修改etc/hadoop/core-site.xml:

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>


修改etc/hadoop/hdfs-site.xml:

<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>


ii)建立免密ssh连接

测试语句:

$ ssh localhost


成功应该是这模样:

luchi@ubuntu:~/Hadoop/hadoop-2.7.3$ ssh localhost
Welcome to Ubuntu 15.10 (GNU/Linux 4.2.0-16-generic x86_64)

* Documentation:  https://help.ubuntu.com/ 
263 packages can be updated.
172 updates are security updates.

Your Ubuntu release is not supported anymore.
For upgrade information, please visit: http://www.ubuntu.com/releaseendoflife 
New release '16.04.1 LTS' available.
Run 'do-release-upgrade' to upgrade to it.

Last login: Mon Oct 10 15:24:35 2016 from 127.0.0.1


如果还没有设置免密登录的话那么输入如下的命令行:

$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys


iii)在本地运行Hadoop

(一)首先,构建文件系统

$ bin/hdfs namenode -format


(二)开启NameNode和DataNode守护进程

$ sbin/start-dfs.sh


开启之后,可以在浏览器中输入http://localhost:50070/查看NameNode的情况 ,我的是下图:


(三)在HDFS上创建目录

$ bin/hdfs dfs -mkdir /user
$ bin/hdfs dfs -mkdir /user/<username>


上面的命令意义是,在hdfs上创建一个目录user,在user目录下在创建一个子目录,比如我选择的是 /user/luchi,也就是用户目录。这个命令其实和Linux下的命令差不多,不过是前面是使用了dfs, 后面的命令其实和Linux上的命令差不多,不过是多了一个”-“符号而已。

(四)将文件放入hdfs文件系统中

$ bin/hdfs dfs -put etc/hadoop input


这句代码的意思是将本地的etc/hadoop整个目录放入到HDFS文件系统的input目录下,执行这句操作之后,在HDFS上的目录形式是input/hadoop/*,但是使用这个命令之后在后面的测试实验中出现了如下错误:

Caused by: org.apache.hadoop.ipc.RemoteException(java.io.FileNotFoundException): Path is not a file: /user/luchi/input/hadoop


也就是后面的测试时使用input目录下的文件来进行操作的,但是hadoop这个不是文件而是,文件目录,因此我把这句话改成:

bin/hdfs dfs -put  etc/hadoop/* input


也就是把etc/hadoop目录下面的所有文件放入HDFS文件系统中的input目录下,经过这个命令,HDFS下面的input目录结构如下:

luchi@ubuntu:~/Hadoop/hadoop-2.7.3$ bin/hdfs dfs -ls input/
Found 32 items
-rw-r--r--   1 luchi supergroup       4436 2016-10-10 16:39 input/capacity-scheduler.xml
-rw-r--r--   1 luchi supergroup       1335 2016-10-10 16:39 input/configuration.xsl
-rw-r--r--   1 luchi supergroup        318 2016-10-10 16:39 input/container-executor.cfg
-rw-r--r--   1 luchi supergroup        884 2016-10-10 16:39 input/core-site.xml
-rw-r--r--   1 luchi supergroup        774 2016-10-10 16:39 input/core-site.xml~
-rw-r--r--   1 luchi supergroup       3589 2016-10-10 16:39 input/hadoop-env.cmd
-rw-r--r--   1 luchi supergroup       4280 2016-10-10 16:39 input/hadoop-env.sh
-rw-r--r--   1 luchi supergroup       4281 2016-10-10 16:39 input/hadoop-env.sh~
-rw-r--r--   1 luchi supergroup       2490 2016-10-10 16:39 input/hadoop-metrics.properties
-rw-r--r--   1 luchi supergroup       2598 2016-10-10 16:39 input/hadoop-metrics2.properties
-rw-r--r--   1 luchi supergroup       9683 2016-10-10 16:39 input/hadoop-policy.xml
-rw-r--r--   1 luchi supergroup        867 2016-10-10 16:39 input/hdfs-site.xml
-rw-r--r--   1 luchi supergroup        775 2016-10-10 16:39 input/hdfs-site.xml~
-rw-r--r--   1 luchi supergroup       1449 2016-10-10 16:39 input/httpfs-env.sh
-rw-r--r--   1 luchi supergroup       1657 2016-10-10 16:39 input/httpfs-log4j.properties
-rw-r--r--   1 luchi supergroup         21 2016-10-10 16:39 input/httpfs-signature.secret
-rw-r--r--   1 luchi supergroup        620 2016-10-10 16:39 input/httpfs-site.xml
-rw-r--r--   1 luchi supergroup       3518 2016-10-10 16:39 input/kms-acls.xml
-rw-r--r--   1 luchi supergroup       1527 2016-10-10 16:39 input/kms-env.sh
-rw-r--r--   1 luchi supergroup       1631 2016-10-10 16:39 input/kms-log4j.properties
-rw-r--r--   1 luchi supergroup       5511 2016-10-10 16:39 input/kms-site.xml
-rw-r--r--   1 luchi supergroup      11237 2016-10-10 16:39 input/log4j.properties
-rw-r--r--   1 luchi supergroup        931 2016-10-10 16:39 input/mapred-env.cmd
-rw-r--r--   1 luchi supergroup       1383 2016-10-10 16:39 input/mapred-env.sh
-rw-r--r--   1 luchi supergroup       4113 2016-10-10 16:39 input/mapred-queues.xml.template
-rw-r--r--   1 luchi supergroup        758 2016-10-10 16:39 input/mapred-site.xml.template
-rw-r--r--   1 luchi supergroup         10 2016-10-10 16:39 input/slaves
-rw-r--r--   1 luchi supergroup       2316 2016-10-10 16:39 input/ssl-client.xml.example
-rw-r--r--   1 luchi supergroup       2268 2016-10-10 16:39 input/ssl-server.xml.example
-rw-r--r--   1 luchi supergroup       2191 2016-10-10 16:39 input/yarn-env.cmd
-rw-r--r--   1 luchi supergroup       4567 2016-10-10 16:39 input/yarn-env.sh
-rw-r--r--   1 luchi supergroup        690 2016-10-10 16:39 input/yarn-site.xml


(五)运行给定的example

$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep input output 'dfs[a-z.]+'


这个命令的意思是执行该jar包命令,以input为输入目录,以output为输出目录

这里也有几个坑需要说明:

1,hadoop-mapreduce-examples-2.7.3.jar这个文件名需要和Hadoop版本对应上

2,如果在运行过程中出现

Caused by: org.apache.hadoop.ipc.RemoteException(java.io.FileNotFoundException): Path is not a file: /user/luchi/input/hadoop


之类的错误,需要检查一下input目录下是不是文件(避免是目录),使用的命令是:
$ bin/hdfs dfs -ls input/


3,如果出现上一步(2)的问题,调整之后,需要删除原来生成的output目录,不然会报错:

16/10/10 16:39:58 INFO jvm.JvmMetrics: Cannot initialize JVM Metrics with processName=JobTracker, sessionId= - already initialized
org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/luchi/output already exists


删除的命令是:
bin/hdfs dfs -rm -r  /user/luchi/output


这个jar命令正确运行的结果如下:

16/10/10 16:43:41 INFO mapreduce.Job:  map 100% reduce 0%
16/10/10 16:43:41 INFO mapred.LocalJobRunner: reduce > reduce
16/10/10 16:43:41 INFO mapred.Task: Task 'attempt_local222950137_0002_r_000000_0' done.
16/10/10 16:43:41 INFO mapred.LocalJobRunner: Finishing task: attempt_local222950137_0002_r_000000_0
16/10/10 16:43:41 INFO mapred.LocalJobRunner: reduce task executor complete.
16/10/10 16:43:42 INFO mapreduce.Job:  map 100% reduce 100%
16/10/10 16:43:42 INFO mapreduce.Job: Job job_local222950137_0002 completed successfully
16/10/10 16:43:42 INFO mapreduce.Job: Counters: 35
File System Counters
FILE: Number of bytes read=1334596
FILE: Number of bytes written=2332783
FILE: Number of read operations=0
FILE: Number of large read operations=0
FILE: Number of write operations=0
HDFS: Number of bytes read=166290
HDFS: Number of bytes written=1071
HDFS: Number of read operations=163
HDFS: Number of large read operations=0
HDFS: Number of write operations=16
Map-Reduce Framework
Map input records=11
Map output records=11
Map output bytes=263
Map output materialized bytes=291
Input split bytes=131
Combine input records=0
Combine output records=0
Reduce input groups=5
Reduce shuffle bytes=291
Reduce input records=11
Reduce output records=11
Spilled Records=22
Shuffled Maps =1
Failed Shuffles=0
Merged Map outputs=1
GC time elapsed (ms)=57
Total committed heap usage (bytes)=282591232
Shuffle Errors
BAD_ID=0
CONNECTION=0
IO_ERROR=0
WRONG_LENGTH=0
WRONG_MAP=0
WRONG_REDUCE=0
File Input Format Counters
Bytes Read=437
File Output Format Counters
Bytes Written=197


(六)将hdfs上的运行结果移动到本地上

可以把HDFS想象成你自己电脑上的一个小文件系统,但是不像真正的本地文件,联系这个文件系统是通过本地的ssh连接的,也就是ssh localhost,不过之前设置了免密登录所以没觉得它的存在。

移动文件的命令是:

$ bin/hdfs dfs -get  output output


其意义是将hdfs上的output目录移动到本地的output上,本地的output目录是在当前的子目录下的,也就是在hadoop的根目录下。

这里说明的一点是,如果之前根目录就有output目录,可以将该目录删除,或者将上面命令的最后一个output改成你自己定义的目录

(七)在本地查看output结果

cat output/*


执行结果是:

8   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


这样就表示成功了

(八)关掉守护进程

$ sbin/stop-dfs.sh


感想

第一次接触Hadoop,这就算入Hadoop坑了吧,另外鉴于Hadoop大部分是基于java的,终于可以捡起好久不用的java了,一直写Python,都不会用“{}”代码块了,马克一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hadoop