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,都不会用“{}”代码块了,马克一下。相关文章推荐
- centos7 hadoop 3节点集群安装笔记
- 完全分布模式hadoop集群安装配置之二 添加新节点组成分布式集群
- Hadoop集群(三节点)安装与部署
- Hadoop2.2.0版本多节点集群安装及测试
- 一步步教你Hadoop多节点集群安装配置
- hadoop,hbase,mongodb多节点集群安装入门教程以及ycsb测试性能
- Hadoop 多节点集群安装指南
- Hadoop2.2.0版本多节点集群安装及测试
- Hadoop2.2.0版本多节点集群安装及测试
- HBase入门笔记(三)-- 完全分布模式Hadoop集群安装配置
- hadoop学习笔记1----构造模块与集群安装ssh与启动Hadoop
- Hadoop 三节点集群安装配置详细实例
- HBase入门笔记(三)-- 完全分布模式Hadoop集群安装配置
- hadoop学习笔记之-生产环境Hadoop大集群配置安装
- 完全分布模式hadoop集群安装配置之一安装第一个节点
- hadoop学习笔记-centos安装单节点及多节点集成(完整版)
- Hadoop学习笔记【12】-Hadoop2.1全分布式集群安装
- 3节点hadoop2.2.0集群安装
- 安装单节点伪分布式 CDH hadoop 集群
- hadoop学习笔记-生产环境hadoop集群安装