ubuntu下搭建hadoop伪分布式模式
搭建的单机操作系统配置如下图:
第一步为设置ssh免密码登陆(如果没有ssh,则需要提前安装ssh, 终端下输入命令: sudo apt-get install openssh-server)
终端下执行:ssh-keygen -t rsa 一路回车就行,该命令会在你的当前用户下生成一个.ssh文件夹,下面包含两个文件 id_rsa和id_rsa.pub两个文件
接着复制id_rsa.pub 到.ssh目录下的authorized_keys,执行命令cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys即可
验证:本机下输入 ssh 本机IP或者别名 就能免密码登陆成功
第二步 修改hostname以及设置ip与hostname(主机名)绑定(如果是用localhost 配置,则掉过这一步骤)
ubuntu下hostname是在文件/etc/hostname下配置的,打开/etc/hostname,修改为主机名为hadoopserver,修改为hadoopserver后,需要立即修改ip与hostname的绑定,编辑/etc/hosts 注释掉先前的主机名对应的ip地址(必须做),添加 192.168.1.234(你的Ip地址) hadoopserver 配置完成后需要重启
验证:
终端输入hostname -i 显示你配置的主机名;ping 主机名 会进行解析为IP地址(对应正确即为配置正确)
第三步 安装hadoop,官网上面下载hadoop1.2.1版本,下载完成后解压缩,
在用户目录下建立software文件夹,在该文件夹下建立到解压缩后的hadoop目录的软链接
修改hadoop目录下conf目录下的hadoop-env.sh文件,制定本机的java运行环境
export JAVA_HOME=your java 运行环境目录(如果你设置了环境变量,则不用修改该文件)
接着修改3个文件: core-site.xml hdfs-site.xml mapred-site.xml文件,三个文件均在conf下
core-site.xml
core-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>fs.default.name</name> <value>hdfs://hadoopserver(可以配置为localhost,或者你上步骤配置的主机名):9000</value> </property> </configuration>
hdfs-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.replication</name> <value>1</value> </property> <property> <name>dfs.permissions</name> <value>false</value> </property> </configuration>
mapred-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>hadoopserver(此处可以是localhost 或者你配置的主机名):9001</value> </property> </configuration>
第四步 启动hadoop
启动hadoop 首先第一步要进行格式化 切换到hadoop目录 执行 bin/hadoop namenode -format(每次启动不需要都执行格式化,但是如果配置太简单,则系统重启后,启动hadoop则需要重新进行格式化)
出现如下,则格式化成功
14/12/21 22:54:31 INFO namenode.FSEditLog: closing edit log: position=4, editlog=/tmp/hadoop-fengfu/dfs/name/current/edits 14/12/21 22:54:31 INFO namenode.FSEditLog: close success: truncate to 4, editlog=/tmp/hadoop-fengfu/dfs/name/current/edits 14/12/21 22:54:32 INFO common.Storage: Storage directory /tmp/hadoop-fengfu/dfs/name has been successfully formatted. 14/12/21 22:54:32 INFO namenode.NameNode: SHUTDOWN_MSG: /************************************************************ SHUTDOWN_MSG: Shutting down NameNode at hadoopserver/192.168.1.234 ************************************************************/
接下来执行bin/start-all.sh 启动Hadoop
命令执行完成后,可以使用java的jps查看是否全部启动起来,如下
fengfu@hadoopserver:~/software/hadoop-1.2.1$ jps 5694 SecondaryNameNode 6083 Jps 5965 TaskTracker 5806 JobTracker 5529 DataNode 5376 NameNode
或者浏览器上验证:
http://hadoopserver:50070
http://hadoopserver:50030
如果没有启动起来,可以到hadoop目录下的logs目录下查看输出日志,进行调试(当然可以配置logs的位置,不一定在Logs目录下)
本人配置碰到的问题
1 ubuntu下有默认的主机名,而我使用了hadoopserver,虽然我配置了/etc/hosts (ubuntu下主机名绑定的ip为127.0.1.1)但是没有修改hostname导致进行格式化的时候出问题(没有报错误,只是在eclipse下配置Hadoop的时候老是出错),因为格式化的时候默认使用的是主机名,如下图:
STARTUP_MSG: Starting NameNode STARTUP_MSG: host = hadoopserver/192.168.1.234 STARTUP_MSG: args = [-format] STARTUP_MSG: version = 1.2.1 STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/common/branches/b
2 系统每次启动后,都启动不起来hadoop,主要就是因为没有进行格式化,而系统重启后,需要重新格式化,则是因为hadoop格式化后的文件系统目录在/tmp文件夹下,如下图:
14/12/21 22:54:31 INFO common.Storage: Image file /tmp/hadoop-fengfu/dfs/name/current/fsimage of size 112 bytes saved in 0 seconds. 14/12/21 22:54:31 INFO namenode.FSEditLog: closing edit log: position=4, editlog=/tmp/hadoop-fengfu/dfs/name/current/edits 14/12/21 22:54:31 INFO namenode.FSEditLog: close success: truncate to 4, editlog=/tmp/hadoop-fengfu/dfs/name/current/edits 14/12/21 22:54:32 INFO common.Storage: Storage directory /tmp/hadoop-fengfu/dfs/name has been successfully formatted.
每次系统重启后,这个文件夹下的东西都清空,所以每次系统重启后启动hadoop都需要进行重新格式化,不重启则就不需要,建议在配置文件中重新指定hadoop文件系统的位置,不要放在/tmp下,每次格式化后都会丢失hdfs里面存储的数据
3 推荐使用主机名进行配置Hadoop是因为如果想配置集群的话,不用localhost是因为如果配置真分布式,则还需要修改掉配置文件中的localhost.