hadoop伪分布式模式实现

一台机器的各个进程上运行hadoop多个模块,但并不是真正的分布式,因为是一台机器。但是HDFS和MapReduce,还有yarn等模块都运行起来了。因此掌握伪模式的配置较为重要。

一、创建用户使用hadoop框架

useradd hadoop
passwd hadoop

然后给hadoop以root的权限,这样比较方便,当然真正配置分布式时不能给这么大权限。

vim /etc/sudoers

添加如下

root    ALL=(ALL)       ALL
hadoop ALL=(root) NOPASSWD:ALL

选择NOPASSWD,也就是用hadoop用户执行命令时,不需要输入密码。

然后切换成hadoop用户:

su - hadoop

创建存放hadoop模块的目录,并更改目录的所有者:

sudo mkdir /opt/modules
sudo chown -R hadoop:hadoop /opt/modules


二、解压并配置hadoop

首先复制hadoop压缩包至/opt/modules目录下。并解压:

cd /opt/modules
var -xvf hadoop-2.6.5.tar.gz

然后进行环境变量的配置:

sudo vim /etc/profile
export HADOOP_HOME="/opt/modules/hadoop-2.5.0"
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

然后执行source /etc/profile 或者直接注销当前用户即可。推荐使用后者

验证是否成功:echo $HADOOP_HOME

然后, 配置 hadoop-env.sh文件的JAVA_HOME参数:

sudo vim $HADOOP_HOME/etc/hadoop/hadoop_env.sh

修改JAVA_HOME参数:

export JAVA_HOME="/usr/java/jdk1.8.0_161"

接着,配置core-site.xml

sudo vim {HADOOP_HOME}/etc/hadoop/core-site.xml

在<configuration></configuration>中,加入以下参数:

<configuration>
 <property>
  <name>fs.defaultFS</name>
  <value>hdfs://localhost:9000</value>
 </property>
 <property>
  <name>hadoop.tmp.dir</name>
  <value>/opt/data/tmp</value>
 </property>
</configuration>

第一个property是设置HDFS的默认地址,这里设置为localhost:9000

第二个property设置的是Hadoop的临时目录,比如HDFS的namenode的数据都放在这个目录下。

默认的hadoop.tmp.dir/tmp/hadoop-${user.name},此时有个问题就是NameNode会将HDFS的元数据存储在这个/tmp目录下,如果操作系统重启了,系统会清空/tmp目录下的东西,导致NameNode元数据丢失,是个非常严重的问题,所有我们应该修改这个路径。

创建临时目录
sudo mkdir -p /opt/data/tmp

将目录的所有者修改为hadoop

sudo chown –R hadoop:hadoop /opt/data/tmp
然后修改hadoop.tmp.dir
 <property>
   <name>hadoop.tmp.dir</name>
    <value>/opt/data/tmp</value>
  </property>


三、配置、格式化,启动HDFS

首先配置hdfs-site.xml

sudo vim ${HADOOP_HOME}/etc/hadoop/hdfs-site.xml

在configuration结构体中插入如下内容:

    <property>
       <name>dfs.replication</name>
       <value>1</value>
    </property>

dfs.replication配置的是HDFS存储时的备份数量,因为这里是伪分布式环境只有一个节点,所以这里设置为1。默认是3

然后格式化hdfs

hdfs namenode –format

格式化是对HDFS这个分布式文件系统中的DataNode进行分块,统计所有分块后的初始元数据的存储在NameNode中。

格式化后,查看core-site.xml里hadoop.tmp.dir(本例是/opt/data目录)指定的目录下是否有了dfs目录,如果有,说明格式化成功。

ll /opt/data/tmp/dfs/name/current

启动namenode

${HADOOP_HOME}/sbin/hadoop-daemon.sh start namenode

也可以直接运行hadoop-daemon.sh脚本,而不用加路径。因此sbin已经放在PATH环境变量中了。

启动DataNode

${HADOOP_HOME}/sbin/hadoop-daemon.sh start datanode

启动SecondaryNameNode

${HADOOP_HOME}/sbin/hadoop-daemon.sh start secondarynamenode

可以利用jps命令查看是否已经启动成功。

jps
3034 NameNode
3233 Jps
3193 SecondaryNameNode
3110 DataNode


四、在HDFS上测试上传,下载文件

首先HDFS上创建目录

${HADOOP_HOME}/bin/hdfs dfs -mkdir /demo1

上传本地文件到HDFS上

${HADOOP_HOME}/bin/hdfs dfs -put ${HADOOP_HOME}/etc/hadoop/core-site.xml /demo1

这是将本地的core-site.xml 上传到/demo1目录上

读取HDFS上的文件内容

${HADOOP_HOME}/bin/hdfs dfs -cat /demo1/core-site.xml

然后可从HDFS上下载文件到本地当前目录:

hdfs dfs -get /demo1/core-site.xml


五、配置启动YARN

首先,配置mapred-site.xml
默认没有mapred-site.xml文件,但是有个mapred-site.xml.template配置模板文件。复制模板生成mapred-site.xml。

cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml

然后打开该xml并添加如下配置:

<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

这是指定MapReduce运行在yarn框架上。

然后配置yarn-site.xml

添加配置如下:

<property>
  <name>yarn.nodemanager.aux-services</name>
  <value>mapreduce_shuffle</value>
</property>
<property>
    <name>yarn.resourcemanager.hostname</name>
    <value>localhost</value>
 </property>

第一个property是配置了yarn的默认混洗方式,选择为mapreduce的默认混洗算法。

第二个property是指定了Resourcemanager运行在哪个节点上,由于这里只有一个节点localhost,因此就选择localhost。

配置完毕后,启动Resourcemanager和nodemanager,都是yarn上的。

${HADOOP_HOME}/sbin/yarn-daemon.sh start resourcemanager
${HADOOP_HOME}/sbin/yarn-daemon.sh start nodemanager

之后,利用jps命令查看服务是否开启:jps

3034 NameNode
4439 NodeManager
4197 ResourceManager
4543 Jps
3193 SecondaryNameNode
3110 DataNode

可以看到resourcemanager和nodemanager都成功启动了,注意这里6个服务缺一不可。

可以通过yarn的服务界面查看:http://localhost:8088.



六、运行MapReduce Job

在Hadoop的share目录里,自带了一些jar包,里面带有一些mapreduce实例小例子,位置在share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar,可以运行这些例子体验刚搭建好的Hadoop平台,我们这里来运行最经典的WordCount实例。

首先创建要用的input文件:

1.在HDFS上创建一个目录作为输入文件的存放点:

bin/hdfs dfs -mkdir -p /wordcountdemo/input

2.在本地创建原始文件

sudo vim ./data.input

然后输入文本:

hadoop mapreduce hive
hbase spark storm
sqooq hadoop hive
spark hadoop

3.将data.input文件上传到HDFS上:

 bin/hdfs dfs -put ./data.input /wordcountdemo/input

然后运行WordCount MapReduce Job

bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar wordcount /wordcountdemo/input /wordcountdemo/output

并把结果输出到HDFS上的/wordcountdemo/output文件夹中。

然后查看output文件夹:

bin/hdfs dfs -ls /wordcountdemo/output

output目录中有两个文件,_SUCCESS文件是空文件,有这个文件说明Job执行成功。

part-r-00000文件是结果文件,其中-r-说明这个文件是Reduce阶段产生的结果,mapreduce程序执行时,可以没有reduce阶段,但是肯定会有map(映射)阶段,如果没有reduce(归并)阶段这个地方有是-m-。

查看文件内容:

bin/hdfs dfs -cat /wordcountdemo/output/part-r-00000
hadoop  3
hbase   1
hive    2
mapreduce       1
spark   2
sqoop   1
storm   1

可以看出结果已经归并并按键值排好序了。



七、停止hadoop

sbin/hadoop-daemon.sh stop namenode
sbin/hadoop-daemon.sh stop datanode
sbin/yarn-daemon.sh stop resourcemanager
sbin/yarn-daemon.sh stop nodemanager





posted on 2018-04-12 21:02  sichenzhao  阅读(220)  评论(0编辑  收藏  举报

导航