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
在主机上从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 must be installed and sshd must be running to use the Hadoop scripts that manage remote Hadoop daemons,运行hadoop不需要ssh localhost登录,只要安装并运行了sshd就可以了)。
(如果默认安装就不用了,查看安装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 可以通过 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并解压
~$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
/usr/local$hadoop/bin/hadoop version
~$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 #查看生效否
搜索和设置 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 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。
Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。
~$cd /usr/local/hadoop
/usr/local/hadoop$sudo vim etc/hadoop/core-site.xml
将当中的
fs.defaultFS
hdfs://localhost:9000
同样修改配置文件 hdfs-site.xml:
pika:/usr/local/hadoop$sudo vim etc/hadoop/hdfs-site.xml
dfs.replication
1
Hadoop 的运行方式是由配置文件决定的(运行 Hadoop 时会读取配置文件),因此如果需要从伪分布式模式切换回非分布式模式,需要删除 core-site.xml 中的配置项。
此外,伪分布式虽然只需要配置 fs.defaultFS 和 dfs.replication 就可以运行,不过若没有配置 hadoop.tmp.dir 参数,则默认使用的临时目录为 /tmp/hadoo-hadoop,而这个目录在重启时有可能被系统清理掉,导致必须重新执行 format 才行。
同时也指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,否则在接下来的步骤中可能会出错。
/usr/local/hadoop$sudo bin/hdfs namenode -format
成功的话,会看到有个提示“successfully formatted” 。
对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 来判断是否成功启动,若成功启动则会列出如下进程: “NameNode”、”DataNode” 和 “SecondaryNameNode”(如果 SecondaryNameNode 没有启动,请运行 sbin/stop-dfs.sh 关闭进程,然后再次尝试启动尝试)。如果没有 NameNode 或 DataNode ,那就是配置不成功,请仔细检查之前步骤,或通过查看启动日志排查原因。
pika:~$jps
如果是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端口了。
,然后stop-dfs.sh,stop-yarn.sh,重新格式化,jps查看,再访问。
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
单机模式grep 例子读取的是本地数据,伪分布式读取的则是 HDFS 上的数据。
这里我们还要自己写java代码,并在java代码中引入hadoop packages。
这一步已经在上面的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]
首先需要在 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 本身是用 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代码的技巧就在于我们使用了 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: