阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Hadoop单机伪分布式部署

167次阅读
没有评论

共计 9467 个字符,预计需要花费 24 分钟才能阅读完成。

由于没有那么多机器,就在自己的虚拟机上部署一套 Hadoop 集群,这被称作伪分布式集群,但是不管怎么样,这里主要记录部署 hadoop 的过程以及遇到的问题,然后再使用一个简单的程序测试环境。

1、安装 JAVA、下载 hadoop 程序包,配置 hadoop 的环境变量。

这里要设置 JAVA_HOME 等于 java 的安装目录,将 hadoop 程序所在的目录添加到系统的 PATH 环境变量下,这样可以直接在 shell 中启动 hadoop 命令。这里使用的 hadoop 的 2.6.0 版本。

2、设置 SSH

之所以需要安装 ssh 是因为 Hadoop 需要通过 ssh 方式启动 slave 列表中的各台机器上的守护进程,虽然我们这里称作伪分布式的方式安装,但是 hadoop 还是按照集群的方式启动的,只不过集群中的所有机器都是在同一台机器上罢了。ssh 默认端口为 22,可以查看端口 22 判断是否已经安装启动了。然后为了能够让 hadoop 通过 ssh 启动程序,需要免密码使用 ssh,如果不进行设置,直接使用

ssh user@127.0.0.1(要确保本机已经安装了 ssh 服务器和客户端)会出现这样的情况:
linuxidc@linuxidc:~/workplace$ ssh linuxidc@127.0.0.1
linuxidc@127.0.0.1’s password:
Welcome to Ubuntu 13.10 (GNU/Linux 3.11.0-12-generic i686)

* Documentation:  https://help.ubuntu.com/

Last login: Mon Jan 19 15:03:01 2015 from localhost

也就是每次都需要你输入该用户的密码,为了配置免密码登录,需要执行如下的命令:

ssh-keygen  -t  dsa -P ” -f  ~/.ssh/id_dsa
cat  ~/.ssh/id_dsa.pub  >>  ~/.ssh/authorized_keys

第一个命令是生成一个密钥,- t 表示迷药类型,这里使用 dsa 认证的方式,- P 表示密码,这里使用的是空,- f 表示生成密钥文件的地址;第二个目录是将生成的密钥的公钥拷贝成当前主机已授权的 key 文件,这样通过 ssh 命令连接主机就不需要密码了。可以再次通过上面的 ssh 命令检验。
3、配置 hadoop 的环境配置文件 etc/hadoop/hadoop-env.sh
这个是 hadoop 的环境配置文件,需要配置 JAVA_HOME 的目录,确保该目录是 java 的安装目录。
4、配置 etc/hadoop/core-site.xml 配置文件
 
<configuration>

    <property>
          <name>hadoop.tmp.dir</name>
          <value>/home/linuxidc/workplace/hadoop/data</value>
    </property>

    <property>
          <name>fs.default.name</name>
          <value>hdfs:// 主机地址:9000</value>
    </property>

</configuration>

5、配置 MapReduce 配置文件 etc/hadoop/mapred-site.xml

<configuration>
    <property>
          <name>mapred.job.tracker</name>
          <value> 主机地址:9001</value>
    </property>
</configuration>

6、配置 HDFS 配置文件 etc/hadoop/hdfs-site.xml

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

    <property>
          <name>dfs.namenode.name.dir</name>
          <value>/home/linuxidc/workplace/hadoop/hdfs/name</value>
    </property>

    <property>
          <name>dfs.datannode.data.dir</name>
          <value>/home/linuxidc/workplace/hadoop/hdfs/data</value>
    </property>
</configuration>

7、格式化 hdfs 文件系统然后启动所有的模块
hadoop namenode -format         
该命令格式化 HDFS 文件系统。
然后执行./sbin/start-all.sh,这时候会出现问题,如下:
 
Starting namenodes on [Java HotSpot(TM) Client VM warning: You have loaded library /home/linuxidc/workplace/hadoop/hadoop-2.6.0/lib/native/libhadoop.so.1.0.0 which might have disabled stack guard. The VM will try to fix the stack guard now.
It’s highly recommended that you fix the library with ‘execstack -c <libfile>’, or link it with ‘-z noexecstack’.
 
查看发现这是由于平台的不兼容导致的,我下载的 hadoop 是 64 位的版本,而自己的机器却是 32 位的,所以这时候需要手动编译 hadoop。
 
linuxidc@linuxidc-VirtualBox:~/workplace/hadoop/hadoop-2.6.0$ file  /home/linuxidc/workplace/hadoop/hadoop-2.6.0/lib/native/libhadoop.so.1.0.0
/home/linuxidc/workplace/hadoop/hadoop-2.6.0/lib/native/libhadoop.so.1.0.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0x2c42803ac908d7781a6c66a16723dd8ebb7dd76e, not stripped
linuxidc@linuxidc-VirtualBox:~/workplace/hadoop/hadoop-2.6.0$ uname -a
Linux linuxidc.netease.com 3.11.0-12-generic #19-Ubuntu SMP Wed Oct 9 16:12:00 UTC 2013 i686 i686 i686 GNU/Linux
 
但是 maven 依赖于 protobuf,所以还需要首先下载并安装 protobuf,protobuf 的版本必须是 2.5.0 版本或者以上,否则也会编译不通过。maven 的版本还需要 3.0.2 以上,可以下载一个 maven 的执行文件来构建。
构建过程中出现这样的问题:
 
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7:run (make) on project hadoop-common: An Ant BuildException has occured: exec returned: 1
[ERROR] around Ant part …<exec dir=”/home/linuxidc/workplace/hadoop/hadoop-2.6.0-src/hadoop-common-project/hadoop-common/target/native” executable=”cmake” failonerror=”true”>… @ 4:152 in /home/linuxidc/workplace/hadoop/hadoop-2.6.0-src/hadoop-common-project/hadoop-common/target/antrun/build-main.xml
 
这时候需要安装下面两个库,如下:
 
sudo apt-get install zlib1g-dev
sudo apt-get install libssl-dev
 
又出现问题了:org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7:run (dist) on project hadoop-hdfs-httpfs: An Ant BuildException has occured: exec returned: 2
google 了一把发现是因为没有安装 forrest 而导致的,也不知道这个是干什么的,直接去官网 (http://forrest.apache.org/) 上下载一个最新的版本,是绿色安装的(难道这些就是 java 的优势吗?以前下载 c ++ 实现的程序都是需要三步安装)。然后设置环境变量 FORREST_HOME 和 PATH 中加入 forrest 的 bin 目录,重新编译。
 
加入 forrest 之后仍然还出现这个错误,于是决心不编译这个模块了,找到 hadoop-hdfs-project/pom.xml 文件,将 <!–module>hadoop-hdfs-httpfs</module–> 给注释掉,重新编译就能够顺利编译完成,不知道对 hadoop 有没有什么影响。
 
这时候 已经编译好的 hadoop-2.6.0 在 hadoop-2.6.0-src/hadoop-dist/target/ 目录下,这时候我们使用这个覆盖之前下载的 hadoop 目录就可以了。因为这是一个新编译出来的程序,所以需要再次执行 hadoop namenode -format 来初始化 HDFS,否则还是会出现错误。
再次执行 start-dfs.sh 出现如下的错误:
 
Starting namenodes on [linuxidc.netease.com]
linuxidc.netease.com: Error: JAVA_HOME is not set and could not be found.
localhost: Error: JAVA_HOME is not set and could not be found.
Starting secondary namenodes [0.0.0.0]
0.0.0.0: Error: JAVA_HOME is not set and could not be found.
 
我觉得这是由于在 ssh 登录到新的终端之后 JAVA_HOME 在新的会话里面不再有效(如果是在 shell 下通过 export 设置的就只在当前回会话有效,如果希望对于当前用户的所有会话都有效则需要在~/.bashrc 文件里面添加 export JAVA_HOME=XXX,如果希望对于所有的用户都有效,需要在 /etc/profile 文件的末未添加 export)。但是这样操作之后通过 ssh 建立新的会话,查看 JAVA_HOME 变量确定是有效值,但是仍然会出现这样的错误,于是就不得不使出狠招了。在 libexec/hadoop-config.sh 文件里面找到 ”Error: JAVA_HOME is not set and could not be found.” 这一行,可以看出这一行是没有找到 JAVA_HOME 所设置的目录而打印的,那么就在这一个 if 判断之前加上 export JAVA_HOME=xxx 语句,就可以确定在这里能够找到 JAVA_HOME 的值了,无论在哪个终端上都不会出错,但是如果在多个机器上,每个机器的 JAVA_HOME 的路径设置不一样的话,这样需要一个个的修改,的确是一个问题。
 
再次执行./sbin/start-dfs.sh 和./sbin/start-yarn.sh 两个脚本,就能够把 hadoop 需要的进程全部启动了,通过 jps 查看有下面的进程:
 
linuxidc@linuxidc:~/workplace/hadoop$ jps
8329 SecondaryNameNode
8507 ResourceManager
8660 Jps
8143 DataNode
8023 NameNode
8628 NodeManager
 
好了,到这里 hadoop 单机版就编译部署完成了,其实集群的部署应该也是差不多的,通过 ssh 的方式也很容易在多个机器中部署。然后使用一个简单的测试程序跑一下吧。
 
在学习新语言的时候都是使用”hello world“作为入门,而单词统计的程序就是 mapReduce 的”hello world“,下面我们随便创造一个英文单词组成的文件,然后统计这个文件中每一个单词出现的次数。下面是 hadoop 官方文档的介绍页:
 
Apache Hadoop 2.6.0

Apache Hadoop 2.6.0 is a minor release in the 2.x.y release line, building upon the previous stable release 2.4.1.

Here is a short overview of the major features and improvements.

Common
Authentication improvements when using an HTTP proxy server. This is useful when accessing WebHDFS via a proxy server.
A new Hadoop metrics sink that allows writing directly to Graphite.
Specification work related to the Hadoop Compatible Filesystem (HCFS) effort.
HDFS
Support for POSIX-style filesystem extended attributes. See the user documentation for more details.
Using the OfflineImageViewer, clients can now browse an fsimage via the WebHDFS API.
The NFS gateway received a number of supportability improvements and bug fixes. The Hadoop portmapper is no longer required to run the gateway, and the gateway is now able to reject connections from unprivileged ports.
The SecondaryNameNode, JournalNode, and DataNode web UIs have been modernized with HTML5 and Javascript.
YARN
YARN’s REST APIs now support write/modify operations. Users can submit and kill applications through REST APIs.
The timeline store in YARN, used for storing generic and application-specific information for applications, supports authentication through Kerberos.
The Fair Scheduler supports dynamic hierarchical user queues, user queues are created dynamically at runtime under any specified parent-queue.

首先,创建一个新的文件,将这段英文的内容复制到该文件中:
cat > test
然后将新创建的 test 文件放到 HDFS 文件系统上作为 mapReduce 的输入文件:
./bin/hadoop fs -put ./test /wordCountInput
 
该命令执行 HDFS 的命令将本地的文件 test 放置到 HDFS 的根目录下 wordCountInput 文件。通过 ls 命令查看是否执行成功:
linuxidc@linuxidc-VirtualBox:~/workplace/hadoop/hadoop-2.6.0$ ./bin/hadoop fs -ls /
Found 1 items
-rw-r–r–  1 linuxidc supergroup      1400 2015-01-20 13:05 /wordCountInput
 
mapReduce 的测试包在 share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar 中,这是多个测试程序打包而成的 jar 文件,我们使用 wordCount 功能执行单词统计。
./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar wordcount /wordCountInput /wordCountOutput
这个命令使用 hadoop 的 mapReduce 执行 jar 包中的 wordcount 程序,这个程序的输入是 HDFS 的 /wordCountInput 文件(如果这个文件是一个目录,那么输入就是该目录下的所有文件),输出放到 HDFS 的 /wordCountOutput 目录中。执行过程中打印很多 INFO 信息,我们看一下部分的输出信息:

15/01/20 13:09:29 INFO Configuration.deprecation: session.id is deprecated. Instead, use dfs.metrics.session-id
15/01/20 13:09:29 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
15/01/20 13:09:29 INFO input.FileInputFormat: Total input paths to process : 1
15/01/20 13:09:30 INFO mapreduce.JobSubmitter: number of splits:1
15/01/20 13:09:30 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_local810038734_0001

15/01/20 13:09:33 INFO mapred.MapTask: Starting flush of map output
15/01/20 13:09:33 INFO mapred.MapTask: Spilling map output

15/01/20 13:09:34 INFO mapreduce.Job:  map 100% reduce 0%

15/01/20 13:09:35 INFO mapred.LocalJobRunner: Finishing task: attempt_local810038734_0001_r_000000_0
15/01/20 13:09:35 INFO mapred.LocalJobRunner: reduce task executor complete.
15/01/20 13:09:35 INFO mapreduce.Job:  map 100% reduce 100%
15/01/20 13:09:36 INFO mapreduce.Job: Job job_local810038734_0001 completed successfully
15/01/20 13:09:36 INFO mapreduce.Job: Counters: 38

    File Input Format Counters
          Bytes Read=1400
    File Output Format Counters
          Bytes Written=1416

然后看一下结果的目录:
linuxidc@linuxidc-VirtualBox:~/workplace/hadoop/hadoop-2.6.0$ ./bin/hadoop fs -ls /wordCountOutput
Found 2 items
-rw-r–r–  1 linuxidc supergroup          0 2015-01-20 13:09 /wordCountOutput/_SUCCESS
-rw-r–r–  1 linuxidc supergroup      1416 2015-01-20 13:09 /wordCountOutput/part-r-00000
 
可以看到这个目录下有两个文件,其中 part-r-00000 就是我们的执行结果:

linuxidc@linuxidc-VirtualBox:~/workplace/hadoop/hadoop-2.6.0$ ./bin/hadoop fs -cat /wordCountOutput/part-r-00000
Hadoop    5
The    5
a    4
and    7
for    4
is    5
now    3
proxy    2
release    3
the    9
to    4
user    3

这里只摘取了出现次数大于 2 的一些单词和它在上面的文件中的出现次数。它正确的统计了上面文件中出现的单词的个数,接着我们就可以自己写 mapReduce 程序来实现各种各样的计算功能了。

CentOS 安装和配置 Hadoop2.2.0  http://www.linuxidc.com/Linux/2014-01/94685.htm

Ubuntu 13.04 上搭建 Hadoop 环境 http://www.linuxidc.com/Linux/2013-06/86106.htm

Ubuntu 12.10 +Hadoop 1.2.1 版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm

Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm

Ubuntu 下 Hadoop 环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm

单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm

搭建 Hadoop 环境(在 Winodws 环境下用虚拟机虚拟两个 Ubuntu 系统进行搭建)http://www.linuxidc.com/Linux/2011-12/48894.htm

更多 Hadoop 相关信息见Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计9467字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中