Windows下运行Hadoop
Windows下运行Hadoop,通常有两种方式:一种是用VM方式安装一个Linux操作系统,这样基本可以实现全Linux环境的Hadoop运行;另一种是通过Cygwin模拟Linux环境。后者的好处是使用比较方便,安装过程也简单。在这里咱们就来看看第二种方案:如何再Windows下快速安装一个Hadoop环境,并结合Eclipse开发环境研究和调整Hadoop代码。
整个安装过程包括以下三大步骤:
- 安装和配置Cygwin(http://cygwin.com/install.html)
- 安装和配置Hadoop-1.2.1(http://hadoop.apache.org/docs/stable/cluster_setup.html)
- 安装和配置Eclipse开发环境
1安装和配置Cygwin
在Windows下通过安装Cygwin模拟Linux环境,然后再安装Hadoop,是一种简单方便的方式,为Hadoop准备的模拟Linux环境安装过程如下:
1.1下载安装文件
针对不同系统类型下载相应的安装文件,下载地址:http://cygwin.com/install.html。
我这里的系统是window 7所以下载的是setup-x86.exe
1.2安装Cygwin
刚刚下载的文件是模拟Linux系统所依赖的软件包下载和管理工具,以后想要在模拟Linux环境中安装或更新软件都需要通过这个工具来完成,下面我们就先运行起来这个工具如下:
- 左键双击setup-x86.exe文件运行安装向导:
- 点击【下一步】按钮进入程序引导安装页,这里有三个选项,选择第一项网络安装:
- 网络安装:通过网络下载并安装软件包
- 下载但不安装:通过网络下载软件包
- 本地安装:是用本地软件包安装
- 点击【下一步】进入选择模拟Linux系统的根目录和用户的向导页。在Linux的文件系统中有且只有一个根目录,在这里选择目录就是Linux中的那个根目录了,这里选择默认:c:\cygwin;用户选择第一项:本系统的所有有效用户。
- 点击【下一步】选择本地软件包目录,该工具会自动记住并将以后下载的所有软件包都会放到这里指定的目录。我这里选择:C:\Users\Administrator\Desktop\1,如果选择不存在目录,就好提示是否创建目录选Yes就OK。
- 点击【下一步】选择您的网络连接,我这里使用的是代理服务器上网,所以我选择第二项:使用IE浏览器代理设置。经测试选择第三项输入代理服务器地址和端口,不能正常访问网络,原因不明。
- 点击【下一步】,等待下载镜像站点列表,下载完成后出现选择下载软件包的站点。如图:
- 根据自己的情况选择合适的下载地址,我这里选择了国内的163站点,点击【下一步】,这个工具就会自动下载软件包信息列表下载完成后进入安装软件包选择页,如下图:
- 这一步比较重要,以下软件包要确保被安装:
注:这个软件包列表由前到后包括:分类、当前安装版本,最新版本,安装可执行文件?,安装源代码文件?,大小,包名称和说明。
- 基础软件包:Base及其下面的所有软件包,操作方法:点击Base后面的Default为Install。
- SSH相关软件包:Net下的OpenSSL和和OpenSSH,用于Hadoop需要的SSH访问,操作方法:点击【+】展开Net节点,点击各个软件包前的最新版本号列的Keep为版本号即为选中安装。
- 其他软件包根据自己的需要选中是否安装即可,我这里还选中了Emacs、VIM、Perl、Python、Ruby、Science、subversion等常用工具。
- 选择完软件包点击【下一步】,进入自动下载与安装,如下图:
- 点击【下一步】进入向导结束页,勾选创建桌面快捷方式点击【完成即可】,如图:
到这里,您已经完成了模拟Linux环境的安装,左键双击桌面上的图标打开这个模拟Linux的终端窗口输入几个常用Linux命令体验下这个模拟的Linux系统吧,除了可以执行Linux常用命令外,还可以执行Windows的命令例如:net start service_name等。体验完成后继续下面的配置工作。
1.3配置Cygwin的SSH服务
Cygwin安装完成后,需要先配置SSH服务,以满足Hadoop提出的SSH无密码登入,过程如下:
打开模拟Linux的终端,进入Linux环境
执行命令:ssh-host-config如图:
第一次询问:“Should privilege separation be used? (yes/no)”,输入no回车。
第二次询问:“Do you want to install sshd a service?”,输入yes回车。
第三次提示:“Enter the value of CYGWIN for the demon: []”,直接回车。
第四次询问:“Do you want to use a different name? (yes/no)”,输入no回车。
第五次提示:“Please enter the password for user ‘cyg_server’:”,输入密码回车,在此输入密码回车。
最后提示配置完成。
1.4启动SSH服务
在Linux终端或Windows命令行执行net start sshd或命令cygrunsrv –S sshd启动SSH服务。
测试ssh登入本机:
在终端执行命令:ssh localhost
提示输入密码:输入密码回车,如下图:
1.5配置SSH免密码登入
在终端执行命令:ssh-keygen -t dsa -P ” -f ~/.ssh/id_dsa生成秘钥。
执行命令:cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys生成认证文件。
执行命令:ssh localhost测试是否无需输入密码即可登入。
1.6Cygwin使用积累
1.6.1在cygwin里访问Windows盘
cd /cygdrive/c
1.6.2整合cygwin命令到Windows中
假设cygwin安装在d:/develop/cygwin,则将d:/develop/cygwin/bin添加到系统变量PATH中(最好加在windows前面,这样的话,有些相同的命令的话,是先执行cygwin的命令,而不是windows命令,比如find)。
添加完后就可以直接在cmd.exe下面执行tar czvf xxx.tgz ./
基本上所有的命令都可以用了,包括ls,more,less,find,grep等。
1.6.3使用TGZ备份
将cygwin的BIN加入到PATH
建一个BAT文件:
@echo off
d:
cd d:/website/8thmanage
tar czvf 8thmanage.tgz 8thmanage
1.6.4Windows使用SHELL脚本
将cygwin的BIN加入到PATH
在$CYGWIN的目录/var/下面建一脚本t.sh,注意,t.sh里面的路径,都是相对于$CYGWIN的,里面需要访问C盘的,请用/cygdrive/c/
在Windows下执行:
d:/cygwin/bin/bash d:/cygwin/var/t.sh
(可以定期执行)
1.6.5同步Windows系统用户
mkpasswd -l > /etc/passwd
mkgroup -l > /etc/group
如果有Domain的话,需要加上-d domainname
1.6.6安装系统服务
cygrunsrv
1.6.7cygwing下使用rsync
- 安装rsync组件
- 进入cygwin,配置服务器
vi /etc/rsyncd.conf
…screts file=/etc/tom.ipaddr.pas
配置文件,参考我写的另外一篇rsync的文章,注意:密码文件权限必须是0400
chmod 0400 /etc/tom.ipaddr.pas
- 启动服务端
rsync –daemon
- 客户端同步
在客户端的cygwin下面,运行rsync同步,具体命令,请参考另外一篇rsync的文章。
1.6.8cygwin下使用SSHD
- 需要安装了cygrunsrc,openssh
- 运行ssh-host-config -y
一路回车,直到出现CYGWIN=时,输入tty ntsec,再回车,
(或者,增加一系统环境变量CUGWIN=nesec tty)
- 已经安装好SSHD服务到你的Windows服务中,可以直接在服务中启动,关闭。
(cygrunsrc -S sshd或者net start sshd)
1.6.9中文显示
vi ~/.bashrc
# 让ls和dir命令显示中文和颜色
alias ls=’ls –show-control-chars –color’
alias dir=’dir -N –color’
# 设置为中文环境,使提示成为中文
export LANG=”zh_CN.GBK”
# 输出为中文编码
export OUTPUT_CHARSET=”GBK”
~/.inputrc为
set completion-ignore-case on
set meta-flag on
set output-meta. on
set convert-meta. off
cygwin.bat脚本为:
@echo off
set MAKE_MODE=UNIX
2安装和配置Hadoop-1.2.1
2.1安装JDK
JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
这里要特别说明下,在Linux下路径或命令是严格区分大小写的并且对于带空格的目录,一律添加双引号(“”)除了,所以建议将JDK直接放到一个盘的根目录,而不是默认安装的Program Files目录。
我这里没有下载最新的JDK,在工作机中翻出来N久不用的32位Windows下的jdk1.6.0_14,直接将jdk1.6.0_14扔进C盘根目录,然后再配置环境变量如下:
JAVA_HOME=c:\jdk1.6.0_14
PATH=%JAVA_HOME%\bin;… 注:在系统PATH中添加%JAVA_HOME%\bin;
打开Windows命令行输入java –version,可以正常执行就OK。
我曾经尝试过不在Windows下配置Java的环境变量,Hadoop也是可以正常运行的,因为我们还会在Hadoop运行脚本中明确知道JAVA_HOME。
2.2下载最新稳定版Hadoop
下载地址:http://hadoop.apache.org/releases.html#Download
我下载的是最新稳定版:hadoop-1.2.1-bin.tar.gz
2.3规划Hadoop目录
在Hadoop生态圈里,有各种各样的工具,兴许过些时候就会用的上,在加上Hadoop开发M/R、部署M/R,以及升级Hadoop等等等,由此看来有必要花点心思对Hadoop的安装目录规划一番。
我安装Hadoop的Windows是一个虚拟机,并且只创建了一个分区,所以hadoop文件夹就放在C盘的根目录了。以下是我的目录结构:
Hadoop在C盘的根目录下,下面有code(存放代码)、deploy(放hadoop及生态圈的安装文件)、sysdata(存放dfs数据、SecondNameNode源数据以及运行期间的临时文件存放目录)。
将下载的hadoop-1.2.1-bin.tar.gz解压到目录c:\hadoop\deploy\hadoop-1.2.1
2.4添加Hadoop基本配置
Hadoop最完整的配置还得开官方文档,我这里只配置了一些基本的配置供参考:
注:因为我的hadoop安装在C盘,所以以下XML配置文件中配置路径的根都是C盘根目录。例如:/hadoop/sysdata运行过程中翻译过来就是:c:\hadoop\sysdata。Shell脚本中配置路径的根是虚拟Linux的根目录/。例如:/cygdrive/c/jdk1.6.0_14指向:c:\jdk1.6.0_14。
2.4.1conf/hadoop-env.sh
添加JAVA_HOME:
export JAVA_HOME=/cygdrive/c/jdk1.6.0_14
2.4.2conf/core–site.xml
<?xml version=”1.0″?>
<?xml-stylesheet type=”text/xsl” href=”configuration.xsl”?>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://172.16.128.239:9001</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop/sysdata/</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>fs.checkpoint.dir</name>
<value>/hadoop/sysdata/namesecondary/</value>
</property>
<property>
<name>dfs.web.ugi</name>
<value>lg,lg</value>
</property>
<property>
<name>fs.checkpoint.period</name>
<value>3600</value>
<description>set to 1 hour by default, specifies the maximum delay between two consecutive checkpoints</description>
</property>
<property>
<name>fs.checkpoint.size</name>
<value>67108864</value>
<description>set to 64MB by default, defines the size of the edits log file that forces an urgent checkpoint even if the maximum checkpoint delay is not reached.</description>
</property>
</configuration>
2.4.3hdfs-site.xml
<?xml version=”1.0″?>
<?xml-stylesheet type=”text/xsl” href=”configuration.xsl”?>
<!– Put site-specific property overrides in this file. –>
<configuration>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.datanode.max.xcievers</name>
<value>4096</value>
<description>
DataNode 同时处理文件的上限
</description>
</property>
<!–property>
<name>dfs.http.address</name>
<value>0.0.0.0:50070</value>
</property–>
</configuration>
2.4.4mapred-site.xml
<?xml version=”1.0″?>
<?xml-stylesheet type=”text/xsl” href=”configuration.xsl”?>
<!– Put site-specific property overrides in this file. –>
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>172.16.128.239:9002</value>
</property>
</configuration>
2.4.5masters
localhost
2.4.6slaves
localhost
2.5格式化NameNode
在以上配置文件完成后,我们可以开始对namenode进行格式化了,这是hadoop开始使用的第一步,就像我们对硬盘进行格式化操作一样。打开Cygwin终端执行以下命令:
cd /cygdrive/c/hadoop/deploy/hadoop-1.2.1/bin
./hadoop namenode –format
如图:
2.6启动测试Hadoop
格式化完NameNode后,我们就可以执行start-all.sh命令来启动hadoop了。如下:
执行: ./start-all.sh
打开浏览器访问HDFS监控界面
2.8Hadoop使用积累
2.8.1访问远程NameNode节点:
./hadoop dfs -fs 172.16.128.239:9001 -ls /user/lg/event_videos/2013/09/
2.8.2HDFS的权限相关
- 超级用户
超级用户即运行name node进程的用户。宽泛的讲,如果你启动了name node,你就是超级用户。超级用户干任何事情,因为超级用户能够通过所有的权限检查。没有永久记号保留谁过去是超级用户;当name node开始运行时,进程自动判断谁现在是超级用户。HDFS的超级用户不一定非得是name node主机上的超级用户,也不需要所有的集群的超级用户都是一个。同样的,在个人工作站上运行HDFS的实验者,不需任何配置就已方便的成为了他的部署实例的超级用户。另外,管理员可以用配置参数指定一组特定的用户,如果做了设定,这个组的成员也会是超级用户。
Web服务器用户
Web服务器的身份是一个可配置参数。Name node并没有真实用户的概念,但是Web服务器表现地就像它具有管理员选定的用户的身份(用户名和组)一样。除非这个选定的身份是超级用户,否则会有名字空间中的一部分对Web服务器来说不可见。
- 配置参数
dfs.permissions = true
如果是true,打开权限检查。如果是false,关闭权限检查,但是其他的行为没有改变。这个配置参数的改变并不改变文件或目录的模式、所有者和组等信息。
不管权限模式是开还是关,chmod,chgrp 和chown 总是会检查权限。这些命令只有在权限检查背景下才有用,所以不会有兼容性问题。这样,这就能让管理员在打开常规的权限检查之前可以可靠地设置文件的所有者和权限。
dfs.web.ugi = webuser,webgroup
Web服务器使用的用户名。如果将这个参数设置为超级用户的名称,则所有Web客户就可以看到所有的信息。如果将这个参数设置为一个不使用的用户,则Web客户就只能访问到“other”权限可访问的资源了。额外的组可以加在后面,形成一个用逗号分隔的列表。
dfs.permissions.supergroup = supergroup
超级用户的组名。
dfs.upgrade.permission = 777
升级时的初始模式。文件永不会被设置x权限。在配置文件中,可以使用十进制数51110。
dfs.umask = 022
umask参数在创建文件和目录时使用。在配置文件中,可以使用十进制数1810。
- 创建目录时默认的用户和组
创建目录的所属用户默认为当前创建者,即在类Unix系统中执行命令whoami所得到的用户名,所属组为上级目录的组。