Hadoop:Hadoop单机伪分布式的安装和配置

http://blog.csdn.net/pipisorry/article/details/51331734

本文内容:使用docker配置hadoop单机伪分布式开发环境

本教程配置环境:

docker (virtual box / virtual machine或者直接用ubuntu14.04都ok!,建议还是用虚拟机,docker太难搞了,没有配置的官方文件)

ubuntu14.04(Ubuntu 12.04 /32位、64位都ok!)

hadoop 2.6.0 (原生 Hadoop 2都ok!)

jdk1.8.0_91(应该1.6+应该都ok!)皮皮blog


Docker安装和配置

# apt-get update

# apt-get install docker.io 

#service docker start

让它随服务器的启动而自动运行

# update-rc.d docker defaults

#gpasswd -a pika docker  #普通用户pika也可以运行docker命令

[docker的概念及安装]

[dokcer的配置和命令]

皮皮blog



Ubuntu配置

下载ubuntu镜像
# docker pull ubuntu:14.04

#docker run -it ubuntu bash

创建hadoop用户

{虚拟机中 配置时可能要用到,docker中不用}

如果你安装 Ubuntu 的时候不是用的 “hadoop” 用户,那么需要增加一个名为 hadoop 的用户。
首先按 ctrl+alt+t 打开终端窗口,输入如下命令创建新用户 :sudo useradd -m hadoop -s /bin/bash
这条命令创建了可以登陆的 hadoop 用户,并使用 /bin/bash 作为 shell。
接着使用如下命令设置密码:sudo passwd hadoop
可为 hadoop 用户增加管理员权限,方便部署,避免一些权限问题:sudo adduser hadoop sudo
最后注销当前用户,在登陆界面使用刚创建的 hadoop 用户进行登陆

安装必要和常用软件

root@171664f3fa1d:/# apt-get update   #更新apt,不是用的docker也是这样操作

# apt-get install -y vim

安装和配置java环境

在主机上从Oracle官方网站下载对应版本的JDK安装包

将本机下载目录/media/pika/softwares/Downloads/LinuxInstalls分享到Docker的/mnt 目录下

#docker run -v /media/pika/softwares/Downloads/LinuxInstalls:/mnt -it c917d6497f55 bash

root@f26f7d459863:/# tar -zxf /mnt/jdk-8u91-linux-x64.tar.gz -C /opt   #解压到/opt目录

root@f26f7d459863:/#sudo vim /etc/environment
第一行“...”的path末尾加上:${JAVA_HOME}/bin,后面export路径
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:${JAVA_HOME}/bin"
export JAVA_HOME=/opt/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

root@f26f7d459863:/#
sudo update-alternatives --install /usr/bin/java java /opt/jdk1.8.0_91/bin/java 300;

sudo update-alternatives --install /usr/bin/javac javac /opt/jdk1.8.0_91/bin/javac 300;

sudo update-alternatives --install /usr/bin/javah javah /opt/jdk1.8.0_91/bin/javah 300;

sudo update-alternatives --install /usr/bin/jar jar /opt/jdk1.8.0_91/bin/jar 300

. /etc/environment
测试是否安装成功
root@f26f7d459863:/#java -version

[java环境配置:安装jdk、eclipse]


lz使用的ubuntu镜像是之前配置好的python_ubuntu[使用docker配置python开发环境],里面安装好了vim、openssh-server等等,当然你可以直接安装
安装SSH、配置SSH无密码登陆
集群、单节点模式都需要用到 SSH 登陆(ssh must be installed and sshd must be running to use the Hadoop scripts that manage remote Hadoop daemons),Ubuntu 默认已安装了 SSH client,还需要安装 SSH server:
root@f26f7d459863:/#sudo apt-get install -y openssh-server

编辑sshd的配置文件root@f26f7d459863:/#vim /etc/ssh/sshd_config,将其中UsePAM参数设置成“no”
启动sshd服务root@f26f7d459863:/# /etc/init.d/ssh start 

#每次重启都要重新启动,所以要加入到profile中开机自启

# vim /etc/profile

Hadoop:Hadoop单机伪分布式的安装和配置_第1张图片

查看ssh服务状态 root@f26f7d459863:/# ps -e | grep ssh
   47 ?        00:00:00 sshd

安装后,可以使用如下命令登陆本机:ssh localhost
此时会有SSH首次登陆提示,输入 no,(输入yes再输入密码,这样就登陆到本机了,但这样登陆是需要每次输入密码的,我们需要配置成SSH无密码登陆比较方便,如果进去了首先退出刚才的 ssh)。
回到我们原先的终端窗口,然后利用 ssh-keygen 生成密钥,并将密钥加入到授权中:
exit                           # 退出刚才的 ssh localhost
cd ~/.ssh/                     # 若没有该目录,请先执行一次ssh localhost
ssh-keygen -t rsa              # 会有提示,都按回车就可以
cat ./id_rsa.pub >> ./authorized_keys  # 加入授权

另开一个terminal,保存当前的容器为镜像

docker ps找到刚才安装了ssh的镜像/容器id

docker commit 容器id

pika:~$docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
07f9a3b3f737        tmp:latest          "bash"              5 minutes ago       Up 5 minutes                            condescending_pike   
pika:~$docker commit o7f9 ssh

[Docker创建支持ssh服务的容器和镜像]

皮皮blog


Hadoop的安装和配置

Hadoop 2 可以通过 http://mirror.bit.edu.cn/apache/hadoop/common/ 或者 http://mirrors.cnnic.cn/apache/hadoop/common/ 下载,一般选择下载最新的稳定版本,即下载 “stable” 下的 hadoop-2.x.y.tar.gz 这个格式的文件,这是编译好的,另一个包含 src 的则是 Hadoop 源代码,需要进行编译才可使用。

安装Hadoop 至 /usr/local/ 中

docker容器中下载hadoop到/usr/local并解压

root@f851ff17e8ad:~# wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.6.4/hadoop-2.6.4.tar.gz -P /usr/local
root@f851ff17e8ad:/usr/local# tar -zxf hadoop-2.6.4.tar.gz

root@f851ff17e8ad:/usr/local# ln -s /usr/local/hadoop-2.6.4 /usr/local/hadoop    #设置软链接,这样两个目录是一样的了

# ls /usr/local/hadoop
LICENSE.txt  README.txt  etc      input  libexec  sbin   tmp
NOTICE.txt   bin         include  lib    output   share

sudo chown -R hadoop ./hadoop       # -R递归修改文件所有者为hadoop

检查 Hadoop 是否可用

. /etc/environment  #先要执行这个,否则JAVA_HOMEF未设置,很奇怪,这个文件没有在docker run的时候随机启动,但是/etc/profile却又的确随机启动了?

root@f851ff17e8ad:/usr/local# hadoop/bin/hadoop version
Hadoop 2.6.4
Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r 5082c73637530b0b7e115f9625ed7fac69f937e6
Compiled by jenkins on 2016-02-12T09:45Z
Compiled with protoc 2.5.0
From source with checksum 8dee2286ecdbbbc930a6c87b65cbc010
This command was run using /usr/local/hadoop-2.6.4/share/hadoop/common/hadoop-common-2.6.4.jar

皮皮blog



Hadoop单机非分布式配置

Hadoop 默认模式为非分布式模式,无需进行其他配置即可运行。非分布式即单 Java 进程,方便进行调试。

Hadoop单机非分布式实例运行

Hadoop 附带了丰富的例子(运行 ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar 可以看到所有例子),包括 wordcount、terasort、join、grep 等。

运行 grep 例子,我们将 input 文件夹中的所有文件作为输入,筛选当中符合正则表达式 'o*' 的单词并统计出现的次数,最后输出结果到 output 文件夹中。

root@f851ff17e8ad:/usr/local/hadoop# rm -r output

root@f851ff17e8ad:/usr/local/hadoop# mkdir input
root@f851ff17e8ad:/usr/local/hadoop# cp README.txt input/    # 将readme文件作为输入文件测试
root@f851ff17e8ad:/usr/local/hadoop# ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jar grep ./input ./output 'o*'
root@f851ff17e8ad:/usr/local/hadoop# cat ./output/*

1257    
101    o
4    oo
Note: Hadoop 默认不会覆盖结果文件,因此再次运行上面实例会提示出错,需要先将 ./output 删除,所以每次运行hadoop最好在前面加上rm -r ./output

Hadoop单机伪分布式配置

Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。
Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。

Hadoop执行命令目录加入到path中

# vim /etc/environment

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin"
export JAVA_HOME=/opt/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:${HADOOP_HOME}/share
export HADOOP_HOME=/usr/local/hadoop-2.6.4

Note: HADOOP_HOME必须使用实际目录,不能使用软链接!

# . /etc/environment

修改配置文件 core-site.xml和hdfs-site.xml

root@f851ff17e8ad:/usr/local/hadoop# vim etc/hadoop/core-site.xml
root@f851ff17e8ad:/usr/local/hadoop# vim etc/hadoop/hdfs-site.xml

将当中的修改成:


       
             hadoop.tmp.dir
             file:/usr/local/hadoop/tmp
             Abase for other temporary directories.
       

       
             fs.defaultFS
             hdfs://localhost:9000
       

同样修改配置文件 hdfs-site.xml:

       
             dfs.replication
             1
       

       
             dfs.namenode.name.dir
             file:/usr/local/hadoop/tmp/dfs/name
       

       
             dfs.datanode.data.dir
             file:/usr/local/hadoop/tmp/dfs/data
       


Hadoop配置文件说明

Hadoop 的运行方式是由配置文件决定的(运行 Hadoop 时会读取配置文件),因此如果需要从伪分布式模式切换回非分布式模式,需要删除 core-site.xml 中的配置项。
此外,伪分布式虽然只需要配置 fs.defaultFS 和 dfs.replication 就可以运行,不过若没有配置 hadoop.tmp.dir 参数,则默认使用的临时目录为 /tmp/hadoo-hadoop,而这个目录在重启时有可能被系统清理掉,导致必须重新执行 format 才行。

同时也指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,否则在接下来的步骤中可能会出错。

配置完成后,执行 NameNode 的格式化

root@f851ff17e8ad:/usr/local/hadoop# bin/hdfs namenode -format

成功的话,会看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若为 “Exitting with status 1” 则是出错。

16/05/07 02:22:15 INFO common.Storage: Storage directory /usr/local/hadoop/tmp/dfs/name has been successfully formatted.
16/05/07 02:22:15 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
16/05/07 02:22:15 INFO util.ExitUtil: Exiting with status 0

开启 NameNode 和 DataNode 守护进程

root@962af2807540:/# start-dfs.sh
Note: 若出现SSH提示,输入yes即可

Hadoop:Hadoop单机伪分布式的安装和配置_第2张图片

启动Hadoop可能的错误及解决

Hadoop无法正常启动的解决方法
一般可以查看启动日志来排查原因,注意几点:
启动时会提示形如 “DBLab-XMU: starting namenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-namenode-DBLab-XMU.out”,其中 DBLab-XMU 对应你的机器名,但其实启动日志信息是记录在 /usr/local/hadoop/logs/hadoop-hadoop-namenode-DBLab-XMU.log 中,所以应该查看这个后缀为 .log 的文件;
每一次的启动日志都是追加在日志文件之后,所以得拉到最后面看,对比下记录的时间就知道了。
一般出错的提示在最后面,通常是写着 Fatal、Error、Warning 或者 Java Exception 的地方。
可以在网上搜索一下出错信息,看能否找到一些相关的解决方法。

错误1:

启动时可能会出现如下 WARN 提示:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable。该 WARN 提示可以忽略,并不会影响正常使用(该 WARN 可以通过

编译 Hadoop 源码解决)。

错误2:

出错:Starting namenodes on [localhost]
localhost: Error: JAVA_HOME is not set and could not be found.

明明已经设置了,并且root@962af2807540:/# echo $JAVA_HOME
/opt/jdk1.8.0_91成功输出!

终于找到解决方案:

root@962af2807540:/# vim /usr/local/hadoop-2.6.4/libexec/hadoop-config.sh

在这个位置加上export JAVA_HOME=/opt/jdk1.8.0_91

Hadoop:Hadoop单机伪分布式的安装和配置_第3张图片

错误3:

启动 Hadoop 时提示 Could not resolve hostname
如果启动 Hadoop 时遇到输出非常多“ssh: Could not resolve hostname xxx”的异常情况
这个并不是 ssh 的问题,可通过设置 Hadoop 环境变量来解决。首先按键盘的 ctrl + c 中断启动,然后在 ~/.bashrc 中,增加如下两行内容(设置过程与 JAVA_HOME 变量一样,其中 HADOOP_HOME 为 Hadoop 的安装目录):
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
执行 source ~/.bashrc 使变量设置生效,然后再次执行 ./sbin/start-dfs.sh 启动 Hadoop。

错误4:DataNode 没有启动

一般情况下,若是 DataNode 没有启动,可尝试如下的方法(注意这会删除 HDFS 中原有的所有数据,如果原有的数据很重要请不要这样做):
./sbin/stop-dfs.sh   # 关闭
rm -r ./tmp 删除 tmp 文件,注意这会删除 HDFS 中原有的所有数据
./bin/hdfs namenode -format 重新格式化 NameNode
./sbin/start-dfs.sh  # 重启

通过jps查看启动的Hadoop进程

启动完成后,可以通过命令 jps 来判断是否成功启动,若成功启动则会列出如下进程: “NameNode”、”DataNode” 和 “SecondaryNameNode”(如果 SecondaryNameNode 没有启动,请运行 sbin/stop-dfs.sh 关闭进程,然后再次尝试启动尝试)。如果没有 NameNode 或 DataNode ,那就是配置不成功,请仔细检查之前步骤,或通过查看启动日志排查原因。

root@962af2807540:/# jps
2364 NameNode
2477 DataNode
3054 Jps
2623 SecondaryNameNode
Note: 如果是虚拟机配置的hadoop,成功启动后,可以访问 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。

可以保存docker容器为images,下次不用再配置!

另开一个terminal:

pika:/usr/local$docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
962af2807540        hadoop1:latest      "bash"              49 minutes ago      Up 49 minutes                           elegant_ritchie     
pika:/usr/local$docker commit 962af2807540607a75c4df75dc4533c8844f227c8834beb14a3ff8517ff98be7 hadoop2
ed64af5ef788703e59022bbe5786cbd3d0e443c906aa3c12b7a9528162adbb47

不知道为嘛,每次重新打开docker容器,一定要手动执行,配置文件死也不自动执行,也是醉了!!!

pika:~$docker run -it hadoop2 bash

root@962af2807540:/# . /etc/environment       #lz每次都要执行一次,再检查一次,再执行一次才有效,什么鬼!
root@962af2807540:/# echo $PATH   #检查
root@962af2807540:/# /etc/init.d/ssh start

皮皮blog



Hadoop单机伪分布式运行实例

单机模式grep 例子读取的是本地数据,伪分布式读取的则是 HDFS 上的数据。这里我们还要自己写java代码,并在java代码中引入hadoop packages。

{浅色部分是在虚拟机中配置时可能要用的,docker中并不用}

要使用 HDFS,首先需要在 HDFS 中创建用户目录:
./bin/hdfs dfs -mkdir -p /user/hadoop
接着将文件复制到分布式文件系统中。

我们使用的是 hadoop 用户,并且已创建相应的用户目录 /user/hadoop ,因此在命令中就可以使用相对路径如 input,其对应的绝对路径就是 /user/hadoop/input

#将宿主机上.../hw2目录下的文件(java文件,输入测试文件 下载)传入docker镜像hadoop2中

pika:~$docker run -v /media/pika/files/mine/java_workspace/BDMS/src/hw2:/mnt -it hadoop2 bash
root@86bad9431b71:/# mkdir /files
root@86bad9431b71:/# cp -r /mnt/* /files/
root@b4fa0b8f916a:/# ls /files/
AvgTime-manifest.txt  AvgTime.java  example-input.txt  part1-input

#设置环境变量/启动ssh
root@962af2807540:/# . /etc/environment       #很神奇的问题:lz每次都要执行一次,检查一次,再执行一次,再检查才有效,什么鬼!
root@962af2807540:/# echo $PATH   #检查

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/opt/jdk1.8.0_91/bin:/usr/local/hadoop-2.6.4/bin:/usr/local/hadoop-2.6.4/sbin

root@962af2807540:/# hadoop classpath

Note:要将hadoop classpath输出加入到CLASSPATH中,Hadoop provides a convenient utility to get the CLASSPATH information you need. Run "hadoop classpath" This should give you the information you need set your classpath for compiling your code.否则java代码中import package org.apache.hadoop.*会出错:javac .java error: package org.apache.hadoop.conf does not exist...[package org.apache.hadoop.fs does not exist]

root@962af2807540:/# export CLASSPATH=$CLASSPATH:/usr/local/hadoop-2.6.4/etc/hadoop:/usr/local/hadoop-2.6.4/share/hadoop/common/lib/*:/usr/local/hadoop-2.6.4/share/hadoop/common/*:/usr/local/hadoop-2.6.4/share/hadoop/hdfs:/usr/local/hadoop-2.6.4/share/hadoop/hdfs/lib/*:/usr/local/hadoop-2.6.4/share/hadoop/hdfs/*:/usr/local/hadoop-2.6.4/share/hadoop/yarn/lib/*:/usr/local/hadoop-2.6.4/share/hadoop/yarn/*:/usr/local/hadoop-2.6.4/share/hadoop/mapreduce/lib/*:/usr/local/hadoop-2.6.4/share/hadoop/mapreduce/*:/usr/local/hadoop-2.6.4/contrib/capacity-scheduler/*.jar

root@962af2807540:/# /etc/init.d/ssh start    #.bashrc和/etc/environment启动都不行!什么鬼!


#启动hadoop并将input文件copy到hdfs中

root@cbdb25c79414:/# start-dfs.sh

root@cbdb25c79414:/# hdfs dfs -ls /    #初始为空
root@cbdb25c79414:/# hdfs dfs -mkdir -p /pika/input
root@cbdb25c79414:/# hdfs dfs -ls /
Found 1 items
drwxr-xr-x   - root supergroup          0 2016-05-08 07:46 /pika

root@4e43a145c914:/# hdfs dfs -put /files/*input* /pika/input    #将docker images中的输入文件copy到hadoop hdfs文件系统中供其使用(.java文件是可以不用copy进去的)
root@f7806a3d777c:/# hdfs dfs -ls /pika/input
Found 2 items
-rw-r--r--   1 root supergroup        165 2016-05-08 15:52 /pika/input/example-input.txt
drwxr-xr-x   - root supergroup          0 2016-05-08 15:52 /pika/input/part1-input


#编译执行java的hadoop程序

root@b4fa0b8f916a:/# cd files
root@b4fa0b8f916a:/files# rm -f *.class *.jar                                       #移除已有的java编译文件

root@b4fa0b8f916a:/files# javac AvgTime.java
root@b4fa0b8f916a:/files# jar cfm AvgTime.jar AvgTime-manifest.txt AvgTime*.class

root@b4fa0b8f916a:/files# hdfs dfs -rm -f -r /pika/output                 #移除已有的output文件夹目录
root@b4fa0b8f916a:/files#hadoop jar ./AvgTime.jar /pika/input/example-input.txt /pika/output            #执行hadoop程序
root@b4fa0b8f916a:/files#hdfs dfs -cat '/pika/output/part-*'                                                                         #查看输出

1.2.3.4 18811001100    2 28.500
alpha 1.2.3.4    2 20.200
beta alpha    2 4.100

Note: Hadoop 运行程序时,输出目录不能存在,否则会提示错误 “ org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists” ,因此若要再次执行,需要执行如下命令删除 output 文件夹:   ./bin/hdfs dfs -rm -r output

运行 Hadoop 程序时,为了防止覆盖结果,程序指定的输出目录(如 output)不能存在,否则会提示错误,因此运行前需要先删除输出目录。在实际开发应用程序时,可考虑在程序中加上如下代码,能在每次运行时自动删除输出目录,避免繁琐的命令行操作:
Configuration conf = new Configuration();
Job job = new Job(conf);
/* 删除输出目录 */
Path outputPath = new Path(args[1]);
outputPath.getFileSystem(conf).delete(outputPath, true);


最后可以保存上面的操作为新的docker images:

pika:~$docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f7806a3d777c        hadoop3:latest      "bash"              50 minutes ago      Up 50 minutes                           berserk_nobel       
pika:~$docker commit f780 hadoop
ed780cf5e9d631e00bdb26eded5b74928c173fbd6b1391269f83658695433e8b

终于写完了,也是给跪了。。。

from: http://blog.csdn.net/pipisorry/article/details/51331734

ref: Hadoop 2.6 Installing on Ubuntu 14.04 (Single-Node Cluster)

Hadoop MapReduce Next Generation - Setting up a Single Node Cluster.

Hadoop单机/伪分布式配置_Hadoop2.6.0/Ubuntu14.04


你可能感兴趣的:(Hadoop,Docker)