title: hadoopRedHatLab2
date: 2017-04-20 10:41:02
tags: hadoop, RedHat, wordcount
---
本文中所有x xxx均为未知 须根据你得具体版本号来决定
创建用户
groupadd hadoop_user
useradd -g hadoop_user -d /home/hadoop hadoop
passwd hadoop
配置YUM源
Redhat 的更新包只对注册的用户生效,所以我们需要自己手动更改成CentOS的更新包,CentOS几乎和redhat是一样的,所以无需担心软件包是否可安装,安装之后是否有问题。
1、 首先删除redhat原有的yum ,因为redhat 原本的yum 没有注册为redhat用户是用不了的。
rpm -aq|grep yum|xargs rpm -e --nodeps
rpm -aq|grep python-iniparse|xargs rpm -e --nodeps
2、下载163的yum 安装包
wget http://mirrors.163.com/centos/7.3.1611/os/x86_64/Packages/
yum-3.4.3-150.el7.centos.noarch.rpm
wget http://mirrors.163.com/centos/7.3.1611/os/x86_64/Packages/
python-iniparse-0.4-9.el7.noarch.rpm
wget http://mirrors.163.com/centos/7.3.1611/os/x86_64/Packages/
yum-metadata-parser-1.1.4-10.el7.x86_64.rpm
wget http://mirrors.163.com/centos/7.3.1611/os/x86_64/Packages/
yum-plugin-fastestmirror-1.1.31-40.el7.noarch.rpm
3、安装下载的rpm包
rpm -ivh *.rpm
4、创建文件/etc/yum.repos.d/rhel-debuginfo.repo并写入
[base]
name=CentOS-$releasever - Base
baseurl=http://mirrors.163.com/centos/7.3.1611/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.163.com/centos/7.3.1611/os/x86_64/RPM-GPG-
KEY-CentOS-7
#released updates
[updates]
name=CentOS-$releasever - Updates
baseurl=http://mirrors.163.com/centos/7.3.1611/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.163.com/centos/7.3.1611/os/x86_64/RPM-GPG-
KEY-CentOS-7
[extras]
name=CentOS-$releasever - Extras
baseurl=http://mirrors.163.com/centos/7.3.1611/extras//$basearch/
gpgcheck=1
gpgkey=http://mirrors.163.com/centos/7.3.1611/os/x86_64/RPM-GPG-
KEY-CentOS-7
[centosplus]
name=CentOS-$releasever - Plus
baseurl=http://mirrors.163.com/centos/7.3.1611/centosplus//$basearch/
gpgcheck=1
enabled=0
6、执行命令
yum clean all
7、测试:
yum update
8、 安装 epel 源:
yum install epel-release
添加sudoer
当用户不在sudoers文件中……
处理这个问题很简单,但应该先理解其原理再操作
首先要明白root的密码一般用户是不应改知道的,但一般用户有时可能要用到root的一些权限。
这里就有了一个 /etc/sudoers文件,用来保存一些用户,使这些用户可以通过sudo命令来暂时获取root的权限。这些用户使用sudo时输入的密码是当前用户密码,而不是root密码。还可一在sudoers文件里限制一般用户的权限,这样就有了安全保证。
现在要让hadoop用户获得sudo使用权
1.切换到超级用户root
$su root
2.查看/etc/sudoers权限,可以看到当前权限为440
$ ls -all /etc/sudoers
-r--r----- 1 root root744 6月 8 10:29/etc/sudoers
3.更改权限为777
$chmod 777/etc/sudoers
4.编辑/etc/sudoers
$vi /etc/sudoers
5.在root ALL=(ALL:ALL) ALL 下面添加一行
hadoop ALL=(ALL)ALL
保存退出。
第一个ALL是指网络中的主机,我们后面把它改成了主机名,它指明jack可以在此主机上执行后 面的命令。
第二个括号里的ALL是指目标用户,也就是以谁的身份去执行命令。
最后一个ALL当然就是指命令名了。
具体这里不作说明
6.把/etc/sudoers权限改回440
$chmod 440 /etc/sudoers
7.操作完成,切换到hadoop用户测试一下
ssh免密码
cd ~/.ssh/
ssh-keygen -t rsa
这边一路回车就好
cat ./id_rsa.pub >> ./authorized_keys
test:
ssh localhost
测试一下是否免密码了
jdk环境配置
Java SE Development Kit 8 Downloads
按照实验手册的要求我们将它解压到 root/usr/java这个目录下
那么jdk用户目录是 /usr/java/java-xxx (这边视具体情况自己补全吧,下面同
设置环境变量
vim ~/.bashrc
在文件最后面加入单独一行
export JAVA_HOME=/usr/java/java-xxx
使得环境生效
source ~/.bashrc
检验配置是否正确:
echo $JAVA_HOME # 检验变量值
java -version
$JAVA_HOME/bin/java -version
如果与直接执行 java -version 一样则成功
hadoop单机配置
记得下载binary版本的
Hadoop
下载完一般没问题,如果出现了奇怪的问题强烈建议check下md5码
mkdir ~/hadoop_installs
将下载下来的安装包丢到该目录解压
tar -zxvf hadoop-2.7.x.tar.gz
测试文件是否完整,因为是编译好的,解压完就能用
cd /home/hadoop_installs/hadoop-2.7.x
./bin/hadoop version
若显示版本号 那就正常了
配置环境变量
编辑~/.bashrc
gedit ~/.bashrc
添加如下内容:
export HADOOP_HOME=/home/hadoop_installs/hadoop-2.7.x
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
保存后不要忘了执行以下命令使配置生效
source ~/.bashrc
hadoop单机运行
现在我们可以执行例子来感受下 Hadoop 的运行。Hadoop 附带了丰富的例子(运行 ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar 可以看到所有例子),包括 wordcount、terasort、join、grep 等。
在此选择运行 grep 例子,将 input 文件夹中的所有文件作为输入,筛选当中符合正则表达式 dfs[a-z.]+ 的单词并统计出现的次数,最后输出结果到 output 文件夹中。
cd /usr/local/hadoop
mkdir ./input
cp ./etc/hadoop/*.xml ./input # 将配置文件作为输入文件
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-
examples-*.jar grep ./input ./output 'dfs[a-z.]+'
cat ./output/* # 查看运行结果
此处提示“WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable”,该 WARN 提示可以忽略,不会影响 Hadoop 正常运行(可通过编译 Hadoop 源码解决,解决方法请自行搜索)。 源头是binary是在一个32位的机器上编译的。
若出现提示 “INFO metrics.MetricsUtil: Unable to obtain hostName java.net.UnknowHostException”,这需要执行如下命令修改 hosts 文件,为你的主机名增加IP映射:
sudo vim /etc/hosts
在最后面增加一行 “127.0.0.1 dblab”
保存文件后重新运行 hadoop 实例,若执行成功的话会输出很多作业的相关信息,最后的输出信息如下图所示。作业的结果会输出在指定的 output 文件夹中,通过命令 cat ./output/* 查看结果,符合正则的单词 dfsadmin 出现了1次
注意,Hadoop 默认不会覆盖结果文件,因此再次运行上面实例会提示出错,需要先将 ./output 删除。
rm -r ./output
这边如果遇上运行后不知道java位置的情况,可以将更改配置文件hadoop-env.sh其中直接写详细的java位置即可 不过这不是根本解决方法 还是检查下自己之前的配置
hadoop伪分布配置
在设置 Hadoop 伪分布式配置前,我们还需要设置 HADOOP 环境变量,执行上面的环境配置即可
Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。
gedit ./etc/hadoop/core-site.xml
改为:
hadoop.tmp.dir
file:/usr/local/hadoop/tmp
Abase for other temporary directories.
fs.defaultFS
hdfs://localhost:9000
同样的修改 hdfs-site.xml
gedit ./etc/hadoop/hdfs-site.xml
改为
dfs.replication
1
dfs.namenode.name.dir
file:/usr/local/hadoop/tmp/dfs/name
dfs.datanode.data.dir
file:/usr/local/hadoop/tmp/dfs/data
配置完成后,执行 NameNode 的格式化:
./bin/hdfs namenode -format
其实这里如果之前配置生效可以直接hdfs namenode -format了
成功的话,会看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若为 “Exitting with status 1” 则是出错。
接着开启 NaneNode 和 DataNode 守护进程:
./sbin/start-dfs.sh
若出现如下 SSH 的提示 “Are you sure you want to continue connecting”,输入 yes 即可。
启动完成后,可以通过命令 jps 来判断是否成功启动,若成功启动则会列出如下进程: “NameNode”、”DataNode”和SecondaryNameNode(如果 SecondaryNameNode 没有启动,请运行 sbin/stop-dfs.sh 关闭进程,然后再次尝试启动尝试)。如果没有 NameNode 或 DataNode ,那就是配置不成功,请仔细检查之前步骤,或通过查看启动日志排查原因。(具体请参考ref链接)
成功启动后,可以访问 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。
运行Hadoop伪分布式实例
上面的单机模式,grep 例子读取的是本地数据,伪分布式读取的则是 HDFS 上的数据。要使用 HDFS,首先需要在 HDFS 中创建用户目录:
./bin/hdfs dfs -mkdir -p /user/hadoop
接着将 ./etc/hadoop 中的 xml 文件作为输入文件复制到分布式文件系统中,即将 /usr/local/hadoop/etc/hadoop 复制到分布式文件系统中的 /user/hadoop/input 中。我们使用的是 hadoop 用户,并且已创建相应的用户目录 /user/hadoop ,因此在命令中就可以使用相对路径如 input,其对应的绝对路径就是 /user/hadoop/input:
wordcount测试:
./bin/hdfs dfs -mkdir input
./bin/hdfs dfs -put ./etc/hadoop/*.xml input
复制完成后,可以通过如下命令查看 HDFS 中的文件列表:
./bin/hdfs dfs -ls input
伪分布式运行 MapReduce 作业的方式跟单机模式相同,区别在于伪分布式读取的是HDFS中的文件(可以将单机步骤中创建的本地 input 文件夹,输出结果 output 文件夹都删掉来验证这一点)。
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-
examples-*.jar grep input output 'dfs[a-z.]+'
查看运行结果的命令(查看的是位于 HDFS 中的输出结果):
./bin/hdfs dfs -cat output/*
我们也可以将运行结果取回到本地:
rm -r ./output # 先删除本地的 output 文件夹(如果存在)
./bin/hdfs dfs -get output ./output # 将 HDFS 上的 output 文件夹 拷贝到本机
cat ./output/*
Hadoop 运行程序时,输出目录不能存在,否则会提示错误 “org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists” ,因此若要再次执行,需要执行如下命令删除 output 文件夹:
./bin/hdfs dfs -rm -r output # 删除 output 文件夹
若要关闭Hadoop,则运行:
./sbin/stop-dfs.sh
下次启动 hadoop 时,无需进行 NameNode 的初始化,只需要运行 ./sbin/start-dfs.sh 就可以!
若要运行wordcount 直接 (前提你建好文件夹用上述方法传文件进去 同样 output运行前不能存在
hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar wordcount /input /output
启动YARN
伪分布式不启动 YARN 也可以,一般不会影响程序执行)
YARN 是从 MapReduce 中分离出来的,负责资源管理与任务调度。YARN 运行于 MapReduce 之上,提供了高可用性、高扩展性,YARN 的更多介绍在此不展开,有兴趣的可查阅相关资料。
上述通过 ./sbin/start-dfs.sh 启动 Hadoop,仅仅是启动了 MapReduce 环境,我们可以启动 YARN ,让 YARN 来负责资源管理与任务调度。
首先修改配置文件 mapred-site.xml,这边需要先进行重命名
mv ./etc/hadoop/mapred-site.xml.template ./etc/hadoop/mapred-site.xml
将其配置修改为:
mapreduce.framework.name
yarn
接着修改配置文件 yarn-site.xml:
yarn.nodemanager.aux-services
mapreduce_shuffle
然后就可以开启yarn了:
./sbin/start-yarn.sh $ 启动YARN
./sbin/mr-jobhistory-daemon.sh start historyserver # 开启历史服务器,才能在Web中查看任务运行情况
开启后通过 jps 查看,可以看到多了 NodeManager 和 ResourceManager 两个后台进程。
启动 YARN 之后,运行实例的方法还是一样的,仅仅是资源管理方式、任务调度不同。观察日志信息可以发现,不启用 YARN 时,是 “mapred.LocalJobRunner” 在跑任务,启用 YARN 之后,是 “mapred.YARNRunner” 在跑任务。启动 YARN 有个好处是可以通过 Web 界面查看任务的运行情况:http://localhost:8088/cluster
但 YARN 主要是为集群提供更好的资源管理与任务调度,然而这在单机上体现不出价值,反而会使程序跑得稍慢些。因此在单机上是否开启 YARN 就看实际情况了。
不启动 YARN 需重命名 mapred-site.xml
如果不想启动 YARN,务必把配置文件 mapred-site.xml 重命名,改成mapred-site.xml.template,需要用时改回来就行。否则在该配置文件存在,而未开启 YARN 的情况下,运行程序会提示 “Retrying connect to server: 0.0.0.0/0.0.0.0:8032” 的错误,这也是为何该配置文件初始文件名为 mapred-site.xml.template。
同样的,关闭 YARN 的脚本如下:
./sbin/stop-yarn.sh
./sbin/mr-jobhistory-daemon.sh stop historyserver
Referene:
Hadoop安装教程_单机/伪分布式配置_CentOS6.4/Hadoop2.6.0
Yarn简单介绍及内存配置
Hadoop: Setting up a Single Node Cluster.
How to Setup Hadoop 2.8 on CentOS, Ubuntu and LinuxMint