经过半个星期的折腾,终于搭起来一个hadoop-2.4.0 3节点的集群,跑了个wordcount例程,回过头来总结一下。
1. 准备工作
在安装hadoop之前有很多东西需要做。
1.1 创建分布式用户
hadoop 要求所有的机器有相同的用户名,这时hadoop最基本的要求,我取的名字是hdusr。
sudo useradd hdusr
在ubuntu下这个命令会自动创建一个同名字的用户组,但是suse则不同,这个命令只是创建了hdusr用户,没有它的分组,这个时候需要手动的创建同名group:
sudo groupadd hdusr
然后修改把hdusr用户加入到hdusr用户组中:
可以直接修改/etc/group文件,在hdusr用户组后面添加上hdusr就行了。当然也可以使用命令行来做,但是其实命令行也是去修改/etc/group文件和/etc/passwd文件,直接用vim修改就行了。更简单。
好了,从现在开始,下面所有的步骤你都应该在hdusr下面去做,尽管我不知道不这么做有什么不行,但是我还是建议你这么做。
1.2 java环境
要求安装jdk6及以上版本。推荐jdk6和jdk7. 安装方法网上很多,我就不赘述了。简单的说就是就是解压,修改/etc/profile,source /etc/profile。
1.3 maven环境
maven是用来编译hadoop安装文件的,64位的hadoop与32位的不同,需要在自己的机器上本地编译,要下载一些依赖库,不同的机器环境可能不太一样,所以最好还是在自己的机器上编译源文件。
大家可以执行一下 mnv -v
命令看看自己是什么版本的,我装的是maven-3.2.1。
安装的方法非常简单,就是下载,解压到制定地方,例如/usr/local,修改环境变量
export MAVEN_HOME=/usr/local/maven
export PATH=$PATH:$MAVEN_HOME/bin
生效:
source /etc/profile
在这里我犯了个错误,用了
sudo apt-get install maven2
来安装,结果装了个低版本的maven.编译的时候出了问题,改成自己手动安装,配置环境变量之后发现mvn -v
的结果还是maven2
,而不是我刚刚装的maven3.2.1,原因是bash会先去/usr/bin下去找maven,如果没找到才会去/etc/profile下去找,所以即使我配置来环境变量,一样没用。其实可以用which mvn
查看bash是去哪儿取的maven命令,我解决的办法是
sudo apt-get remove maven2
1.4 protobuf环境
protobuf工具在我们编译hadoop源文件时会用到,我就不解释了,引用官方文档:
Protocol buffers are Google’s language-neutral, platform-neutral, extensible mechanism for serializing structured data – think XML, but smaller, faster, and simpler.
可以在这里下载到最新的版本protobuf-2.5.0。 安装方法:
tar -xvzf protobuf-2.5.0.tar.gz
cd protobuf-2.5.0
./configure --prefix=/usr/local/protobuf (这里是你想安装的位置)
make
make check
make install
我在执行./configure步骤的时候出了个奇怪的错误
C compiler cannot create executables
可能是因为你的linux编译器有问题,有点系统可能gcc版本比较旧。可以这样:
sudo apt-get install gcc g++
export LIBS=
export CFLAGS=
我做了之后发现还是没用,最后是切换到root用户下执行./configue等,我是受到有同学说可能是权限问题造成的,我表示怀疑,anyway,总算是解决了。
修改/etc/profile:
export PATH=$PATH:/usr/local/protobuf/bin
export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig
生效:
source /etc/profile
配置动态链接库:
sudo vim /etc/ld.so.conf
(在后面插入):
include /usr/local/protobuf/lib
su #root 权限
ldconfig
测试,查看版本:
protoc --version
如果显示:libprotoc 2.5.0
你就妥了。
2 配置 /etc/hosts和/etc/hostname
2.1 主机名
先为每台机器取个主机名,这是为了用ssh命令的时候可以用主机名代替网址,方便输入。主机名是保存在/etc/hostname文件中的。 我为集群设置的主机名为:
- master
- hdslave1
- hdslave2
分别到各个机器上修改/etc/hostname即可。
2.2 /etc/hosts
打开/etc/hosts 插入下面三行。
10.103.12.243 master
10.103.12.80 hdslave1
10.103.15.75 hdslave2
这一步是在每个机器上都要做的,并且是一样的。
做完这一步之后,机器互相之间应该能用类似于 ping hdslave1
这样的主机名ping通。
3 配置SSH
hadoop控制脚本是通过ssh来执行针对整个集群的操作的,需要允许hadoop用户无需输入密码即可访问到集群内的机器,方法是:在master上创建一对公玥/私玥,并将master上的公玥拷贝到各个slave上。 master:
scd /home/hduser
sudo mkdir .ssh(如果没有这个文件的话)
ssh-keygen -t rsa (会创建一对公玥/私玥)
cat .ssh/id_rsa.pub >> .ssh/authorized_keys(创建authorized_keys文件,并写入公玥)
测试一下:
ssh localhost
第一次应该是有提问,回答yes即可,以后登录就应该会免问答了。
slave 步骤跟master一样,不同地方在于是将master的id_rsa.pub 拷贝到其authorized_keys中。 测试 在master上分别
ssh hdslave1
ssh hdslave2
看能不能无密码登录,如果能,则说明可以了。第一次登可能要问答一下,以后就不需要了。
4 安装hadoop
4.1 编译hadoop安装包
64bit与32bit不同之处在于,64bit需要在本地编译,借助maven来完成。 首先下载源文件,我下载的是hadoop-2.4.0-src.tar.gz,解压并用maven编译:
tar -xvzf hadoop-2.4.0-src.tar.gz
cd hadoop-2.4.0-src
mvn package -Pdist,native -DskipTests -Dtar -e -X
正常应该不会有错了,如果出错了也不要慌,我安装花费的至少一半时间都在这一步上面。我就遇到了下面的错误,废了很大劲,最后看到stackoverflow上有同学说可能是权限问题。
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.6:run (create-testdirs) on project hadoop-project
我解决的方法是:
sudo chown -R hdusr /home/bupt/hadoop-2.4.0-src
果然好了。 编译的过程还取决于网速,至少两三个小时吧,这个过程就不要等啦,干点别的吧。
4.2 安装
编译好的安装包在hadoop-2.2.0-src/hadoop-dist/target/hadoop-2.4.0/
目录下 ,你需要把它拷贝到你想安装的地方,例如我的:
sudo mv hadoop-2.4.0 /usr/local/
sudo mv hadoop-2.4.0 hadoop
将hadoop文件夹的权限赋给hdusr用户:
cd /usr/local/
sudo chown -R hdusr:hdusr hadoop
4.3 Edit /etc/profile
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
4.4 Edit Hadoop environment files
- hadoop/libexec/hadoopconfig.sh 在文件的开头插入
export JAVA_HOME=/usr/lib/jvm/jdk1.6.0
- hadoop/etc/hadoop/yarn-env.sh 在文件的开头插入
export JAVA_HOME=/usr/lib/jvm/jdk1.6.0
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
4.5 建立tmp文件夹
cd /usr/local/hadoop
sudo mkdir -p tmp
4.6 配置configuration files
下面的配置对所有的机器都是一样的。
- 4.6.1 $HADOOP_CONF_DIR/core-site.xml:
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
</configuration>
fs.default.name 这是一个描述集群中NameNode结点的URI(包括协议、主机名称、端口号),集群里面的每一台机器都需要知道NameNode的地址。DataNode结点会先在NameNode上注册,这样它们的数据才可以被使用。独立的客户端程序通过这个URI跟DataNode交互,以取得文件的块列表.
hadoop.tmp.dir 是hadoop文件系统依赖的基础配置,很多路径都依赖它。
- 4.6.2 $HADOOP_CONF_DIR/hdfs-site.xml :
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
dfs.replication : 它决定着系统里面的文件块的数据备份个数。对于一个实际的应用,它 应该被设为3(这个数字并没有上限,但更多的备份可能并没有作用,而且会占用更多的空间)。少于三个的备份,可能会影响到数据的可靠性(系统故障时,也许会造成数据丢失).
dfs.permissions : If "true", enable permission checking in HDFS. If "false", permission checking is turned off, but all other behavior is unchanged. Switching from one parameter value to the other does not change the mode, owner or group of files or directories.
- 4.6.3 $HADOOP_CONF_DIR/mapred-site.xml :
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>master:9001</value>
</property>
</configuration>
mapred.job.tracker JobTracker的主机(或者IP)和端口.
- 4.6.4 $HADOOP_CONF_DIR/yarn-site.xml :
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8025</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8040</value>
</property>
</configuration>
- 4.6.5 $HADOOP_CONF_DIR/slaves 写入slave名字:
hdslave1
hdslave2
4.7 format the namenode
cd /usr/local/hadoop
bin/hadoop namenode -format
5 测试
5.1 Start Hadoop Daemons
sbin/hadoop-daemon.sh start namenode
sbin/hadoop-daemons.sh start datanode
sbin/yarn-daemon.sh start resourcemanager
sbin/yarn-daemons.sh start nodemanager
sbin/mr-jobhistory-daemon.sh start historyserver
5.2 检查进程
jps
对于master,应该有如下进程:
对于slave:
5.3 运行例程验证安装
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.0.jar randomwriter out
可以看到job已经开始map了。
5.4 网页ui
在浏览器中输入localhost:50070/dfshealth.html#tab-overview 可以看到这样的网页。
Celebrate & Congratulations!
Comments !