- Ubuntu、centos7、6集群搭建:https://blog.csdn.net/qq_40938267/article/details/83476896
一、准备阶段
1、创建用户
# useradd -m hadoop -s /bin/bash
-m:自动建立用户的登入目录;
-s:指定用户登入后所使用的shell; /bin/bash/ 作为shell
shell只是用户与系统沟通的接口,各种不同的shell只是命令语法不用,语法不同而已。
2、passwd +用户 修改用户密码
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):是一种强大的文本搜索工具
grep(global search regular 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已认证的主机列表里面。 这样本机对本机就是已认证的状态
密钥生成以及联系: https://blog.csdn.net/AnneQiQi/article/details/51174060
$ chmod 600 ./authorized_keys # 600代表设置拥有者可读写,其他人不可读写执行 的authorized_keys文件权限
设置.ssh目录权限:$ chmod 700 -R .ssh
linux命令大全详解:https://blog.csdn.net/u013197629/article/details/73608613 - 7、验证无密码登录$ ssh localhost
退出等Hadoop账户
二:java环境配置 - 8、安装java环境
sudo yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel
配置一下 JAVA_HOME 环境变量在vim ~/.bashrchttps://blog.csdn.net/wuha0/article/details/7212724
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.8.0-openjdk
- 11.source ~/.bashrc # 使变量设置生效
- source:使当前shell读入路径为filepath的shell文件并依次执行文件中的所有语句,通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录
~/是进入当前用户的主目录。比如我用的用户名是USER 那么命令 cd ~/ 就进入了/home/USER 目录 - 设置好后我们来检验一下是否设置正确:
echo $JAVA_HOME # 检验变量值 的路径https://zhidao.baidu.com/question/941050442393629332.html
java –version查看当前java版本
$JAVA_HOME/bin/java -version # 与直接执行 java -version 一样
三 hadoop的安装: - Weget是一个下载文件工具:找下载的地址链接前面加weget,就能在linux中直接下载
wget http://labfile.oss.aliyuncs.com/hadoop-2.6.0.tar.gz
没有wget时 yum -y install wget
下面校验步骤网络正常的话可以不去验证:
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-2.6.0-src.tar.gz是源码压缩文件。可以用eclipse导入研究源码,或者Maven构建编译打包。
hadoop-2.6.0.tar.gz是已经官方发布版压缩包,可以直接使用。不过官网下载的hadoop发布版本只适合x86环境,若要x64的则需要Maven重新构建。 - *.mds 是描述文件,记录压缩包的MD5,SHA1等信息
- 1.Hadoop 安装至 /usr/local/ 中:
sudo tar -zxf ~/下载/hadoop-2.6.0.tar.gz -C /usr/local # 解压到/usr/local中 -C是当前目录/home/usr1
cd /usr/local/ - Zxvf:
x : 从 tar 包中把文件提取出来
z : 表示 tar 包是被 gzip 压缩过的,所以解压时需要用 gunzip 解压
v : 显示详细信息
f xxx.tar.gz : 指定被处理的文件是 xxx.tar.gz
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开始修改 - 2. cd /usr/local/hadoop
3、./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 # 将配置文件作为输入文件
4、./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.]+’ - cd etc/hadoop -->vi hadoop-env.sh 文件末加上export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
- 整个就是运行hadoop示例程序中的grep,对应的hdfs上的输入目录为input、输出目录为output。 查询文件input output 中的字符串
'dfs[a-z.]+':这个是正则表达式,查询dfs开头的,后面跟1个或1个以上的字母,比如 dfsa dfsb dfsc
11、cat ./output/* # 查看运行结 - Hadoop例子输出结果
- 注意,Hadoop 默认不会覆盖结果文件,因此再次运行上面实例会提示出错,需要先将 ./output 删除。
rm -r ./output - 单机模式还有一种测试方式:
$sudo vim /home/hadoop/.bashrc //添加内容
在/home/hadoop/.bashrc文件末尾添加下列内容: - #HADOOP START
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export HADOOP_INSTALL=/usr/local/hadoop
export PATH=$PATH:$HADOOP_INSTALL/bin
export PATH=$PATH:$HADOOP_INSTALL/sbin
export HADOOP_MAPRED_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_HOME=$HADOOP_INSTALL
export HADOOP_HDFS_HOME=$HADOOP_INSTALL
export YARN_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_INSTALL/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_INSTALL/lib"
#HADOOP END
保存退出后,激活新加的环境变量,export将变量输出为环境变量 - $source ~/.bashrc
创建输入的数据,暂时采用/etc/protocols文件作为测试
$cd /usr/local/hadoop
$sudo mkdir input //建立一个文件
$sudo cp /etc/protocols ./input //复制文件或者目录
执行Hadoop WordCount应用(词频统计)
$bin/hadoop jar share/hadoop/mapreduce/sources/hadoop-mapreduce-examples-2.6.0-sources.jar org.apache.hadoop.examples.WordCount input output
查看生成的单词统计数据
$cat 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 - 下面是配置文件:
Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。
core-site.xml是全局配置,hdfs-site.xml和mapred-site.xml分别是hdfs和mapred的局部配置。
# 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>
下面是对配置文件的部分解释:
1、修改配置文件 core-site.xml (vim /usr/local/hadoop/etc/hadoop/core-site.xml):
<configuration>
<property> //指定Hadoop运行时产生文件的存储目录
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property> //fs.defaulitFS中配置9000监听端口。这个属性用来指定namenode的hdfs协议的文件系统通信地址,可以指定一个主机+端口,也可以指定为一个namenode服务(这个服务内部可以有多台namenode实现它的namenode服务)
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
2、修改配置文件 hdfs-site.xml:
<configuration>
<property> //指定hdfs副本的数量
<name>dfs.replication</name>
<value>1</value>
</property>
<property> //将Hadoop配置成伪分布模式,则Hadoop会将各种信息存入\tmp目录中,所以当系统重启之后,这些信息会丢失,用户不得不重新执行hadoop namenode -format命令。为了避免这种情况,可以在hdfs-site.xml文件中添加一个属性,属性名为dfs.name.dir,值为你想存的目录,只要不存在\tmp下,就不会遇到每次重启之后元数据丢失的情况。
<name>dfs.namenode.name.dir</name>//namenode数据的存放地点。也就是namenode元数据存放的地方,记录了hdfs系统中文件的元数据
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property> //datanode数据的存放地点
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
<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>
配置完成后,执行 NameNode 的格式化:./bin/hdfs namenode -format
成功的话,会看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若为 “Exitting with status 1” 则是出错
接着开启 NaneNode 和 DataNode 守护进程:./sbin/start-dfs.sh- 启动完成后,可以通过命令 jps 来判断是否成功启动,若成功启动则会列出如下进程: “NameNode”、”DataNode”和SecondaryNameNode(如果 SecondaryNameNode 没有启动,请运行 sbin/stop-dfs.sh 关闭进程,然后再次尝试启动尝试)。如果没有 NameNode 或 DataNode ,那就是配置不成功,请仔细检查之前步骤,或通过查看启动日志排查原因。
- Jps 是JDK提供的一个显示当前所有java进程(pid)的命令
成功启动后,可以访问 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。
这里强调一下:如在windows中看不了50700端口,在自己的linux的操作系统的firefox中查看,如果不是桌面的,打开这个链接根据只是可以转换为桌面式的操作系统:https://blog.csdn.net/qq_40938267/article/details/84402822 - 上面的单机模式,grep 例子读取的是本地数据,伪分布式读取的则是 HDFS 上的数据。要使用 HDFS,首先需要在 HDFS 中创建用户目录:./bin/hdfs dfs -mkdir -p /user/hadoop
Mkdir -p可以直接创建多级目录 - 接着将 ./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
伪分布式运行 MapReduce 作业的方式跟单机模式相同,区别在于伪分布式读取的是HDFS中的文件(可以将单机步骤中创建的本地 input 文件夹,输出结果 output 文件夹都删掉来验证这一点)。
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep /user/hadoop/input output 'dfs[a-z.]+'
- 查看运行结果的命令(查看的是位于 HDFS 中的输出结果):
./bin/hdfs dfs -cat output/*
结果如下,注意到刚才我们已经更改了配置文件,所以运行结果不同。
Hadoop伪分布式运行grep的结果
我们也可以将运行结果取回到本地:
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 就可以!
启动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/
- Cp 复制文件或目录
Mv 移动文件或改名
Sync 刷新文件系统缓冲区
Apt-get APT包管理工具
Ssh 安全连接客户端
Ssh-keygen 生成、管理和转换认证钥匙
Wget 从指定URL地址下载文件 - 遇到的问题以及解决方法:
- 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相关命令的时候就不会再有上面的提示啦。