A: 软件环境
a) OS: Ubuntu 12.10
b) Hadoop: 1.2.1
B. 准备:
a) Windows和虚拟机Linux共享目录如果找不到,可能需要运行一下以下指令:
sudo apt-get install open-vm-dkms
sudo mount -t vmhgfs .host:/ /mnt/hgfs或者
sudo mount -t vmhgfs .host:/ /mnt
b) Vmware workstation 安装Ubuntu 12.10 LTS卡在安装Vmware Tools的界面:
在安装流程的Guest OS安装步骤时,不要选择ISO方式,而要选择"I will install the operation
system later",在后续再加载镜像,否则就会导致装完后,卡在安装Vmware Tools的界面
的问题。
c) root登录:
sudo -i
passwd
sudo -s
gedit /etc/lightdm/lightdm.conf
在文件后增加两句:
greeter-show-manual-login=true #手工输入登陆系统的用户名和密码
allow-guest=false #不允许guest登录
1. JDK安装
a) 安装目录:网上的安装JDK资料中安装目录基本有两种——/opt和/usr/local。这两个目录安装在哪里其实都无所谓,只不过在以前的linux中人们习惯将软件安装在/usr/local中。这里推荐/opt目录。
b) 配置文件:将JDK同时配置在/etc/profile和/etc/bash.bashrc中
c) 下载32位或64位JDK安装文件,形如jdk-6u37-linux-i586.bin或jdk-6u37-linux-x64.bin
d) 拷贝JDK文件到/opt目录:
# mv jdk-6u37-linux-x64.bin /opt
e) 授权,并执行:
chmod +x jdk-6u37-linux-x64.bin
./jdk-6u37-linux-x64.bin
f) 设置环境变量:
vim /etc/profile
vim /etc/bash.bashrc
在两个文件的末尾都加上下面一段
#set java environment
export JAVA_HOME=/opt/jdk1.6.0_37
export JRE_HOME=/opt/jdk1.6.0_37/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
g) 重新打开终端,测试是否安装成功:
java –version
注1:本部分参考http://www.neversaydie.cc/ubuntu-install-jdk-in-detailed/,谢谢原作者。
注2:或者可以省略以上步骤,直接:
sudo apt-get install openjdk-6-jdk
java -version
注3:Ubuntu因为默认的root账户是没有面的,所以先登录进去后,sudo -i 修改root密码,然后
再用root登录进去进行安装,文本修改等操作。
2. 安装SSH
a) 安装SSH,运行:
sudo apt-get install ssh(Ubuntu直接为openssh-server)
如果下载失败,可能要更新下下载源:
sudo gedit /etc/apt/sources.list
b) 启动服务:
sudo /etc/init.d/ssh start
c) 通过如下命令查看服务是否正确启动:
ps -e | grep ssh
d) 设置成免密码登录,生成私钥和公钥,创建一个空密钥:
ssh-keygen -t rsa -P ''"
按Enter跳过,然后
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
可以登入ssh确认以后登录时不用输入密码:
ssh localhost
3. Hadoop基本设置
a) 设定hadoop-env.sh:
进入hadoop目录,打开conf目录下到hadoop-env.sh,添加以下信息:
export JAVA_HOME=/usr/lib/jvm/java-6-openjdk (视你机器的java安装路径而定)
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:/usr/local/hadoop/bin
b) 让环境变量配置生效source:
~$ source /home/xxx/xxx/hadoop-1.2.1/conf/hadoop-env.sh
c) 在 /etc/profile和/etc/bash.bashrc加入如下的信息:
#Hadoop variables
export HADOOP_INSTALL=/home/xxx/xxx/hadoop-1.2.1 #hadoop的安装目录
export PATH=$PATH:$HADOOP_INSTALL/bin
export PATH=$PATH:$HADOOP_INSTALL/sbin
export HADOOP_MAPRED_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_HOME=$HADOOP_INSTALL
export HADOOP_HDFS_HOME=$HADOOP_INSTALL
export YARN_HOME=$HADOOP_INSTALL
export HADOOP_CONF_DIR="$HADOOP_COMMON_HOME/etc/hadoop"
###end of paste
然后注销,重新登录
d) 这个时候Hadoop已经安装完成,可以查看下Hadoop版本来检测是否正常:
hadoop version
d) 运行一下hadoop自带的例子WordCount来感受以下MapReduce过程:
在hadoop目录下新建input文件夹
~$ mkdir input
将conf中的所有文件拷贝到input文件夹中
~$ cp conf/* input
运行WordCount程序,并将结果保存到output中
~$ hadoop jar /home/xxx/xxx/hadoop-1.2.1/hadoop-examples-1.2.1.jar wordcount /home/xxx/xxx/hadoop-1.2.1/input /home/xxx/xxx/hadoop-1.2.1/output
观察结果
~$ cat output/*
4. Hadoop伪分布安装
a) 解压hadoop文件,修改配置:
conf/core-site.xml:
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
conf/hdfs-site.xml:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
conf/mapred-site.xml:
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>
b) 格式化HDFS文件系统:bin/hadoop namenode -format
c) 启动:bin/start-all.sh
d) jps查看JVM实例:
xxx TaskTracker
xxx DataNode
xxx JobTracker
xxx SecondaryNameNode
xxx Jps
xxx NameNode
e) 查看地址(可用浏览器查看):
NameNode - http://localhost:9000/
JobTracker - http://localhost:9001/
5. Hadoop全分布安装
a) 集群机器三台:
192.168.56.101 master
192.168.56.102 slave1
192.168.56.103 slave2
保证各集群机安装了java,下载hadoop安装文件
为了方便管理可创建一个特定的用户:
sudo addgroup hadoop
sudo adduser --ingroup hadoop hadoop
b) 将hadoop文件的拥有者改为hadoop用户:
sudo chown -R hadoop:hadoop hadoop
c) 通过hadoop账号配置SSH,具体过程参见上文
vim /etc/hosts
192.168.56.101 master
192.168.56.102 slave1
192.168.56.103 slave2
e) 修改/etc/hostname的主机名(如;master,slave1等)
f) 配置hadoop-env.sh的export JAVA_HOME=
以下配置的目录需要确认有权限和目录存在,否则会出现问题。
conf/core-site.xml:
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
<final>true</final>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop/tmp</value>
<final>true</final>
</property>
</configuration>
conf/hdfs-site.xml:
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
<final>true</final>
</property>
<property>
<name>dfs.name.dir</name>
<value>/data/hadoop/hdfs/name</value>
<final>true</final>
</property>
<property>
<name>dfs.data.dir</name>
<value>/data/hadoop/hdfs/data</value>
<final>true</final>
</property>
</configuration>
conf/mapred-site.xml:
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>master:9001</value>
</property>
</configuration>
conf/masters:
master
conf/slaves:
slave1
slvae2
g) 最后启动hadoop:
bin/hadoop namenode -format#set java environment
bin/start-all.sh
h) 一些基本测试:
Copy the input files into the distributed filesystem:
$ bin/hadoop fs -put conf input
Run some of the examples provided:
$ bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'
Examine the output files:
Copy the output files from the distributed filesystem to the local filesytem and examine them:
$ bin/hadoop fs -get output output
$ cat output/*
View the output files on the distributed filesystem:
$ bin/hadoop fs -cat output/*
When you're done, stop the daemons with:
$ bin/stop-all.sh
PS:注意文件权限问题。。启动的适合我发现以下这个问题
WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Invalid directory in dfs.data.dir: Incorrect permission for /xxx/data, expected: rwxr-xr-x, while actual: rwxrwxr-x
通过修改文件权限解决了
注:本部分参考http://my.oschina.net/u/220934/blog/130021,谢谢原作者。
6. Eclipse基本安装
a) 下载解压:
把eclipse-java-helios-SR2-linux-gtk.tar.gz解压到某个目录中,我解压到的是/home/jay/Development,得到eclipse目录
b) 在/usr/bin目录下创建一个启动脚本eclipse,执行下面的命令来创建:
sudo gedit /usr/bin/eclipse
然后在该文件中添加以下内容:
#!/bin/sh
export MOZILLA_FIVE_HOME="/usr/lib/mozilla/"
export ECLIPSE_HOME="/home/wangxing/Development/eclipse"
$ECLIPSE_HOME/eclipse $*
c) 修改该脚本的权限,让它变成可执行,执行下面的命令:
sudo chmod +x /usr/bin/eclipse
d) 在Applications(应用程序)菜单上添加一个图标:
sudo gedit /usr/share/applications/eclipse.desktop
然后在文件中添加下列内容:
[Desktop Entry]
Encoding=UTF-8
Name=Eclipse Platform
Comment=Eclipse IDE
Exec=eclipse
Icon=/home/wangxing/Development/eclipse/icon.xpm
Terminal=false
StartupNotify=true
Type=Application
Categories=Application;Development;
7. 在Eclipse(版本3.3)上安装hadoop插件
a) 复制 hadoop安装目录/contrib/eclipse-plugin/hadoop-0.20.203.0-eclipse-plugin.jar 到eclipse安装目录/plugins/ 下
b) 重启eclipse,配置hadoop installation directory。
如果安装插件成功,打开Window-->Preferens,你会发现Hadoop Map/Reduce选项,在这个选项里你需要配置Hadoop installation directory。配置完成后退出。
c) 配置Map/Reduce Locations
在Window-->Show View中打开Map/Reduce Locations,在Map/Reduce Locations中新建一个Hadoop Location。在这个View中,右键-->New Hadoop Location。
在弹出的对话框中你需要配置Location name,如Hadoop,还有Map/Reduce Master和DFS Master。这里面的Host、Port分别为你在mapred-site.xml、core-site.xml中配置的地址及端口。
8. 在Eclipse(版本3.3以上)上安装hadoop插件
a) 目录结构:
eclipse目录: /home/jay/Development/eclipse
hadoop源码目录: /home/jay/Development/hadoop-1.2.1
b) 导入 Hadoop-eclipse 插件工程:
1. 下载hadoop-1.2.1.tar.gz,并解压缩到 /home/jay/Development/hadoop 目录下
2. 在 Eclipse 中选择 File—>Import—>General/Existing Projects into Workspace 导入Hadoop的Eclipse插件项目,选择路径为:/home/jay/Development/hadoop-1.2.1/src/contrib/eclipse-plugin,然后点击Finish,其默认的项目名称是 MapReduceTools
c) 导入所需 jar 包:
在项目 MapReduceTools 中新建 lib 目录,将 hadoop-1.2.1 下的 hadoop-core-1.2.1.jar(重命名为hadoop.core.jar),及其 lib 目录下的 commons-cli-1.2.jar、commons-lang-2.4.jar、commons-configuration-1.6.jar、jackson-mapper-asl-1.8.8.jar、jackson-core-asl-1.8.8.jar、commons-httpclient-3.0.1.jar 拷贝到该目录。
d) 修改build-contrib.xml
1. 将 /home/jay/Development/hadoop-1.2.1/src/contrib/build-contrib.xml(与 eclipse-plugin 包在同一级目录)拷贝到 MapReduceTools 项目目录中(即/home/jay/Development/hadoop-1.2.1/src/contrib/eclipse-plugin目录中)。
2. 修改 build-contrib.xml,注意路径用 "/"
<!— 修改 hadoop 存放目录—>
<property name="hadoop.root" location="/home/jay/Development/hadoop-1.2.1"/>
<!— 添加 eclipse 存放目录—>
<property name="eclipse.home" location="/home/jay/Development/eclipse" />
<!— 添加 hadoop 版本—>
<property name="version" value="1.2.1"/>
e) 修改build.xml
<!— 1.修改 build-contrib.xml 的位置,去掉"../"—>
<import file="build-contrib.xml"/>
<!— 2.添加如下,否则提示"软件包 org.apache.hadoop.fs 不存在"—>
<path id="hadoop-jars">
<fileset dir="${hadoop.root}/">
<include name="hadoop-*.jar"/>
</fileset>
</path>
<path id="classpath">
<pathelement location="${build.classes}"/>
<pathelement location="${hadoop.root}/build/classes"/>
<path refid="eclipse-sdk-jars"/>
<path refid="hadoop-jars"/> <!--这行为添加的内容-->
</path>
<!— 3.修改并添加 jar 包拷贝,有些内容已存在,只添加不存在内容—>
<target name="jar" depends="compile" unless="skip.contrib">
<mkdir dir="${build.dir}/lib"/>
<copy file="${hadoop.root}/hadoop-core-${version}.jar" tofile="${build.dir}/lib/hadoop-core.jar" verbose=""true"/>
<copy file="${hadoop.root}/lib/commons-cli-1.2.jar" todir="${build.dir}/lib" verbose="true"/>
<copy file="${hadoop.root}/lib/commons-lang-2.4.jar" todir="${build.dir}/lib" verbose="true"/>
<copy file="${hadoop.root}/lib/commons-configuration-1.6.jar" todir="${build.dir}/lib" verbose="true"/>
<copy file="${hadoop.root}/lib/jackson-mapper-asl-1.8.8.jar" todir="${build.dir}/lib" verbose="true"/>
<copy file="${hadoop.root}/lib/jackson-core-asl-1.8.8.jar" todir="${build.dir}/lib" verbose="true"/>
<copy file="${hadoop.root}/lib/commons-httpclient-3.0.1.jar" todir="${build.dir}/lib" verbose="true"/>
<jar jarfile="${build.dir}/hadoop-${name}-${version}.jar" manifest="${root}/META-INF/MANIFEST.MF">
<fileset dir="${build.dir}" includes="classes/ lib/"/>
<fileset dir="${root}" includes="resources/ plugin.xml"/>
</jar>
</target>
f) 修改META-INF/MANIFEST.MF文件,在原有的Bundle-ClassPath处增加以下内容(有的已经存在就不用改了):
Bundle-ClassPath: classes/,
lib/hadoop-core.jar,
lib/commons-cli-1.2.jar,
lib/commons-httpclient-3.0.1.jar,
lib/jackson-core-asl-1.8.8.jar,
lib/jackson-mapper-asl-1.8.8.jar,
lib/commons-configuration-1.6.jar,
lib/commons-lang-2.4.jar
g.1) Eclipse中Ant 编译:
1. 右键 MapReduceTools 工程,Properties—>Builders—>New—>Ant Builder
2. 修改New_Builder编辑界面中的内容
Name (见名知意): plugin_Builder
Buildfile (build.xml的位置): /home/jay/Development/hadoop-1.2.1/src/contrib/eclipse-plugin/build.xml
3. 修改完成保存
4. 点击Project—>Build Project进行生成
编译成功会输出 BUILD SUCCESSFUL 则表示生成成功。
注:这步如果产生错误,可能的原因有:
1) Build Path里面*.jar包名可能不对,需要修改一下。
2)
g.2) 直接Ant 编译:
1) # sudo apt-get install ant
2) # cd /home/jay/Development/hadoop-1.2.1/src/contrib/eclipse-plugin
3) # ant jar
h) 安装插件
编译结果在 /home/jay/Development/hadoop-1.2.1/build/contrib/eclipse-plugin 目录下,将 hadoop-eclipse-plugin-1.2.1.jar 放入 /home/jay/Development/eclipse/plugins 目录下,重启 eclipse
i) 配置插件
1. 打开 map/Reduce Locations(通过新建一个Map/Reduce项目即可),或者通过Windows->Open Prespective->Other,将出现以下窗口,选择Map/Reduce即可
然后Eclipse的界面布局转换成了Map/Reduce模式,并在IDE的下面出现以下界面
2. 右键 New Hadoop Location…,输入 Location Name(见名知意),修改 Map/Reduce Master 和 DFS Master,User name 设置为你启动 hadoop 的名称。
其中(这里我使用的都是默认的端口)
Map/Reduce Master(Job Tracker的IP和端口,根据mapred-site.xml中配置的mapred.job.tracker来填写)
DFS Master(Name Node的IP和端口,根据core-site.xml中配置的fs.default.name来填写)
3. 设置 Advanced parameters
修改 hadoop.tmp.dir 为你 hadoop 集群中设置的目录
4. 设置默认的hadoop安装目录
在Eclipse中点击Windows->Preferences->Hadoop Map/Reduce,修改Hadoop installation directory为Hadoop的安装目录
9. Eclipse中新建测试项目
a) File-->New-->Other-->Map/Reduce Project,项目名可以随便取,如WordCount。
复制 hadoop安装目录/src/example/org/apache/hadoop/examples/WordCount.java到刚才新建的项目WordCount下,删除WordCount.java首行package
b) 在本地新建word.txt,内容为:
java c++ python cjava c++ javascript helloworld hadoopmapreduce java hadoop hbase
c) 通过hadoop的命令在HDFS上创建/tmp/workcount目录,命令如下:
hadoop fs -mkdir /tmp/wordcount
通过copyFromLocal命令把本地的word.txt复制到HDFS上,命令如下:
hadoop fs -copyFromLocal /home/jay/Development/eclipseWorkspace/word.txt /jay/wordcount/word.txt
d) 运行项目
(1). 在新建的项目Hadoop,点击WordCount.java,右键-->Run As-->Run Configurations
(2). 在弹出的Run Configurations对话框中,点Java Application,右键-->New,这时会新建一个application名为WordCount
(3). 配置运行参数,点Arguments,在Program arguments中输入你要传给程序的输入文件夹和你要求程序将计算结果保存的文件夹,如:
hdfs://localhost:9000/tmp/wordcount/word.txt hdfs://localhost:9000/tmp/wordcount/out
(4). 点击Run,运行程序,过段时间将运行完成,等运行结束后,查看例子的输出结果,使用命令:
hadoop fs -ls /tmp/wordcount/out
发现有两个文件夹和一个文件,使用命令查看part-r-00000里的运行结果:
hadoop fs -cat /tmp/wordcount/out/part-r-00000