问题描述
我正在尝试在Ubuntu 12.04版本中安装Hadoop。按照http://michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-single-node-cluster/的说明,我从Ubuntu software-center安装了java-6-openjdk
。我已经在.bashrc
中设置了java_home
。还要在Hadoop conf/env.sh
中设置java_home
。格式化namenode时,出现以下错误:
usr/lib/jvm/java-6-openjdk/bin/java no such file or directory.
谢谢。但这是一个64位操作系统。
最佳方法
我在12.04岁时遵循的指南是:
我实际上反对MyLearning,因为它推荐的第一件事是Oracle Java 7而不是OpenJDK 7,但是在尝试使用OpenJDK 7时遇到了一些问题,因此我不得不使用Oracle。
该指南主要是直截了当的,这里是:
-
安装Java
sudo add-apt-repository ppa:webupd8team/java sudo apt-get update && sudo apt-get upgrade sudo apt-get install oracle-java7-installer
-
创建Hadoop用户
sudo addgroup hadoop sudo adduser --ingroup hadoop hduser
hduser是您要拥有的Hadoop用户。
-
配置SSH
su - hduser ssh-keygen -t rsa -P "" cat .ssh/id_rsa.pub >> .ssh/authorized_keys
为确保SSH安装顺利,您可以打开一个新终端,并尝试通过以下命令使用
hduser
创建ssh会话:ssh localhost
如果本地主机未连接,请重新安装ssh(您可能需要按照以下步骤将
hduser
添加到sudo)sudo apt-get install openssh-server
-
编辑Sudoers
sudo visudo
-
在行末添加将hduser添加到sudoers
hduser ALL=(ALL:ALL) ALL
要保存,请按
CTRL
+X
,键入Y
并按ENTER
-
禁用IPv6
sudo gedit /etc/sysctl.conf
要么
sudo nano /etc/sysctl.conf
将以下行复制到文件末尾:
#disable ipv6 net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1
如果遇到问题告诉您,您没有权限,只需使用root帐户运行上一个命令(以防sudo不够。对我来说是这样)
-
现在重启。
您也可以执行
sudo sysctl -p
,但我宁愿重启。重新启动后,检查以确保IPv6已关闭:
cat /proc/sys/net/ipv6/conf/all/disable_ipv6
它应该显示为1。如果显示为0,则表示您错过了某些内容。
-
安装Hadoop
有几种方法可以做到这一点,《指南》建议的一种方法是从Apache Hadoop site下载并解压缩
hduser
主文件夹中的文件。将提取的文件夹重命名为hadoop
。另一种方法是使用经过12.04测试的PPA:
sudo add-apt-repository ppa:hadoop-ubuntu/stable sudo apt-get update && sudo apt-get upgrade sudo apt-get install hadoop
注意:PPA可能对某些人有效,而对其他人则无效。我尝试过的一个是从官方网站下载,因为我不了解PPA。
-
更新
$HOME/.bashrc
您将需要更新
hduser
的.bashrc
(以及需要管理Hadoop的每个用户)。要打开.bashrc
文件,您将需要以root用户打开:sudo gedit /home/hduser/.bashrc
要么
sudo nano /home/hduser/.bashrc
然后,您将在
.bashrc
文件的末尾添加以下配置# Set Hadoop-related environment variables export HADOOP_HOME=/home/hduser/hadoop # Set JAVA_HOME (we will also configure JAVA_HOME directly for Hadoop later on)` export JAVA_HOME=/usr/lib/jvm/java-7-oracle
现在,如果您具有OpenJDK7,它将看起来像这样:
export JAVA_HOME=/usr/lib/java-7-openjdk-amd64
这里要注意的是Java所在的AMD64版本所在的文件夹。如果上述方法不起作用,则可以尝试在该特定文件夹中查找或设置将用于以下方面的Java:
sudo update-alternatives --config java
现在获取一些有用的别名:
# Some convenient aliases and functions for running Hadoop-related commands unalias fs &> /dev/null alias fs="hadoop fs" unalias hls &> /dev/null alias hls="fs -ls" # Add Hadoop bin/ directory to PATH export PATH=$PATH:$HADOOP_HOME/bin
-
配置Hadoop
以下是我们可以用来进行正确配置的配置文件。您将在Hadoop中使用的一些文件是(this site中的更多信息):
start-dfs.sh
-启动Hadoop DFS守护程序,namenode和datanode。在start-mapred.sh之前使用它stop-dfs.sh
-停止Hadoop DFS守护程序。start-mapred.sh
-启动Hadoop Map /Reduce守护程序,jobtracker和tasktracker。stop-mapred.sh
-停止Hadoop Map /Reduce守护程序。start-all.sh
-启动所有Hadoop守护程序,namenode,datanode,jobtracker和tasktracker。不推荐使用;使用start-dfs.sh,然后使用start-mapred.shstop-all.sh
-停止所有Hadoop守护程序。不推荐使用;使用stop-mapred.sh,然后使用stop-dfs.sh但是在开始使用它们之前,我们需要修改
/conf
文件夹中的几个文件。查找文件
hadoop-env.sh
,我们只需要更新此文件中的JAVA_HOME变量:sudo gedit /home/hduser/hadoop/conf/hadoop-env.sh
要么
sudo nano /home/hduser/hadoop/conf/hadoop-env.sh
或最新版本
sudo nano /etc/hadoop/conf.empty/hadoop-env.sh
要么
sudo nano /etc/hadoop/hadoop-env.sh
然后更改以下行:
# export JAVA_HOME=/usr/lib/j2sdk1.5-sun
至
export JAVA_HOME=/usr/lib/jvm/java-7-oracle
注意:如果在启动服务时收到
Error: JAVA_HOME is not set
错误,则您忘记取消注释上一行(只需删除#)即可。core-site.xml
现在我们需要为Hadoop框架创建一个临时目录。如果您需要此环境进行测试或快速原型设计(例如,为个人测试开发简单的hadoop程序…),建议您在
/home/hduser/
目录下创建此文件夹,否则,应在共享文件夹下的共享位置中创建此文件夹(例如/usr /local …),但是您可能会遇到一些安全问题。但是为了克服可能由安全性引起的异常(例如java.io.IOException),我在hduser空间下创建了tmp文件夹。要创建此文件夹,请键入以下命令:
sudo mkdir /home/hduser/tmp
请注意,如果要创建另一个管理员用户(例如hadoop组中的hduser2),则应使用以下命令授予他对该文件夹的读写权限:
sudo chown hduser:hadoop /home/hduser/tmp sudo chmod 755 /home/hduser/tmp
现在,我们可以打开
hadoop/conf/core-site.xml
来编辑hadoop.tmp.dir条目。我们可以使用文本编辑器打开core-site.xml:sudo gedit /home/hduser/etc/hadoop/core-site.xml
要么
nano /home/hduser/etc/hadoop/core-site.xml
然后在
<configure>
xml元素之间添加以下配置:<property> <name>hadoop.tmp.dir</name> <value>/home/hduser/tmp</value> <description>A base for other temporary directories.</description> </property> <property> <name>fs.default.name</name> <value>hdfs://localhost:54310</value> <description>The name of the default file system. A URI whose scheme and authority determine the FileSystem implementation. The uri's scheme determines the config property (fs.SCHEME.impl) naming the FileSystem implementation class. The uri's authority is used to determine the host, port, etc. for a filesystem.</description> </property>
现在编辑
mapred-site.xml
<property> <name>mapred.job.tracker</name> <value>localhost:54311</value> <description>The host and port that the MapReduce job tracker runs at. If "local", then jobs are run in-process as a single map and reduce task. </description> </property>
现在编辑
hdfs-site.xml
<property> <name>dfs.replication</name> <value>1</value> <description>Default block replication. The actual number of replications can be specified when the file is created. The default is used if replication is not specified in create time. </description> </property>
-
格式化NameNode
现在,您可以开始在节点上工作了。第一种格式:
~/hduser/hadoop/bin/hadoop namenode -format
要么
./home/hduser/hadoop/bin/hadoop namenode -format
您应该在HDFS中格式化NameNode。系统运行时,您不应执行此步骤。通常在首次安装时执行一次。
-
启动Hadoop集群
您将需要导航到hadoop /bin目录并运行
./start-all.sh
脚本。cd ~/hduser/hadoop/bin/ start-all.sh
如果您使用的版本与指南中显示的版本不同(如果使用PPA或更新的版本,则很有可能使用该版本),请尝试以下方式:
cd ~/hduser/hadoop/bin/ start-dfs.sh start-mapred.sh
这将在您的计算机上启动Namenode,Datanode,Jobtracker和Tasktracker。
-
检查Hadoop是否正在运行
有一个很好的工具,称为
jps
。您可以使用它来确保所有服务都已启动。在您的hadoop bin文件夹中输入:jps
它应该显示所有与Hadoop相关的过程。
注意:由于这是大约6个月前为我完成的,如果有任何部分无法正常工作,请告诉我。
使用Juju的Hadoop(Hadoop的Juju魅力)
我将假定已设置以下内容:
-
您已经设置了Juju的服务器
-
您有权访问服务器(本地或远程)
-
您已经配置了Juju,并准备开始添加超级按钮
-
您正在使用12.04(这是因为我已使用12.04测试了所有这些功能)
-
您已经用与您将使用的服务器有关的信息(包括PPA来源)配置了
~/.juju/environments.yaml
。
现在,请按照以下步骤运行Hadoop服务:
-
引导Hadoop环境
juju bootstrap
等待直到完成,然后检查其是否正确连接:
juju status
-
部署Hadoop(主从)
juju deploy --constraints="instance-type=m1.large" hadoop hadoop-master juju deploy --constraints="instance-type=m1.medium" -n 5 hadoop hadoop-slave
-
建立关系
juju add-relation hadoop-master:namenode hadoop-slave:datanode juju add-relation hadoop-master:jobtracker hadoop-slave:tasktracker
-
公开Hadoop(由于您已经部署并创建了关系,因此该服务应正在运行)
juju expose hadoop-master
并检查状态以查看其是否正常运行:
juju status hadoop-master
到目前为止,您已经在运行Hadoop。您可以在提供的链接或官方的Juju Charm for Hadoop中找到更多操作
有关最新的JuJu超级按钮(设置,分步指南等),您可以访问:JuJu Charms并创建自己的JuJu环境,并查看每个文件的设置方式以及每个服务的连接方式。
次佳方法
我通过将JAVA_HOME
的路径设置为usr/lib/jvm/java-6-openjdk-amd64
成功安装了Hadoop。
第三种方法
源自@Luis Alvarado的answer,这是我针对Ubuntu 14.04和Hadoop 2.5.1的版本
简单来说
-
安装Java
-
准备Hadoop
hduser
的执行用户 -
从现在开始切换到
hduser
-
允许
hduser
通过pass-phrase-less的ssh进行远程控制 -
禁用IPv6
-
下载并配置Hadoop软件包
-
准备系统路径$ HADOOP_HOME和$ JAVA_HOME
-
配置Hadoop的服务
-
启动Hadoop的服务
做完了祝好运!
详细步骤
安装Java
下载并安装
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update && sudo apt-get upgrade
$ sudo apt-get install oracle-java7-installer
确保已安装Java7
$ which java
$ ls -l /usr/bin/java
$ ls -l /etc/alternatives/java
我们应该将java
指向/usr/lib/jvm/java-7-oracle/jre/bin/java
准备Hadoop hduser
的执行用户
在组hadoop
中创建用户hduser
$ sudo addgroup hadoop
$ sudo adduser --ingroup hadoop hduser
授予hduser
sudo特权
编辑须藤
$ sudo visudo
将此行添加到最后
hduser ALL=(ALL:ALL) ALL
从现在开始切换到hduser
$ su - hduser
允许hduser
通过pass-phrase-less的ssh进行远程控制
安装openssh
$ sudo apt-get install openssh-server
生成用于SSH连接的RSA公钥/私钥;密码为空,为parameter -P ""
$ ssh-keygen -t rsa -P ""
$ cat .ssh/id_rsa.pub >> .ssh/authorized_keys
确保hduser
可以在没有密码的情况下在本地ssh远程
$ ssh localhost
禁用IPv6
编辑配置文件
$ sudo nano /etc/sysctl.conf
复制到最后
#disable ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
确保通过重启或调用关闭IPv6
$ sudo sysctl -p
然后打电话
$ cat /proc/sys/net/ipv6/conf/all/disable_ipv6
应该说1表示可以^^
下载并配置Hadoop软件包
从Apache Hadoop site下载Hadoop 2.5.1软件包
该软件包的直接URL是此链接
http://www.eu.apache.org/dist/hadoop/core/hadoop-2.5.1/hadoop-2.5.1.tar.gz
因此,让我们下载到hduser
的主文件夹,将其解压缩并重命名为hadoop
$ wget http://www.eu.apache.org/dist/hadoop/core/hadoop-2.5.1/hadoop-2.5.1.tar.gz
$ tar -xvzf hadoop-2.5.1.tar.gz
$ mv hadoop-2.5.1 hadoop
确保我们已将Hadoop存储在hduser
主页中
$ ls /home/hduser/hadoop
准备系统路径$ HADOOP_HOME和$ JAVA_HOME
编辑hduser
的.bashrc文件
$ nano .bashrc
放入$HADOOP_HOME
和$JAVA_HOME
的最终值
# Set Hadoop-related environment variables
export HADOOP_HOME=/home/hduser/hadoop
# Set JAVA_HOME (we will also configure JAVA_HOME directly for Hadoop later on)
export JAVA_HOME=/usr/lib/jvm/java-7-oracle
将Hadoop binary
文件夹添加到系统$PATH
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
打开一个新终端,以hduser
身份登录,并确保您具有$ HADOOP_HOME及其可用命令
$ echo $HADOOP_HOME
$ which start-all.sh
$ which start-dfs.sh
$ which start-yarn.sh
我们应该看到这些名称的完整路径。
配置Hadoop的服务
Hadoop中的每个组件都使用XML文件进行配置。
-
通用属性进入core-site.xml
-
HDFS属性进入hdfs-site.xml
-
MapReduce属性位于mapred-site.xml中
这些文件都位于文件夹$ HADOOP_HOME /etc /hadoop中
通过编辑该行,再次在hadoop-env.sh
中定义JAVA_HOME
export JAVA_HOME=/usr/lib/jvm/java-7-oracle
在core-site.xml中的以下位置定义Hadoop temp folder
和file system
名称:
<configuration>
...
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hduser/tmp</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:54310</value>
<description>The name of the default file system. A URI whose
scheme and authority determine the FileSystem implementation. The
uri's scheme determines the config property (fs.SCHEME.impl) naming
the FileSystem implementation class. The uri's authority is used to
determine the host, port, etc. for a filesystem.</description>
</property>
...
</configuration>
我们需要按照/home/hduser/tmp
的配置准备此temp folder
$ cd /home/hduser
$ mkdir tmp
$ chown hduser:hadoop tmp
$ chmod 755 tmp
在hdfs-site.xml中定义file system
的block replication
<configuration>
...
<property>
<name>dfs.replication</name>
<value>1</value>
<description>Default block replication.
The actual number of replications can be specified when the file is created.
The default is used if replication is not specified in create time.
</description>
</property>
...
</configuration>
在mapred-site.xml中定义map-reduce job
<configuration>
...
<property>
<name>mapred.job.tracker</name>
<value>localhost:54311</value>
<description>The host and port that the MapReduce job tracker runs
at. If "local", then jobs are run in-process as a single map
and reduce task.
</description>
</property>
...
</configuration>
格式name node
$ hdfs namenode -format
启动Hadoop服务
呼叫
$ start-dfs.sh && start-yarn.sh
这两个命令位于$ HADOOP_HOME /sbin,我们之前已将其添加到系统$ PATH中。
确保Hadoop服务正确启动
$ jps
我们应该看到