Hadoop:Hadoop单机伪分布式的安装和配置

http://blog.csdn.net/pipisorry/article/details/51623195

        之前是在docker中配置的hadoop单机伪分布式[Hadoop:Hadoop单机伪分布式的安装和配置 ],并且在docker只有root用户,所有没有权限问题存在。官方安装文档[Hadoop: Setting up a Single Node Cluster]

        这里直接在linux/macos下配置,主要是为了能用netbeans ide/python-charm调试hadoop程序,并且使用的用户就是开机时登录的用户。

本教程配置环境:

ubuntu14.04 / macos(Ubuntu 12.04 /32位、64位都ok! )

hadoop 2.6 / hadoop3.0 (原生 Hadoop 2、3都ok!)

jdk1.7.0_101 / jdk 1.8 (1.7+都ok!)

皮blog

 

基本环境配置

安装和配置Java环境

在主机上从Oracle官方网站下载对应版本的JDK安装包

$ sudo vim ~/.bashrc 或者/etc/profile
第一行“...”的path末尾加上:${JAVA_HOME}/bin,后面export路径

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

export JAVA_HOME=/opt/jdk1.8.0_73
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

export PATH=$PATH:${JAVA_HOME}/bin

$ sudo update-alternatives --install /usr/bin/java java /opt/jdk1.8.0_73/bin/java 300;

sudo update-alternatives --install /usr/bin/javac javac /opt/jdk1.8.0_73/bin/javac 300;
sudo update-alternatives --install /usr/bin/javah javah /opt/jdk1.8.0_73/bin/javah 300;
sudo update-alternatives --install /usr/bin/jar jar /opt/jdk1.8.0_73/bin/jar 300

. ~/.bashrc 或者/etc/profile
测试java是否安装成功
root@f26f7d459863:/#java -version

[java环境配置:安装jdk、eclipse]

 

安装SSH、配置SSH无密码登陆

单节点模式可能不需要用到 SSH,但是伪分布式和分布式肯定需要 (ssh must be installed and sshd must be running to use the Hadoop scripts that manage remote Hadoop daemons,运行hadoop不需要ssh localhost登录,只要安装并运行了sshd就可以了)。

安装 SSH client和SSH server

(如果默认安装就不用了,查看安装which ssh, which sshd)
$sudo apt-get install -y openssh-server

编辑sshd的配置文件pika:~$sudo vim /etc/ssh/sshd_config,将其中大概88行,UsePAM参数设置成“no”
启动sshd服务~$sudo /etc/init.d/ssh start

#每次重启都要重新启动,所以要加入到profile中开机自启

$sudo vim /etc/profile

其中加入一行/etc/init.d/ssh start

查看ssh服务状态 pika:~$ps -e | grep ssh

15358 ??         0:00.07 sshd: youzipi [priv] 

15364 ??         0:00.03 /usr/bin/ssh-agent -l

查看是否可以免密登录

$ ssh localhost

Note: 如果非免密或者出错的解决方案

1 免密:

  $ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
  $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
  $ chmod 0600 ~/.ssh/authorized_keys

2 Mac OS中输入命令ssh localhost得到ssh: connect to host localhost port 22: Connection refused,解决方法是选择系统偏好设置->选择共享->点击远程登录。

皮blog

 

 

 

Hadoop的安装和配置

        Hadoop 可以通过 http://mirror.bit.edu.cn/apache/hadoop/common/ 或者 http://mirrors.cnnic.cn/apache/hadoop/common/ 下载,一般选择下载最新的稳定版本,即下载 “stable” 下的 hadoop-....x.y.tar.gz 这个格式的文件,这是编译好的。

        lz在linux中测试使用hadoop 2.6.4,后来在macos中测试使用的hadoop 3.2.0,都ok。

安装Hadoop 至 /usr/local/ 中

下载hadoop到/usr/local并解压

~$sudo wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-.../hadoop-....tar.gz -P /usr/local

~$cd /usr/local/

/usr/local$sudo tar -zxf hadoop-....tar.gz
/usr/local$sudo ln -s /usr/local/hadoop-... /usr/local/hadoop        #设置软链接(必须是完整路径非相对路径)
/usr/local$ls /usr/local/hadoop
bin  etc  include  lib  libexec  LICENSE.txt  NOTICE.txt  README.txt  sbin  share

sudo chown -R hadoop ./hadoop       # -R递归修改文件所有者为hadoop

检查 Hadoop 是否可用

/usr/local$hadoop/bin/hadoop version

Hadoop执行命令目录加入到path中

~$sudo vim ~/.bashrc (for linux)  或者 sudo vim ~/.bash_profiel (for macos)  或者 /etc/profile
export JAVA_HOME=/opt/jdk1.8.0_73
export JRE_HOME=${JAVA_HOME}/jre

export HADOOP_HOME=/usr/local/hadoop

PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export PATH

export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/

export CLASSPATH=$CLASSPATH:/usr/local/hadoop-2.6.4/etc/hadoop:/usr/local/hadoop-2.6.4/share/hadoop/common/lib/*:/usr/local/hadoop-2.6.4/share/hadoop/common/*:/usr/local/hadoop-2.6.4/share/hadoop/hdfs:/usr/local/hadoop-2.6.4/share/hadoop/hdfs/lib/*:/usr/local/hadoop-2.6.4/share/hadoop/hdfs/*:/usr/local/hadoop-2.6.4/share/hadoop/yarn/lib/*:/usr/local/hadoop-2.6.4/share/hadoop/yarn/*:/usr/local/hadoop-2.6.4/share/hadoop/mapreduce/lib/*:/usr/local/hadoop-2.6.4/share/hadoop/mapreduce/*:/usr/local/hadoop-2.6.4/contrib/capacity-scheduler/*.jar

~$ . ~/.bashrc  或者~/.bash_profiel  或者/etc/profile    或者重新登录terminal

~$echo $PATH    #查看生效否

hadoop中配置JAVA_HOME

搜索和设置 export JAVA_HOME=“java最新位置”。

hadoop2:

~$sudo vim /usr/local/hadoop/libexec/hadoop-config.sh

hadoop3:

~$vi /usr/local/hadoop/etc/hadoop/hadoop-env.sh

皮blog

 

Hadoop单机伪分布式配置

        Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。
        Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。

修改配置文件 core-site.xml和hdfs-site.xml

~$cd /usr/local/hadoop

/usr/local/hadoop$sudo vim etc/hadoop/core-site.xml

将当中的<configuration></configuration>修改成:

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>

同样修改配置文件 hdfs-site.xml:

pika:/usr/local/hadoop$sudo vim etc/hadoop/hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>

Hadoop配置文件说明

        Hadoop 的运行方式是由配置文件决定的(运行 Hadoop 时会读取配置文件),因此如果需要从伪分布式模式切换回非分布式模式,需要删除 core-site.xml 中的配置项。
        此外,伪分布式虽然只需要配置 fs.defaultFS 和 dfs.replication 就可以运行,不过若没有配置 hadoop.tmp.dir 参数,则默认使用的临时目录为 /tmp/hadoo-hadoop,而这个目录在重启时有可能被系统清理掉,导致必须重新执行 format 才行。

        同时也指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,否则在接下来的步骤中可能会出错。

配置完成后,执行 NameNode 的格式化

/usr/local/hadoop$sudo bin/hdfs namenode -format
成功的话,会看到有个提示“successfully formatted” 。

开启 NameNode 和 DataNode 守护进程

对hadoop安装目录执行命令对文件敞开权限,否则会出错Starting namenodes on [localhost] localhost: mkdir: cannot create directory ‘/usr/soft/hadoop-2.6.3/logs’: Permission denied

$sudo chown -R pika:pika /usr/local/hadoop
$sudo chmod u+w -R /usr/local/hadoop

Note: lz将hadoop目录所有权修改成了当前用户pika及用户组pika,并给目录递归加上的当前用户pika的写权限。当然也可以直接给所有用户都加上w权限:$sudo chmod a+w -R /usr/local/hadoop/,不过lz觉得这样可能会有安全隐患。

pika:~$start-dfs.sh
Note: 若出现SSH提示,输入yes即可;要通过下面的jps查看hadoop是否运行正确了。

如果运行上面的start-dfs.sh出错,再次运行可能会出错,要先通过stop-dfs.sh关闭,再次运行。

通过jps查看启动的Hadoop进程

启动完成后,可以通过命令 jps 来判断是否成功启动,若成功启动则会列出如下进程: “NameNode”、”DataNode” 和 “SecondaryNameNode”(如果 SecondaryNameNode 没有启动,请运行 sbin/stop-dfs.sh 关闭进程,然后再次尝试启动尝试)。如果没有 NameNode 或 DataNode ,那就是配置不成功,请仔细检查之前步骤,或通过查看启动日志排查原因。

pika:~$jps

通过web界面访问

如果是linux或者虚拟机配置的hadoop,成功启动后,可以访问 Web 界面http://localhost:9870(for hadoop3.x) http://localhost:50070(for hadoop2.x) 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。

Note: 如果两个地址都打不开,可能是namenode初始化默认端口失效,需手动修改配置文件设置默认端口 hdfs-site.xml 添加dfs.http.address,将绑定IP改为0.0.0.0,而不是本地回环IP,这样就能够实现外网访问本机的50070端口了。 

<property>
  <name>dfs.http.address</name>
  <value>0.0.0.0:50070</value>
</property>

,然后stop-dfs.sh,stop-yarn.sh,重新格式化,jps查看,再访问。

启动Hadoop可能的错误及解决

Hadoop namenode无法正常启动,jps中查看不到namenode
一般可以查看启动日志来排查原因,注意几点:
starting namenode,启动日志信息是记录在/usr/local/hadoop/logs/hadoop-`用户名`-namenode-`机器名`.log”。
每一次的启动日志都是追加在日志文件之后,一般出错的提示在最后面,通常是写着 Fatal、Error、Warning 或者 Java Exception 的地方。可以在网上搜索一下出错信息,看能否找到一些相关的解决方法。

如:$ tail -20 /usr/local/hadoop/logs/hadoop-youzipi-namenode-youzipideMacBook-Pro.local.log 

。。。Exiting with status 1: org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /private/tmp/hadoop-youzipi/dfs/name is in an inconsistent state: storage directory does not exist or is not accessible.。。。

SHUTDOWN_MSG: Shutting down NameNode at youzipideMacBook-Pro.local/30.6.200.194。。。

这个错误可能的原因有:

1 namenode没有如上格式化 或者 格式化多次后再格式化失败,这时可以使用强制格式化hadoop namenode -format -force

2 没有目录就加个目录mkdir /private/tmp/hadoop-youzipi/dfs/name

3 没有如上sudo vim etc/hadoop/hdfs-site.xml配置

4 没有如上修改当前用户write目录的权限。

错误1:

启动时可能会出现如下 WARN 提示:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable。该 WARN 提示可以忽略,并不会影响正常使用(该 WARN 可以通过

编译 Hadoop 源码解决)。

错误2:

出错:Starting namenodes on [localhost]
localhost: Error: JAVA_HOME is not set and could not be found.

明明已经设置了,并且$ echo $JAVA_HOME
/opt/jdk1.8.0_91成功输出!

解决方案:

如上提到的,要在hadoop中配置JAVA_HOME

pika:~$sudo vim /usr/local/hadoop-2.6.4/libexec/hadoop-config.sh

在大概161行位置加上export JAVA_HOME=/opt/jdk1.8.0_73

错误3:

启动 Hadoop 时提示 Could not resolve hostname
如果启动 Hadoop 时遇到输出非常多“ssh: Could not resolve hostname xxx”的异常情况
这个并不是 ssh 的问题,可通过设置 Hadoop 环境变量来解决。首先按键盘的 ctrl + c 中断启动,然后在 ~/.bashrc 中,增加如下两行内容(设置过程与 JAVA_HOME 变量一样,其中 HADOOP_HOME 为 Hadoop 的安装目录):
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
执行 source ~/.bashrc 使变量设置生效,然后再次执行 ./sbin/start-dfs.sh 启动 Hadoop。

错误4:DataNode 没有启动

一般情况下,若是 DataNode 没有启动,可尝试如下的方法(注意这会删除 HDFS 中原有的所有数据,如果原有的数据很重要请不要这样做):
./sbin/stop-dfs.sh   # 关闭
rm -r ./tmp 删除 tmp 文件,注意这会删除 HDFS 中原有的所有数据
./bin/hdfs namenode -format 重新格式化 NameNode
./sbin/start-dfs.sh  # 重启

皮皮blog

 

 

Hadoop单机伪分布式运行实例

单机模式grep 例子读取的是本地数据,伪分布式读取的则是 HDFS 上的数据。

Hadoop运行java mapred程序

这里我们还要自己写java代码,并在java代码中引入hadoop packages。

添加hadoop classpath

这一步已经在上面的path环境配置中配置过了

$hadoop classpath

/usr/local/hadoop-2.6.4/etc/hadoop:/usr/local/hadoop-2.6.4/share/hadoop/common/lib/*:/usr/local/hadoop-2.6.4/share/hadoop/common/*:/usr/local/hadoop-2.6.4/share/hadoop/hdfs:/usr/local/hadoop-2.6.4/share/hadoop/hdfs/lib/*:/usr/local/hadoop-2.6.4/share/hadoop/hdfs/*:/usr/local/hadoop-2.6.4/share/hadoop/yarn/lib/*:/usr/local/hadoop-2.6.4/share/hadoop/yarn/*:/usr/local/hadoop-2.6.4/share/hadoop/mapreduce/lib/*:/usr/local/hadoop-2.6.4/share/hadoop/mapreduce/*:/usr/local/hadoop-2.6.4/contrib/capacity-scheduler/*.jar

Note:要将hadoop classpath输出加入到CLASSPATH中,Hadoop provides a convenient utility to get the CLASSPATH information you need. Run "hadoop classpath" This should give you the information you need set your classpath for compiling your code.否则java代码中import package org.apache.hadoop.*会出错:javac .java error: package org.apache.hadoop.conf does not exist...[package org.apache.hadoop.fs does not exist]

#启动hadoop并将input文件copy到hdfs中

首先需要在 HDFS 中创建用户目录,接着将文件复制到分布式文件系统中。[hadoop HDFS常用文件操作命令]

$hdfs dfs -mkdir -p /pika/input   Note: hdfs dfs命令应该和hadoop fs等价
$hdfs dfs -ls /

drwxr-xr-x   - pika supergroup          0 2016-06-10 19:22 /pika

将输入文件copy到hadoop hdfs文件系统中供其使用(.java文件是可以不用copy进去的)

$hdfs dfs -put .../*input* /pika/input

$hdfs dfs -ls /pika/input

-rw-r--r--   1 pika supergroup        165 2016-06-10 19:28 /pika/input/example-input.txt
drwxr-xr-x   - pika supergroup          0 2016-06-10 19:28 /pika/input/part1-input

Note: 示例input文件下载[avg-time hadoop程序]

#编译执行java的hadoop程序

$cd 本地java文件目录
$rm -f *.class *.jar#移除已有的java编译文件

$javac AvgTime.java
$jar cfm AvgTime.jar AvgTime-manifest.txt AvgTime*.class
$hdfs dfs -rm -f -r /pika/output             #移除已有的output文件夹目录

$hadoop jar ./AvgTime.jar /pika/input/example-input.txt /pika/output             #执行hadoop程序
$hdfs dfs -cat '/pika/output/part-*' #查看输出
1.2.3.4 18811001100    2 28.500
alpha 1.2.3.4    2 20.200
beta alpha    2 4.100

Note: 运行 Hadoop 程序时,为了防止覆盖结果,程序指定的输出目录(如 output)不能存在,否则会提示错误 “org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists” ,因此运行前需要先删除输出目录 ./bin/hdfs dfs -rm -r output。在实际开发应用程序时,可考虑在程序中加上如下代码,能在每次运行时自动删除输出目录,避免繁琐的命令行操作:
Configuration conf = new Configuration();
Job job = new Job(conf);
/* 删除输出目录 */
Path outputPath = new Path(args[1]);
outputPath.getFileSystem(conf).delete(outputPath, true);

[Hadoop计算平均值【转】]

Hadoop运行python mapred程序

Hadoop Streaming 原理

        Hadoop 本身是用 Java 开发的,程序也需要用 Java 编写,但是通过 Hadoop Streaming,我们可以使用任意语言来编写程序,让 Hadoop 运行。Hadoop Streaming 就是通过将其他语言编写的 mapper 和 reducer 通过参数传给一个事先写好的 Java 程序(Hadoop 自带的 hadoop-streaming-*.jar),这个 Java 程序会负责创建 MR 作业,另开一个进程来运行 mapper,将得到的输入通过 stdin 传给它,再将 mapper 处理后输出到 stdout 的数据交给 Hadoop,经过 partition 和 sort 之后,再另开进程运行 reducer,同样通过 stdin/stdout 得到最终结果。

Python的MapReduce代码 

        因此,使用Python编写MapReduce代码的技巧就在于我们使用了 HadoopStreaming 来帮助我们在Map 和 Reduce间传递数据通过STDIN (标准输入)和STDOUT (标准输出)。我们仅仅使用Python的sys.stdin来输入数据,使用sys.stdout输出数据,这样做是因为HadoopStreaming会帮我们办好其他事。

        编写python的mapred代码:如分布式的fpgrowth代码 [pfpgrowth]。所有的脚本执行之前都需要修改权限,否则没有执行权限:chmod +x mapper.py, chmod +x reducer.py。

reducer中的参数设置:

MIN_SUPPORT = 2

input.txt:(只有这个需要上传到hdfs中,hdfs dfs -put ...) 

u1	a	b	c
u2	c	d	b	a
u3	d	e	a
u4	b	a

group.txt:

123	a:4
25345	b:3
323	c:2
123	d:2	e:1

Note: 需要明确一点,hadoop框架会自动的将相同的key分配到同一个reducer上,这个key,默认的就是上一个mapper输出数据的以\t,或者\001分割后的第一部分。

        运行python mapred的shell脚本

#!/bin/bash/
 
hadoop fs -rm -r -f /user/youzipi/output/co-purchase
 
hadoop jar /usr/local/hadoop/share/hadoop/tools/lib/hadoop-streaming-3.2.0.jar -files mapper.py,reducer.py,group.txt -mapper "python mapper.py" -reducer "python reducer.py" -input /user/youzipi/input/input.txt -output /user/youzipi/output/co-purchase

执行命令时候需要注意:上面的shell是在mapper.py文件所在文件夹下执行的,其它路径下需要注意-files的路径。同时也要注意hadoop-streaming-3.2.0.jar的路径,hadoop3.x是在hadoop解压包中share/hadoop/tools/lib/下,否则出错:Error opening job jar: /usr/local/hadoop/bin/hadoop 或者出错:java.util.zip.ZipException: error in opening zip file。

shell脚本解析:-output规定了输出,而fs -rm则是删除文件,不然第二次运行的时候,由于文件存在会终止运行;

hadoop jar *hadoop-streaming*.jar,具体的位置,要根据你自己机器上的位置而定;

-files 指定了要分发到集群上的文件;

-maper -reducer 指定了mapper和reduce 要运行的程序;

-input 指定了输入文件,相当于mapper最开始的sys.stdin读入的内容。

        查看运行结果

$hdfs dfs -cat '/user/youzipi/output/co-purchase/part-*'      #同java

_ {"support": 2, "artists": ["a", "d"]}

_ {"support": 3, "artists": ["a", "b"]}

_ {"support": 2, "artists": ["a", "b"]}

_ {"support": 2, "artists": ["a", "c"]}

_ {"support": 2, "artists": ["c", "b"]}

_ {"support": 2, "artists": ["a", "c", "b"]}

从hdfs拷贝至本地:$ hdfs dfs -get output/* ./

[用python 写mapreduce程序]

[让python在hadoop上跑起来]

[使用python编写hadoop的mapper 和reducer]

from: http://blog.csdn.net/pipisorry/article/details/51623195

ref:

 

  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值