主要模块:
HDFS: namenode 存放文件系统元数据;datanode 存放文件。
- apt-get install openjdk-8-jdk
- export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"
-
下载 和解压 hadoop2.7.3 到 /opt/hadoop-2.7.3 目录下。测试一下:
- cd /opt/hadoop-2.7.3
- bin/hadoop
-
单节点运行 hadoop 有两种模式:
默认情况下,hadoop运行在非分布式模式下,用于调试:
- $ mkdir input
- $ cp etc/hadoop/*.xml input
- $ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep input output 'dfs[a-z.]+'
- $ cat output/*
-
上述代码扫码input目录,创建并输出到了output目录下。
编辑配置文件etc/hadoop/core-site.xml:
- <configuration>
- <property>
- <name>fs.defaultFS</name>
- <value>hdfs://localhost:9000</value>
- </property>
- </configuration>
-
etc/hadoop/hdfs-site.xml:
- <configuration>
- <property>
- <name>dfs.replication</name>
- <value>1</value>
- </property>
- </configuration>
-
hadoop的伪分布模式运行时需要SSH到localhost。下面的操作使ssh可以访问localhost,有两种方式:
- $ ssh-copy-id localhost (方式1:ssh原生的方式)
- $ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys (方式2:直接操作文本文件)
-
可以通过查看 ~/.ssh/authorized_keys文件中的内容来了解ssh授权的原理,就把信任节点的公钥放入了authorized_keys而已。 测试一下:
- $ ssh localhost 或者ssh root@localhost
-
发现不再提示输入密码。执行exit返回到原来的上下文。关于SSH的其他知识可参考 SSH 入门。
格式化HDFS:
- bin/hdfs namenode -format
-
编辑$HADOOP_PREFIX/etc/hadoop目录下的hadoop-env.sh,设置JAVA_HOME:
- # export JAVA_HOME=${JAVA_HOME}
- export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"
-
启动NameNode和DataNode两个守护进程:
- $ sbin/start-dfs.sh
- $ curl http://localhost:50070/ (测试一下NameNode的web接口,也可以用浏览器访问这个web接口)
-
在HDFS上创建执行MapReduce作业需要的目录:
- $ bin/hdfs dfs -mkdir /user
- $ bin/hdfs dfs -mkdir /user/root (root是当前用户)
-
将输入从本地文件系统复制到HDFS中:
- $ bin/hdfs dfs -put etc/hadoop input (在HDFS中的绝对地址是/user/root/input)
-
执行例子的MapReduce:
- $ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep input output 'dfs[a-z.]+'
-
输出是hfds中的/user/root/output目录。
有两种方式查看输出结果。首先,是将文件从HDFS复制到本地文件系统:
- $ bin/hdfs dfs -get output output
- $ cat output/*
-
直接查看HDFS中结果:
- $ bin/hdfs dfs -cat output/*
-
最后,停止NameNode和DataNode:
- $ sbin/stop-dfs.sh
-
需要在集群的所有节点上下载和解压hadoop的二进制包(200多M)。这里使用2.7.3版本(稳定版),下载路径参考上文的单节点安装hadoop。
NameNode和ResourceManager各占一台机器,这是主节点。而其他服务根据负载情况,可能运行在专用硬件上,也可能运行在共享基础设施上。
集群中的剩余机器可充当 DataNode和NodeManager,这些是从节点。
HDFS daemons由NameNode, SecondaryNameNode,和DataNode组成。 YARN damones由ResourceManager, NodeManager,和WebAppProxy组成. 如果使用MapReduce,那么MapReduce Job History Server也需要运行。大规模集群下,通常都运行在专门的服务器上。
使用bento/ubuntu-16.10这个vagrant box创建了3个VM,分别是big1、big2、big3。计划使用big1充当NameNode。
使用SSH入门中的方法,使上述三个节点之间可以互相免密码SSH(3个节点共执行了9次ssh-copy-id,包括localhost)。
在/etc/profile.d/目录下建立一个my-hadoop.sh的文件(该目录下的脚本会在linux启动后自动执行):
- JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
- export JAVA_HOME
- HADOOP_PREFIX=/opt/hadoop-2.7.3
- export HADOOP_PREFIX
- HADOOP_CONF_DIR=$HADOOP_PREFIX/etc/hadoop
- export HADOOP_CONF_DIR