尝试hadoop的单机环境搭建

近来关注大数据,云计算等相关技术,把Google的三大论文看了一遍,作为非计算机科班的同学,看得有点云里雾里,看了不少书才略微理清楚现在这些流行的大数据框架之间的关系。

Hadoop便是其中一个非常吸引我的框架,打算对其环境进行配置,其中走了不少弯路,想写点记录一下。

首先,要讨论的是OpenJDK与SunJDK,网上的大堆教程基本都是清一色的要安装SunJDK,为何呢?因为JDK的开源版在1.6.0版本之前,与SunJDK还有一些不同,不能很好的支持hadoop,但在1.6.0版本之后,就可以很好的支持了。

为何要提到这个呢?因为很多系统默认装的就是OpenJDK,如果换成SunJDK,可能会麻烦很多,当然,你可以在有OpenJDK的情况下依旧装上SunJDK,用alternative命令来设置版本,显然这样麻烦许多。比如我对我的linux分盘不够大,我不希望资源被浪费,所以我只愿意安装其中一种。

这里提一下我所走的弯路,我首先卸载了OpenJDK(用不考虑依赖关系的命令),装上SunJDK之后,我又知道了其实OpenJDK不影响,于是我删了SunJDK,重新装了OpenJDK (我是不是太折腾了)

其次,要设置好Java的环境变量,vim /etc/profile

1
2
3
4
5
6
# SET JAVA Environment OpenJDK
JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk/
JRE_HOME=/usr/lib/jvm/java-1.7.0-openjdk/
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export JAVA_HOME JRE_HOME PATH CLASSPATH

然后,ssh,其实这个我早就安装了。SSH有什么作用呢?一般我们相互访问,都需要输入口令,而SSH则产生一个钥匙,这个钥匙可以自动作为具有访问权限的标识,我们就不需要再去手动的输入命令了,然程序自动调用这个钥匙去开锁吧(这样解释应该是对的吧)

最后,就是hadoop了,可分为几个步骤来讲解

1)添加组和用户:其实这个步骤未必一定需要,但为了计算产生的各种数据不要“污染”你自个的用户区,就建一个账户专门来处理吧。而且,如果是集群的,为了更好编号什么的,一般创建一个易于管理识别的账户。

账户和组的创建可以自己探索了,ubuntu和fedora是不一样的,但都比较容易,注意要添加sudo权限

2)解压hadoop的包,假设创建的用户为hadoop,解压至/home/hadoop/hadoop文件夹下,然后设置hadoop的环境变量,同样vim /etc/profile

1
2
3
4
5
6
7
8
9
# SET For HADOOP
export HADOOP_DEV_HOME=/home/hadoop/hadoop
export PATH=$PATH:$HADOOP_DEV_HOME/bin
export PATH=$PATH:$HADOOP_DEV_HOME/sbin
export HADOOP_MAPARED_HOME=${HADOOP_DEV_HOME}
export HADOOP_COMMON_HOME=${HADOOP_DEV_HOME}
export HADOOP_HDFS_HOME=${HADOOP_DEV_HOME}
export YARN_HOME=${HADOOP_DEV_HOME}
export HADOOP_CONF_DIR=${HADOOP_DEV_HOME}/etc/hadoop

记住这里改完,应该以hadoop用户身份,进行source,才会生效

1
source /etc/profile

3)配置xml文件
需要配置的xml文件包括:core-site.xml, hdfs-site.xml, mapred-site.xml(这个好似没有这个文件,有个文件叫做mapred-site.xml.template吧,拷贝一个并命名为mapred-site.xml), yarn-site.xml
这四个xml的作用目前我还不是特别清楚,看起来像是部署数据存取的位置以及node的命名,如下配置:(注:上面类似:file:/home/hadoop/dfs/name的目录我都手动创建了,不知运行时它会否自动创建)

core-site.xml

1
2
3
4
5
6
7
8
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:8020</value>
<description> The name of the default file system</description>
<final>true</final>
</property>
</configuration>

hdfs-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/dfs/name</value>
<description>Determines where on the local filesystem the DFS name node should store the name table. If this is a comma-delimited list of directories then the name table is replicated in all of the directories, for redundancy. </description>
<final>true</final>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/dfs/data</value>
<description>Determines where on the local filesystem an DFS data node should store its blocks. If this is a comma-delimited list of directories, then data will be stored in all named directories, typically on different devices.Directories that do not exist are ignored
</description>
<final>true</final>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>

mapred-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapred.system.dir</name>
<value>file:/home/hadoop/mapred/system</value>
<final>true</final>
</property>
<property>
<name>mapred.local.dir</name>
<value>file:/home/hadoop/mapred/local</value>
<final>true</final>
</property>
</configuration>

yarn-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<configuration>
<!-- Site specific YARN configuration properties -->
<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>
</configuration>

4)修改hadoop-env.sh, vim /home/hadoop/hadoop/etc/hadoop/hadoop-env.sh

1
2
# export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk/

5)测试

格式化

1
hdfs namenode -format

如果出现EXIT 0,说明(应该)成功了

启动DFS

1
2
hadoop-daemon.sh start namenode
hadoop-daemon.sh start datanode

使用jps查看进程是否启动(会显示namenode和datanode)
jps类似于一个进程查看器,即查看JVM中的当前进程,这些进程的启动都会有log,可以直接去看log看有否启动成功。

1
jps

可以访问这个网页

1
http://localhost:50070/dfshealth.jsp

关闭DFS

1
2
hadoop-daemon.sh stop namenode
hadoop-daemon.sh stop datanode

EOF

关于对hadoop的尝试先就到这吧