关于hadoop的安装,网上有七七八八的教程,十个教程九个坑,还有一个特别坑。这使得很多新手在安装hadoop时,按照网上所谓的教程,一步一步,走到了某一步出错了,又搜不到解救之法,不得不放弃。安装过程蹦出的各种问题,让小白们吃吃了不少苦头。下面给出一个Hadoop安装教程(单机/伪分布式配置、hadoop-2.7.1/ubuntu-16.04.2)。
安装虚拟机VMware,在虚拟机上安装Ubuntu系统。这一步不容易出问题,就略过了。
我选择的是hadoop-2.7.1,为了减少问题的发生,建议各个工具的版本都同我选成一样,然后一步一步跟着走。下载地址,网上随便一搜就有。可以先下载到windows上,再拷贝到Ubuntu上。下载地址,最好下载编译过的压缩包(tar.gz结尾)。
终端输入 sudo useradd -m hadoop -s /bin/bash
创建一个名为hadoop的用户,使用 /bin/bash 作为shell。
终端输入sudo passwd hadoop
设置密码为hadoop。
友情提示:可以直接上述代码拷贝过去运行,Ubuntu复制粘贴命名同window多加一个shift,如黏贴为
Ctrl+Shift+V
。
sudo apt-get update
进行更新。sudo apt-get install openssh-server
ssh localhost
exit # 退出刚才的 ssh localhost
cd ~/.ssh/ # 若没有该目录,请先执行一次ssh localhost
ssh-keygen -t rsa # 会有提示,都按回车就可以
cat ./id_rsa.pub >> ./authorized_keys
sudo apt-get install default-jre default-jdk
vim ~/.bashrc
文本前添加export JAVA_HOME=/usr/lib/jvm/default-java
。
- 让bash文件生效
source ~/.bashrc
java -version
/usr/local/
路径下sudo tar -zxf 你的hadoop压缩包所在路径 -C /usr/local # 解压到/usr/local中
cd /usr/local/
sudo mv ./hadoop-2.x/ ./hadoop # 将文件夹名改为hadoop
sudo chown -R hadoop ./hadoop # 修改文件权限
./hadoop version
显示hadoop版本信息即为成功。
1、安装路径/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar
含有大量的示例,我们可以切换目录到/usr/local/hadoop
,然后执行:
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar
目录树的不同层次、相同层次都有很多同名的文件夹,记得别搞混了,导致进错文件夹,导致找不到文件。
2、hadoop一个使用例子:grep
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/*
运行后得到结果 符合正则表达式dfs[a-z.]+
出现了1次(dfsadmin)。
/usr/local/hadoop/etc/hadoop/
目录下的core-site.xml 文件,修改 <configuration>
configuration>
为:
<configuration>
<property>
<name>hadoop.tmp.dirname>
<value>file:/usr/local/hadoop/tmpvalue>
<description>Abase for other temporary directories.description>
property>
<property>
<name>fs.defaultFSname>
<value>hdfs://localhost:9000value>
property>
configuration>
hdfs-site.xml
文件,同样的配置部分修改为 <configuration>
<property>
<name>dfs.replicationname>
<value>1value>
property>
<property>
<name>dfs.namenode.name.dirname>
<value>file:/usr/local/hadoop/tmp/dfs/namevalue>
property>
<property>
<name>dfs.datanode.data.dirname>
<value>file:/usr/local/hadoop/tmp/dfs/datavalue>
property>
configuration>
配置文件内容说明:若没有配置 hadoop.tmp.dir 参数,则默认使用的临时目录为 /tmp/hadoo-hadoop,而这个目录在重启时有可能被系统清理掉,导致必须重新执行 format 才行。
- NameNode 的格式化
./bin/hdfs namenode -format#这里的“.”表示的当前目录是hadoop安装目录下的hadoop文件夹,如我的是/usr/local/hadoop,下同,不再重述
看到 “successfully formatted” 表示成功。
./sbin/start-dfs.sh #start-dfs.sh是个完整的可执行文件,中间没有空格
启动完成后,可以通过命令 jps 来判断是否成功启动。成功启动则会列出如下进程:
“NameNode”、
”DataNode”
“SecondaryNameNode”
- 成功启动后,可以访问 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。
/user/hadoop
目录,接着在创建的hadoop下创建input
文件夹,将本机配置文件拷贝进去。./bin/hdfs dfs -mkdir -p /user/hadoop
./bin/hdfs dfs -mkdir input#input表示相对路径,即 /user/hadoop/input
./bin/hdfs dfs -put ./etc/hadoop/*.xml input
./bin/hdfs dfs -ls input
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
./bin/hdfs dfs -cat output/*
rm -r ./output # 先删除本地的 output 文件夹(如果存在)
./bin/hdfs dfs -get output ./output # 将 HDFS 上的 output 文件夹拷贝到本机
cat ./output/*
运行程序时,输出目录不能存在,若存在,删除之。
- Hadoop的运行与关闭
./sbin/start-dfs.sh #运行
./sbin/stop-dfs.sh #关闭
我们可以启动 YARN ,让 YARN 来负责资源管理与任务调度。
YARN 主要是为集群提供更好的资源管理与任务调度,然而这在单机上体现不出价值,反而会使程序跑得稍慢些。因此在这就不介绍如何开启 YARN 就了。
解决办法:找到并且杀掉所有的apt-get和apt进程
1、运行ps -A | grep apt
命令来生成所有含有apt的进程列表
2、 运行sudo kill 进程名 processnumber
杀掉进程
解决办法:
1、运行sudo apt-get autoremove open-vm-tools
。
2、运行sudo apt-get install open-vm-tools-desktop
。
3、重新开机(Linux)。
hadoop is not in the sudoers file. This incident will be reported.
解决方法:
1、root用户登录。
2、进入到/etc目录。
3、执行sudo chmod u+w /etc/sudoers
给sudoers文件增加write权限。
4、执行vim sudoers
找到root ALL=(ALL) ALL
这一行,在下面增加hadoop ALL=(ALL) ALL
(注:hadoop为普通用户的用户名)。
5、执行命令chmod u-w sudoers
,撤销write权限。
Failed to connect to Mir: Failed to connect to server socket: No such file or directory
Unable to init server: Could not connect: Connection refused
(gedit:12224): Gtk-WARNING **: cannot open display: