线上集群测试太慢,有时候需要在本地跑一些计算或者测试某个逻辑,主要做调试用,所以在本地也装一个Hive测试用,但是装Hive需要先安装Hadoop.
准备工作 开发环境为:
1 2 3 4 5 6 OS: Ubuntu 16.04 LTS 64bit JDK: 1.7.0_40 ssh server:1:7.2p2-4ubuntu1 Hadoop:hadoop-2.6.4.tar.gz ➜ Blog git:(master) ✗ whoami anonymous
**注意:**当前用户为anonymous
,下面所有涉及到用户的地方,需要对应修改为你自己的用户名。
安装步骤 具体的安装步骤可能有些多,具体过程如下:
ssh登陆配置 先安装ssh server程序:
1 2 3 ➜ sudo apt update ➜ sudo apt install openssh-server -y ➜ ssh localhost
输入密码之后可以登陆则没有问题,然后使用exit
命令注销当前用户,直接忽略下面的异常问题, 如果第一步出现下面的错误,按照下面的方法解决即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 忽略:1 http://dl.google.com/linux/chrome/deb stable InRelease 获取:2 http://archive.ubuntukylin.com:10006/ubuntukylin xenial InRelease [3,192 B] 命中:3 http://cn.archive.ubuntu.com/ubuntu xenial InRelease 错误:2 http://archive.ubuntukylin.com:10006/ubuntukylin xenial InRelease 由于没有公钥,无法验证下列签名: NO_PUBKEY 8D5A09DC9B929006 命中:4 http://cn.archive.ubuntu.com/ubuntu xenial-updates InRelease 获取:5 http://cn.archive.ubuntu.com/ubuntu xenial-backports InRelease [92.2 kB] 命中:6 http://security.ubuntu.com/ubuntu xenial-security InRelease 命中:7 http://dl.google.com/linux/chrome/deb stable Release 正在读取软件包列表... 完成 W: GPG 错误:http://archive.ubuntukylin.com:10006/ubuntukylin xenial InRelease: 由于没有公钥>,无法验证下列签名: NO_PUBKEY 8D5A09DC9B929006 E: 仓库 “http://archive.ubuntukylin.com:10006/ubuntukylin xenial InRelease” 没有数字签名。 N: 无法安全地用该源进行更新,所以默认禁用该源。 N: 参见 apt-secure(8) 手册以了解仓库创建和用户配置方面的细节。
需要按如下方案解决,手动添加上面报错的签名8D5A09DC9B929006
:
1 ➜ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8D5A09DC9B929006
生成密钥 每次登陆都需要输密码很不方便,设置免密码登陆,记得注销当前用户exit
:
1 2 3 ➜ cd ~/.ssh ➜ sh-keygen -t rsa ➜ cat id_rsa.pub >> authorized_keys
**注意:**生成密钥的时候一路回车,不要输入任何东西,如果进行到这一步,我们就可以切回原来的系统了,然后使用:
安装JDK 这个安装也很简单,解压然后配置环境变量即可:
1 sudo tar -xvf jdk-7u40-linux-x64.tar.gz -C /usr/dev
然后编辑~/.bashrc
文件:
1 2 3 4 export JAVA_HOME=/usr/dev/jdk1.7.0_40 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH
然后更新一下文件:
测试JDK是否配置正确:
1 2 3 4 ➜ java -version java version "1.7.0_40" Java(TM) SE Runtime Environment (build 1.7.0_40-b43) Java HotSpot(TM) 64-Bit Server VM (build 24.0-b56, mixed mode)
安装Hadoop 确认JDK安装正确之后,下面就可以来安装Hadoop了,进入到压缩包所在目录:
1 2 ➜ sudo tar -xvf hadoop-2.6.4.tar.gz -C /usr/dev/ ➜ sudo chown -R anonymous /usr/dev/hadoop-2.6.4/
看看是否正确安装了:
1 2 3 4 5 6 7 8 ➜ cd /usr/dev/hadoop-2.6.4 ➜ ./bin/hadoop version Hadoop 2.6.4 Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r 5082c73637530b0b7e115f9625ed7fac69f937e6 Compiled by jenkins on 2016-02-12T09:45Z Compiled with protoc 2.5.0 From source with checksum 8dee2286ecdbbbc930a6c87b65cbc010 This command was run using /usr/dev/hadoop-2.6.4/share/hadoop/common/hadoop-common-2.6.4.jar
可以识别到版本就说明没啥问题了。 为了方便以后使用,可以再配置一下环境变量:
1 2 export HADOOP_HOME=/usr/dev/hadoop-2.6.4 export PATH=${HADOOP_HOME}/bin:$PATH
**注意:**后面的操作如果没有特殊指明,都是在hadoop的安装目录/usr/dev/hadoop-2.6.4
下进行的操作
单机配置 单机配置比较简单,我们以一个简单的单词统计来看看怎么配置:
1 2 3 4 5 6 ➜ cd /usr/dev/hadoop-2.6.4 ➜ mkdir input ➜ cp etc/hadoop/*.xml input/ ➜ ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jar grep input/ output 'dfs[a-z.]+' ➜ cat output/* 1 dfsadmin
伪分布式 伪分布式需要修改两个文件etc/hadoop/core-site.xml
以及etc/hadoop/hdfs-site.xml
,修改对应位置,改为如下内容:
1 2 3 4 5 6 7 8 9 10 11 <configuration> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/dev/hadoop-2.6.4/tmp</value> <description>Abase for other temporary directories.</description> </property> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> </configuration>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/dev/hadoop-2.6.4/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/dev/hadoop-2.6.4/tmp/dfs/data</value> </property> </configuration>
格式化节点:
1 2 3 4 5 6 7 8 9 ➜ ./bin/hdfs namenode -format ............省略一堆调试信息............ 16/07/19 16:23:54 INFO common.Storage: Storage directory /usr/dev/hadoop-2.6.4/tmp/dfs/name has been successfully formatted. 16/07/19 16:23:54 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0 16/07/19 16:23:54 INFO util.ExitUtil: Exiting with status 0 16/07/19 16:23:54 INFO namenode.NameNode: SHUTDOWN_MSG: /************************************************************ SHUTDOWN_MSG: Shutting down NameNode at anonymous/127.0.1.1 ************************************************************/
**注意:**如果消息最后不是been successfully formatted.
以及返回值不是Exiting with status 0
则说明执行失败。
开启NameNode
和DataNode
守护进程:
1 2 3 4 5 6 ➜ ./sbin/start-dfs.sh Starting namenodes on [localhost] localhost: Error: JAVA_HOME is not set and could not be found. localhost: Error: JAVA_HOME is not set and could not be found. Starting secondary namenodes [0.0.0.0] 0.0.0.0: Error: JAVA_HOME is not set and could not be found.
出现这个错误,并不是由于jdk没设置好,不然前面的也不能运行,只好手动修改文件etc/hadoop/hadoop-env.sh
,原来的地方是export JAVA_HOME=${JAVA_HOME}
改成~/.bashrc
里面的内容:
1 export JAVA_HOME=/usr/dev/jdk1.7.0_40
记得要source ~/.bashrc
,然后再试一下:
1 2 3 4 5 6 ➜ ./sbin/start-dfs.sh Starting namenodes on [localhost] localhost: starting namenode, logging to /usr/dev/hadoop-2.6.4/logs/hadoop-hadoop-namenode-anonymous.out localhost: starting datanode, logging to /usr/dev/hadoop-2.6.4/logs/hadoop-hadoop-datanode-anonymous.out Starting secondary namenodes [0.0.0.0] 0.0.0.0: starting secondarynamenode, logging to /usr/dev/hadoop-2.6.4/logs/hadoop-hadoop-secondarynamenode-anonymous.out
看看进程:
1 2 3 4 5 ➜ jps 19407 SecondaryNameNode 19239 DataNode 19104 NameNode 19574 Jps
**注意:**没有NameNode或者DataNode
则NameNode
则不对,正常启动之后可以在Web页面http://localhost:50070 查看:
伪分布式实例 最开始演示了一个单机模式的单词统计,这里来一个统计hdfs文件统计的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ➜ ./bin/hdfs dfs -mkdir -p /user/hadoop ➜ ./bin/hdfs dfs -mkdir input ➜ ./bin/hdfs dfs -put etc/hadoop/*.xml input/ ➜ ./bin/hdfs dfs -ls input/ Found 8 items -rw-r--r-- 1 anonymous supergroup 4436 2016-07-19 19:37 input/capacity-scheduler.xml -rw-r--r-- 1 anonymous supergroup 1051 2016-07-19 19:37 input/core-site.xml -rw-r--r-- 1 anonymous supergroup 9683 2016-07-19 19:37 input/hadoop-policy.xml -rw-r--r-- 1 anonymous supergroup 1105 2016-07-19 19:37 input/hdfs-site.xml -rw-r--r-- 1 anonymous supergroup 620 2016-07-19 19:37 input/httpfs-site.xml -rw-r--r-- 1 anonymous supergroup 3523 2016-07-19 19:37 input/kms-acls.xml -rw-r--r-- 1 anonymous supergroup 5511 2016-07-19 19:37 input/kms-site.xml -rw-r--r-- 1 anonymous supergroup 690 2016-07-19 19:37 input/yarn-site.xml ➜ ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jar grep input/ output 'dfs[a-z.]+'
查看hdfs文件的统计结果可以使用:
1 2 3 4 5 ➜ ./bin/hdfs dfs -cat output/* 1 dfsadmin 1 dfs.replication 1 dfs.namenode.name.dir 1 dfs.datanode.data.dir
结果也可以取回本地,当然记得先把本地的文件夹删了:
1 2 3 ➜ rm -r output ➜ ./bin/hdfs dfs -get output output ➜ cat output/*
配置Yarn 有时候我们还需要一个任务或资源的调度器,当然如果是本地的任务,这个功能其实没啥用,反而会是任务运行变慢,这里仅当学习使用:
1 ➜ cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
编辑下面两个文件etc/hadoop/mapred-site.xml
,etc/hadoop/yarn-site.xml
:
etc/hadoop/mapred-site.xml
1 2 3 4 5 6 <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
1 2 3 4 5 6 7 <configuration> <!-- Site specific YARN configuration properties --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
启动资源管理器
1 2 ➜ ./sbin/start-yarn.sh ➜ ./sbin/mr-jobhistory-daemon.sh start historyserver
集群资源管理器的访问地址为:http://localhost:8088/cluster ,另外第二条命令是为了看历史任务的。
关闭资源你管理器
1 2 ➜ ./sbin/stop-yarn.sh ➜ ./sbin/mr-jobhistory-daemon.sh stop historyserver