0x00 序
前两天一同学来找我问爬虫,知道周五上午有个课程要说爬虫,瞬间兴趣来了,于是今天去上了课,发现挺有趣,现在让我们配置Hadoop,简要记录下过程
0x01 docker
国际惯例,找别人的docker镜像
1
2
3
4
5
6
7
8
$ docker search hadoop
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
sequenceiq/hadoop-docker An easy way to try Hadoop 479 [OK]
sequenceiq/hadoop-ubuntu An easy way to try Hadoop on Ubuntu 42 [OK]
uhopper/hadoop Base Hadoop image with dynamic configurati... 33 [OK]
harisekhon/hadoop Apache Hadoop (HDFS + Yarn, tags 2.5 - 2.7) 17 [OK]
ruo91/hadoop Apache hadoop 2.x - Pseudo-Distributed Mode 12 [OK]
izone/hadoop Hadoop 2.8.1 Ecosystem fully distributed, ... 12 [OK]
第一个拖下来,只有1G但是下了好久,fs好多层
1
$ docker pull sequenceiq/hadoop-docker
运行试一试
1
$ docker run -it --rm sequenceiq/hadoop-docker /bin/bash
看了下,centos 6.6
,可以直接拿来用 :)
0x02 手动配置
不过还是想试试手动来,生命在于折腾
配置hadoop要改很多东西,所以为了不把服务器环境搞坏了,决定在ubuntu 16.04的docker里面配置,
首先加用户
1
2
$ useradd -m hadoop -s /bin/bash
$ passwd hadoop
账户密码都一样
然后装软件
1
$ apt install vim openssh-server default-jre -y
然后配置java环境,这一次不能用default-jre
了,因为这次还需要jdk
, 所以
1
$ apt install openjdk-8-jdk
然后就需要配置JAVA_HOME
的环境变量了
额发现了一个很有趣的东西
1
2
3
4
5
6
7
8
$ root@3e28365cb0b9:/usr/lib/jvm# ls -al
total 16
drwxr-xr-x 3 root root 4096 Sep 15 10:09 .
drwxr-xr-x 28 root root 4096 Sep 15 10:10 ..
-rw-r--r-- 1 root root 2600 Jul 28 02:31 .java-1.8.0-openjdk-amd64.jinfo
lrwxrwxrwx 1 root root 24 Feb 25 2016 default-java -> java-1.8.0-openjdk-amd64
lrwxrwxrwx 1 root root 20 Jul 28 02:31 java-1.8.0-openjdk-amd64 -> java-8-openjdk-amd64
drwxr-xr-x 7 root root 4096 Sep 15 12:22 java-8-openjdk-amd64
他们这几个东西其实是一个东西,一个指向另一个,最后还是到了java-8-openjdk-amd64
这个地方
由于很多个文件都指向这个,所以参考教程中的改名我就没有执行,
所以我们这个地方的$JAVA_HOME
其实是/usr/lib/jvm/java-8-1.8.0-openjdk-amd64
1
2
$ root@3e28365cb0b9:/usr/lib/jvm/java-8-openjdk-amd64# ls
ASSEMBLY_EXCEPTION THIRD_PARTY_README bin docs include jre lib man src.zip
我们完全不用设置JAVA_HOME
这个变量,只是可能是长久的习惯,JAVA_HOME
这个变量就直接指代了jdk
的安装目录,后面加配置的时候可以少写几行重复的代码,所以我这里也按照长期的习惯加一个JAVA_HOME
然后改~/.bashrc
,把如下内容加到最后四行
1
2
3
4
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
测试一下
1
2
3
4
5
6
$ root@3e28365cb0b9:~# java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-8u131-b11-2ubuntu1.16.04.3-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)
$ root@3e28365cb0b9:~# javac -version
javac 1.8.0_131
下载hadoop,
1
2
3
$ wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.6.5/hadoop-2.6.5.tar.gz
$ tar -xzf hadoop-2.6.5.tar.gz
$ mv hadoop-2.6.5 /usr/local/
然后….改个名字吧..
1
$ mv hadoop-2.6.5 hadoop
然后, 先去试试能不能用吧..
1
2
3
4
5
6
7
8
$ cd /usr/local/hadoop/bin
$ ./hadoop version
Hadoop 2.6.5
Subversion https://github.com/apache/hadoop.git -r e8c9fe0b4c252caf2ebf1464220599650f119997
Compiled by sjlee on 2016-10-02T23:43Z
Compiled with protoc 2.5.0
From source with checksum f05c9fa095a395faa9db9f7ba5d754
This command was run using /usr/local/hadoop/share/hadoop/common/hadoop-common-2.6.5.jar
搞定,
接下来设置下环境变量吧,这样启动很不优雅
1
2
3
4
5
# for hadoop
export HADOOP_HOME=/usr/local/hadoop
export CLASSPATH=${$HADOOP_HOME/bin/hadoop classpath}:$CLASSPATH
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
这个东西加到.bashrc
里面,然后发现….报错
1
2
3
$ bash
bash: CLASSPATH=${$HADOOP_HOME/bin/hadoop classpath}:$CLASSPATH: bad substitution
于是注释掉第二行,因为我不是很懂他这个写法..
1
2
3
4
5
# for hadoop
export HADOOP_HOME=/usr/local/hadoop
#export CLASSPATH=${$HADOOP_HOME/bin/hadoop classpath}:$CLASSPATH
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
然后教程里面让修改/usr/local/hadoop/etc/hadoop/hadoop-env.sh
添加export JAVA_HOME=/usr/lib/jvm/java
,我看了下hadoop-env.sh
发现他写了一行export JAVA_HOME=${JAVA_HOME}
这个应该是在启动hadoop会在环境变量里面取的,hadoop肯定会在启动bash后面才会启动,所以我先不修改,如果后面出问题了我再来改这个
然后修改同一目录下的core-site.xml
文件,改成了如下内容
1
2
3
4
5
6
7
8
9
10
11
<configuration>
<!-- Les1ie write here at 2017.9.21-->
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description> Les1ie's config.</description>
</property>
<name>fs.defaultFS</name>
<value>hdfs://0.0.0.0:9000</value>
<poperty>
</configuration>
教程里面是监听的localhost
,因为我这个是在docker里面配置的,所以我设置的监听0.0.0.0
,不然外面连不进去
然后改hdfs-site.xml
添加如下内容
1
2
3
4
5
6
7
8
9
10
11
12
13
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
两个配置文件都是手打进去的,这个vim比较原始没配置,所以连缩进都没有,将就看下吧
嗯运行下
1
$ ./bin/hdfs namenode -format
好的配置文件报错一大堆,手打果然不靠谱,挨个改好。
改core-site.xml
,
1
2
3
4
5
6
7
8
9
10
11
12
<configuration>
<!-- Les1ie write here at 2017.9.21-->
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description> Les1ie's config.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://0.0.0.0:9000</value>
</property>
</configuration>
然后改hdfs-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
再运行一次初始化
emmm又错了,查看信息
emmmm我猜是我刚刚把报错的环境变量注释了的锅
然后再启动一次
1
$ ./sbin/start-dfs.sh
看到一个报错信息
这个…不是我刚刚改监听地址的地方么..改localhost
吧
再次启动,还是说ssh登录失败
于是
1
2
$ apt install openssh-server curl
$ service ssh start
还是登录不上, 想起来这个是docker, root没设置密码
设置里密码还是登不上
emmm发现我是root…还没改sshd里面允许root登录,我个zz,
然后改了之后,重启sshd
登上去了,然后忽然发现根本不需要嘛,
反正都是要配置公钥登录的:)
1
$ ssh-keygen
一路回车
然后
1
$ ssh-copy-id localhost
再试试ssh localhost
,搞定
然后再次启动,发现报错找不到JAVA_HOME
,好的把刚刚省略掉没写的以为会从bash
的$PATH
里面取的$JAVA_HOME
写到了hadoop-env.sh
,再次启动,搞定
最后是
1
2
3
4
5
$ jps
3970 NameNode
4502 Jps
4119 DataNode
4316 SecondaryNameNode
然后
1
$ curl localhost:50070
好的,通的,搞定
可以打包一份docker传到我的docker hub去了..
1
$ docker commit -a "Les1ie [email protected]" -m "Les1ie's tutor for hadoop 2.6.5" hadoop hadoop-tutor:latest
还是有点大..1G, 没事传上去
1
$ docker push hadoop-tutor:latest
emmmm出了点问题,没传上去.算了吧,就这样
睡觉睡觉
2017年9月21日01:43:02