Hadoop集群搭建
1. 首先,准备好hadoop安装包和JDK,hadoop-1.0.3的svn版本库:http://svn.apache.org/repos/asf/hadoop/common/tags/release-1.0.3/, hadoop-1.0.3的安装包地址:http://archive.apache.org/dist/hadoop/core/hadoop-1.0.3/
2. 建立后各个机器之间的ssh信任关系,假设现在有A,B两台机器,要建立起两台机器直接的信任关系,执行如下操作:
1)A机器免密码登陆到B机器
$ ssh-keygen –t rsa
$ ssh-copy-id –i ~/.ssh/id_rsa.pub hadoop@B
2) B机器免密码登陆到A机器
$ ssh-keygen –t rsa
$ ssh-copy-id –i ~/.ssh/id_rsa.pub hadoop@A
3. 修改hadoop配置文件,修改的文件包括,hadoop-env.sh , core-site.xml , hdfs-site.xml, mapred-site.xml,masters和slaves文件
需要注意的是,masteers文件中,配置的是secondary-namenode的ip地址,不要被master这个单词迷惑了,slaves中配置是需要启动datanode和tasktracker机器的IP地址。
hadoop-env.sh,必须配置JAVA_HOME的路径
core-site.xml配置文件,需要在/home/hadoop/目录下,新建hadoop_tmp文件夹,这个文件夹作为hadoop.tmp.dir参数的value。
<?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://172.18.147.69:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/hadoop_tmp/hadoop-${user.name}</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>3</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>172.18.147.69:9001</value> </property> </configuration>
masters文件没有配置任何内容,即没有secondary-namenode,如下:
slaves文件有一个IP地址,即只有一个datanode,如下:
4. 将hadoop的安装包和JDK拷贝到每一台机器上
5. 在作为namenode的机器上执行格式化namenode命令和启动集群命令:
1) ./hadoop namenode –format
2)执行启动集群的命令,./start-all.sh
6. 使用jps命令查看namenode和datanode上的进程:
1)namenode上执行jps命令后的结果:
2)datanode上执行jps命令的结果:
7. 需要无法启动namenode的情况,在~/hadoop-1.0.3/logs/目录下,查看文件:hadoop-hadoop-namenode-ubuntu.ubuntu.log, 可以发现有异常抛出:
2015-01-27 10:20:40,912 INFO org.apache.hadoop.metrics2.impl.MetricsConfig: loaded properties from hadoop-metrics2.properties 2015-01-27 10:20:40,919 INFO org.apache.hadoop.metrics2.impl.MetricsSourceAdapter: MBean for source MetricsSystem,sub=Stats registered. 2015-01-27 10:20:40,920 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: Scheduled snapshot period at 10 second(s). 2015-01-27 10:20:40,920 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: NameNode metrics system started 2015-01-27 10:20:40,923 ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: java.lang.IllegalArgumentException: Illegal character in \ scheme name at index 0: hdfs://172.18.147.69:9000 at java.net.URI.create(URI.java:859) at org.apache.hadoop.fs.FileSystem.getDefaultUri(FileSystem.java:131) at org.apache.hadoop.hdfs.server.namenode.NameNode.getAddress(NameNode.java:228) at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:262) at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:496) at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1279) at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1288) Caused by: java.net.URISyntaxException: Illegal character in scheme name at index 0: hdfs://172.18.147.69:9000 at java.net.URI$Parser.fail(URI.java:2829) at java.net.URI$Parser.checkChars(URI.java:3002) at java.net.URI$Parser.checkChar(URI.java:3012) at java.net.URI$Parser.parse(URI.java:3028) at java.net.URI.<init>(URI.java:595) at java.net.URI.create(URI.java:857) ... 6 more
经排查,原因是在配置core-site.xml中,hadoop.tmp.dir属性的时候,value值中多了空格,把空格去掉后,一切恢复正常:
8. Hadoop集群的监控页面,有HDFS是监控页面和Map/Reduce的监控页面
1)在namenode的50070端口可以看到namenode的运行情况:http://172.18.147.69:50070/dfshealth.jsp
2)在namenode的50030端口是jobtracker的状态页面,上面可以查看任务的运行情况:http://172.18.147.69:50030/jobtracker.jsp
9. Demo程序试跑
在hdfs的/input目录下随便放一个文件,
hadoop-1.0.3/目录下执行:
bin/hadoop jar hadoop-examples-1.0.3.jar wordcount /input /output
在mapreduce的监控页面上可以看到任务的执行情况:
当任务执行完后,就可以在output目录下看到执行的结果,这个例子跑的是wordcount,可以看到结果中统计了所有单词的出现次数: