Ubuntu、centos7、6集群搭建:https://blog.csdn.net/qq_40938267/article/details/83476896
遇到的问题以及解决方法:
1.在./bin/hdfs namenode –format时 加载不出class 查看配置的bashrc 你的/usr/local/hadoop路径中Hadoop的h的大小写 必须要一致
2. 在安装好Hadoop后,每次输入命令都会出现下面警告:
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Stopping namenodes ...
提示hadoop不能加载本地库。
可以到$HADOOP_HOME/lib/native下,查看文件libhadoop.so.1.0.0,里面会显示Hadoop的位数,官网下载好的显示是64位的,如下所示:
[hadoop@dxer hadoop-2.6.4]$ cd lib/native/
[hadoop@dxer native]$ ls
libhadoop.a libhadooppipes.a libhadoop.so libhadoop.so.1.0.0 libhadooputils.a libhdfs.a libhdfs.so libhdfs.so.0.0.0
[hadoop@dxer native]$ file libhadoop.so.1.0.0
libhadoop.so.1.0.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=b3b5e812c2a91fa4b28aa33eb76dc6889d3b91e9, not stripped
[hadoop@dxer native]$
文件和操作系统都是64位的那为什么还会出现这样的警告呢。肯定是少了什么配置,没让库文件加载进去。
只需要进行简单配置即可。
配置如下:
- 首先在bashrc中加入如下配置:
vim ~/.bashrc
配置如下
export HADOOP_HOME=/home/hadoop/hadoop-2.6.4
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_COMMON_LIB_NATIVE_DIR"
- 使上面配置生效:
source ~/.bashrc
ok,再去执行启动dfs/yarn或者运行hadoop相关命令的时候就不会再有上面的提示啦。
开始:
1、创建用户
# useradd -m hadoop -s /bin/bash
-d<登入目录>:指定用户登入时的启始目录;
-D:变更预设值;
-e<有效期限>:指定帐号的有效期限;
-f<缓冲天数>:指定在密码过期后多少天即关闭该帐号;
-g<群组>:指定用户所属的群组;
-G<群组>:指定用户所属的附加群组;
-M:不要自动建立用户的登入目录;
-n:取消建立以用户名称为名的群组;
-r:建立系统帐号;
-u:指定用户id。
-m:自动建立用户的登入目录;
-s:指定用户登入后所使用的shell; /bin/bash/ 作为shell
shell只是用户与系统沟通的接口,各种不同的shell只是命令语法不用,语法不同而已。
-c<备注>:加上备注文字。备注文字会保存在passwd的备注栏位中;
2、password +用户 修改用户密码
3、visudo 用户 ALL=(ALL) ALL
sudo 是substitute user do (替用户做)的简写,它是一个应用程序。允许使用者透过安全的方式执行有特权的程序。
sudo的配置文件位于/etc/sudoers目录下,visudo会锁住此文件,保存修改到临时文件,然后检查文件格式,确保正确后才会覆盖sudoers文件。必须保证sudoers格式正确,否则sudo将无法运行。visudo调用的默认编辑器是vi
4、SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定;SSH 为建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。
另外,spring的三点框架缩写也是ssh
SSH 为 struts+spring+hibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架。
集成SSH框架的系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层,以帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的Web应用程序。
5、,一般情况下,CentOS 默认已安装了 SSH client、SSH server,打开终端执行如下命令进行检验:
rpm -qa | grep ssh RPM是RedHat Package Manger(RedHat软件管理工具),是一种用于打包及安装工具-qa代表query,a代表allgrep(global search rgular expression(RE) and print out the line):是一种强大的文本搜索工具
如果没有安装,使用yum进行安装:
$ sudo yum install openssh-clients
$ sudo yum install openssh-server
yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器。基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,
6、$ ssh localhost
登录本地 需要密码
7、设置无密码登录
$ exit
$ cd ~/.ssh/ # 若没有该目录,请先执行一次ssh localhost
$ ssh-keygen -t rsa #rsa 专用密钥 ssh-keygen密码短语加密专用密钥 -t type
指定要创建的密钥类型
$ cat id_rsa.pub >> authorized_keys # id_rsa.pub给公钥加入授权 id_rsa私钥id_rsa.pub追加到authorized_keys已认证的主机列表里面。 这样本机对本机就是已认证的状态
$ chmod 600 ./authorized_keys # 600代表设置拥有者可读写,其他人不可读写执行 的authorized_keys文件权限
设置.ssh目录权限
$ chmod 700 -R .ssh
7、验证无密码登录$ ssh localhost
退出等Hadoop账户
8、安装java环境
sudo yum install java-1.7.0-openjdk java-1.7.0-openjdk-devel
配置一下 JAVA_HOME 环境变量在vim ~/.bashrc
PATH环境变量。作用是指定命令搜索路径,在命令行下面执行命令如javac编译java程序时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序。
CLASSPATH环境变量。作用是指定类搜索路径,要使用已经编写好的类,前提当然是能够找到它们了,JVM就是通过CLASSPATH来寻找类的。
JAVA_HOME环境变量。它指向jdk的安装目录
9.vim ~/.bashrc
etc/profile: 此文件为系统的每个用户设置环境信息。当用户登录时,该文件被执行一次,并从 /etc/profile.d 目录的配置文件中搜集shell 的设置。一般用于设置所有用户使用的全局变量。
/etc/bashrc: 当 bash shell 被打开时,该文件被读取。也就是说,每次新打开一个终端 shell,该文件就会被读取
10.在文件最后加指向 JDK 的安装位置:export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk
11.source ~/.bashrc # 使变量设置生效
source:使当前shell读入路径为filepath的shell文件并依次执行文件中的所有语句,通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录
~/是进入当前用户的主目录。比如我用的用户名是USER 那么命令 cd ~/ 就进入了/home/USER 目录
设置好后我们来检验一下是否设置正确:
- echo $JAVA_HOME # 检验变量值 的路径
- java –version查看当前java版本
- $JAVA_HOME/bin/java -version # 与直接执行 java -version 一样
安装 Hadoop 2
Weget是一个下载文件工具
wget http://labfile.oss.aliyuncs.com/hadoop-2.6.0.tar.gz
- cat ~/下载/hadoop-2.6.0.tar.gz.mds | grep 'MD5' # 列出md5检验值
- # head -n 6 ~/下载/hadoop-7.1.tar.gz.mds # 2.7.1版本格式变了,可以用这种方式输出
- md5sum ~/下载/hadoop-2.6.0.tar.gz | tr "a-z" "A-Z" # 计算md5值,并转化为大写,方便比较
下载hadoop安装包
Hadoop 安装至 /usr/local/ 中:
- sudo tar -zxf ~/下载/hadoop-2.6.0.tar.gz -C /usr/local # 解压到/usr/local中 -C是当前目录/home/usr1
- cd /usr/local/
- sudo mv ./hadoop-2.6.0/ ./hadoop # 将文件夹名改为hadoop
- sudo chown -R hadoop:hadoop ./hadoop ./ 代表当前目录
chown是命令用来修改目录的权限
-R代表递归,就是从当前目录到他最下面的子目录
hadoop:hadoop代表将目录和文件的owner和group都设成hadoop
owner:文件的属主(拥有者)group:用户组内成员other:其他用户
./hadoop代表从当前目录hadoop开始修改
5、 cd /usr/local/hadoop
6、./bin/hadoop version 输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息:
Hadoop附带了丰富的例子。运行以下命令:可以看到所有例子,包括 wordcount、terasort、join、grep 等。
# ./hadoop jar ../share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar
- cd /usr/local/hadoop
- mkdir ./input
- cp ./etc/hadoop/*.xml ./input # 将配置文件作为输入文件
10、./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep ./input ./output 'dfs[a-z.]+'
bin/hadoop jar(使用hadoop运行jar包) hadoop-*_examples.jar(jar包的名字) grep (要使用的类,后边的是参数)input output ‘dfs[a-z.]+’
整个就是运行hadoop示例程序中的grep,对应的hdfs上的输入目录为input、输出目录为output。 查询文件input output 中的字符串
'dfs[a-z.]+'
这个是正则表达式,查询dfs开头的,后面跟1个或1个以上的字母,比如 dfsa dfsb dfsc
11、cat ./output/* # 查看运行结果
若出现提示 “WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable”,该 WARN 提示可以忽略,不会影响 Hadoop 正常运行(可通过编译 Hadoop 源码解决,解决方法请自行搜索)。
若出现提示 “INFO metrics.MetricsUtil: Unable to obtain hostName java.net.UnknowHostException”,这需要执行如下命令修改 hosts 文件,为你的主机名增加IP映射:
- sudo vim /etc/hosts
Shell 命令
主机名在终端窗口标题里可以看到,或执行命令 hostname 查看,如下图所示,在最后面增加一行 “127.0.0.1 dblab”:
设置主机名的IP映射
保存文件后,重新运行 hadoop 实例,若执行成功的话会输出很多作业的相关信息,最后的输出信息如下图所示。作业的结果会输出在指定的 output 文件夹中,通过命令 cat ./output/* 查看结果,符合正则的单词 dfsadmin 出现了1次:
Hadoop例子输出结果
注意,Hadoop 默认不会覆盖结果文件,因此再次运行上面实例会提示出错,需要先将 ./output 删除。
- rm -r ./output
hadoop伪分布式配置
在设置 Hadoop 伪分布式配置前,我们还需要设置 HADOOP 环境变量,执行如下命令在 ~/.bashrc 中设置:
- gedit ~/.bashrc
Shell 命令
这次我们选择用 gedit 而不是 vim 来编辑。gedit 是文本编辑器,类似于 Windows 中的记事本,会比较方便。保存后记得关掉整个 gedit 程序,否则会占用终端。在文件最后面增加如下内容:
- # Hadoop Environment Variables
- export HADOOP_HOME=/usr/local/hadoop 路径
- export HADOOP_INSTALL=$HADOOP_HOME
- export HADOOP_MAPRED_HOME=$HADOOP_HOME 伪分布式数据处理MapReduce
- 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
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000/</value>
<description>默认的HDFS端口,用于NameNode与DataNode之间到的通讯,IP为NameNode的地址</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/root/BigData/hadoop-3.0.0/tmp</value>
<description>存放hadoop文件系统依赖的基本配置</description>
</property>
</configuration>
Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/
中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。
# gedit ./etc/hadoop/core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
# gedit ./etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
配置完成后,执行 NameNode 的格式化:
- ./bin/hdfs namenode -format
成功的话,会看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若为 “Exitting with status 1” 则是出错
接着开启 NaneNode
和 DataNode
守护进程:
- ./sbin/start-dfs.sh
Yes
启动完成后,可以通过命令 jps 来判断是否成功启动,若成功启动则会列出如下进程: “NameNode”、”DataNode”和SecondaryNameNode(如果 SecondaryNameNode 没有启动,请运行 sbin/stop-dfs.sh 关闭进程,然后再次尝试启动尝试)。如果没有 NameNode 或 DataNode ,那就是配置不成功,请仔细检查之前步骤,或通过查看启动日志排查原因。
Jps 是JDK提供的一个显示当前所有java进程(pid)的命令
成功启动后,可以访问 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。
上面的单机模式,grep 例子读取的是本地数据,伪分布式读取的则是 HDFS 上的数据。要使用 HDFS,首先需要在 HDFS 中创建用户目录:
- ./bin/hdfs dfs -mkdir -p /user/hadoop
Mkdir -p可以直接创建多级目录
Shell 命令
接着将 ./etc/hadoop 中的 xml 文件作为输入文件复制到分布式文件系统中,即将 /usr/local/hadoop/etc/hadoop 复制到分布式文件系统中的 /user/hadoop/input 中。我们使用的是 hadoop 用户,并且已创建相应的用户目录 /user/hadoop ,因此在命令中就可以使用相对路径如 input,其对应的绝对路径就是 /user/hadoop/input:
- ./bin/hdfs dfs -mkdir /user/hadoop/input
- ./bin/hdfs dfs -put ./etc/hadoop/*.xml /user/hadoop/input
复制完成后,可以通过如下命令查看 HDFS 中的文件列表:
- ./bin/hdfs dfs -ls /user/hadoop/input
Shell 命令
伪分布式运行 MapReduce 作业的方式跟单机模式相同,区别在于伪分布式读取的是HDFS中的文件(可以将单机步骤中创建的本地 input 文件夹,输出结果 output 文件夹都删掉来验证这一点)。
- ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep /user/hadoop/input output 'dfs[a-z.]+'
Shell 命令
查看运行结果的命令(查看的是位于 HDFS 中的输出结果):
- ./bin/hdfs dfs -cat output/*
Shell 命令
结果如下,注意到刚才我们已经更改了配置文件,所以运行结果不同。
Hadoop伪分布式运行grep的结果
我们也可以将运行结果取回到本地:
- rm -r ./output # 先删除本地的 output 文件夹(如果存在)
- ./bin/hdfs dfs -get output ./output # 将 HDFS 上的 output 文件夹拷贝到本机
- cat ./output/*
Shell 命令
Hadoop 运行程序时,输出目录不能存在,否则会提示错误 “org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists” ,因此若要再次执行,需要执行如下命令删除 output 文件夹:
- ./bin/hdfs dfs -rm -r output # 删除 output 文件夹
Shell 命令
运行程序时,输出目录不能存在
运行 Hadoop 程序时,为了防止覆盖结果,程序指定的输出目录(如 output)不能存在,否则会提示错误,因此运行前需要先删除输出目录。在实际开发应用程序时,可考虑在程序中加上如下代码,能在每次运行时自动删除输出目录,避免繁琐的命令行操作:
- Configuration conf = new Configuration();
- Job job = new Job(conf);
- /* 删除输出目录 */
- Path outputPath = new Path(args[1]);
- outputPath.getFileSystem(conf).delete(outputPath, true);
Java
若要关闭 Hadoop,则运行
- ./sbin/stop-dfs.sh
Shell 命令
注意
下次启动 hadoop 时,无需进行 NameNode 的初始化,只需要运行 ./sbin/start-dfs.sh
就可以!
启动YARN
(伪分布式不启动 YARN 也可以,一般不会影响程序执行)
有的读者可能会疑惑,怎么启动 Hadoop 后,见不到书上所说的 JobTracker 和 TaskTracker,这是因为新版的 Hadoop 使用了新的 MapReduce 框架(MapReduce V2,也称为 YARN,Yet Another Resource Negotiator)。
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
Shell 命令
然后再进行编辑,同样使用 gedit 编辑会比较方便些 gedit ./etc/hadoop/mapred-site.xml
:
- <configuration>
- <property>
- <name>mapreduce.framework.name</name>
- <value>yarn</value>
- </property>
- </configuration>
XML
接着修改配置文件 yarn-site.xml:
- <configuration>
- <property>
- <name>yarn.nodemanager.aux-services</name>
- <value>mapreduce_shuffle</value>
- </property>
- </configuration>
XML
然后就可以启动 YARN 了(需要先执行过 ./sbin/start-dfs.sh
):
- ./sbin/start-yarn.sh $ 启动YARN
- ./sbin/mr-jobhistory-daemon.sh start historyserver # 开启历史服务器,才能在Web中查看任务运行情况
Shell 命令
开启后通过 jps
查看,可以看到多了 NodeManager 和 ResourceManager 两个后台进程,如下图所示。
开启YARN
启动 YARN 之后,运行实例的方法还是一样的,仅仅是资源管理方式、任务调度不同。观察日志信息可以发现,不启用 YARN 时,是 “mapred.LocalJobRunner” 在跑任务,启用 YARN 之后,是 “mapred.YARNRunner” 在跑任务。启动 YARN 有个好处是可以通过 Web 界面查看任务的运行情况:http://localhost:8088/cluster,如下图所示。
开启YARN后可以查看任务运行信息
但 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
- ./sbin/stop-dfs.sh 关闭Hadoopdfs
自此,你已经掌握 Hadoop 的配置和基本使用了
借鉴于以下资料并自己做出了详解:
https://blog.csdn.net/xqclll/article/details/53487952
www.powerxing.com/install-hadoop-in-centos/