大数据学习
bigdata learning
Toggle navigation
大数据学习
主页
openGauss数据库
Flume
MongoDB
Hadoop
数据库实验
Kafka
Zookeeper
Hbase
Manual
Spark
Neo4j
InfluxDB
RabbitMQ
Flink
About Me
归档
标签
01-Hadoop安装教程
Hadoop
HDFS
2022-10-13 13:21:43
878
0
0
bigdata
Hadoop
HDFS
# Hadoop 安装教程 单机/伪分布式配置Hadoop2.6.0(2.7.1)/Ubuntu14.04(16.04) **本教程采用Hadoop 2.7.1作为示例 等版本**[点击这里从百度云盘下载](https://pan.baidu.com/s/1DXEgoMEW8-Ldu0I3LxyW5w)(提取码:a52w) ## 创建用户 增加一个名为 nbu 的用户用于大数据实验,输入如下命令创建新用户 : ```shell sudo useradd -m nbu -s /bin/bash #这条命令创建了可以登陆的 nbu 用户,并使用 /bin/bash 作为 shell。 ``` ```shell sudo passwd nbu # 为nbu用户创建密码 ``` 可为 nbu 用户增加管理员权限,方便部署,避免一些对新手来说比较棘手的权限问题: ```shell sudo adduser nbu sudo su nbu #切换nbu用户 ``` ## 更新 apt 用 nbu 用户登录后,我们先更新一下 apt,后续我们使用 apt 安装软件,如果没更新可能有一些软件安装不,执行如下命令: ```shell nbu@ecs:~$ sudo apt-get update ``` ## 安装 SSH、配置 SSH 无密码登陆 Ubuntu 默认已安装了 SSH client,此外还需要安装 SSH server: ```shell nbu@ecs:~$ sudo apt-get install openssh-server ``` 安装后,可以使用如下命令登陆本机: ```shell nbu@ecs:~$ ssh localhost ``` 此时会有如下提示(SSH 首次登陆提示),输入 yes 。然后按提示输入密码 nbu,这样就登陆到本机了。 ### SSH 无密码登陆 首先退出刚才的 ssh,就回到了我们原先的终端窗口,然后利用 ssh-keygen 生成密钥,并将密钥加入到授权中: ```shell exit # 退出刚才连接本机的ssh localhost nbu@ecs:~$cd ~/.ssh/ # 若没有该目录,请先执行一次ssh localhost nbu@ecs:~/.ssh$ssh-keygen -t rsa # 会有提示,都按回车就可以 nbu@ecs:~/.ssh$cat ./id_rsa.pub >> ./authorized_keys # 加入授权 ``` > **~的含义** > > 在 Linux 系统中,~ 代表的是用户的主文件夹,即 “/home/用户名” 这个目录,如你的用户名为 nbu,则 ~ 就代表 “/home/nbu/”。 此外,命令中的 # 后面的文字是注释,只需要输入前面命令即可。 此时再用 `ssh localhost` 命令,无需输入密码就可以直接登陆了。 ## JDK安装 JDK的安装方法可参考 [JDK安装](/blog/post/bigdata/JDK安装) ## **安装 Hadoop** 我们选择将 Hadoop 安装至 /usr/local/ 中: ```shell nbu@ecs:~$sudo tar -zxf ~/hadoop-2.7.1.tar.gz -C /usr/local # 解压到/usr/local中 nbu@ecs:~$cd /usr/local/ nbu@ecs:/usr/local$sudo mv ./hadoop-2.7.1/ ./hadoop # 将文件夹名改为hadoop nbu@ecs:/usr/local$sudo chown -R nbu ./hadoop # 修改文件权限 ``` Hadoop 解压后即可使用。输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息: ```shell nbu@ecs:~$ cd /usr/local/hadoop nbu@ecs:/usr/local/hadoop$ ./bin/hadoop version ```  ## Hadoop 单机配置(非分布式) Hadoop 默认模式为非分布式模式(本地模式),无需进行其他配置即可运行。非分布式即单 Java 进程,方便进行调试。 现在我们可以执行例子来感受下 Hadoop 的运行。Hadoop 附带了丰富的例子(运行 `./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar` 可以看到所有例子),包括 wordcount、terasort、join、grep 等。 在此我们选择运行 grep 例子,我们将 input 文件夹中的所有文件作为输入,筛选当中符合正则表达式 dfs[a-z.]+ 的单词并统计出现的次数,最后输出结果到 output 文件夹中。 ```shell nbu@ecs:~$ cd /usr/local/hadoop nbu@ecs:/usr/local/hadoop$ mkdir ./input nbu@ecs:/usr/local/hadoop$ cp ./etc/hadoop/*.xml ./input # 将配置文件作为输入文件*/ nbu@ecs:/usr/local/hadoop$ ./sbin/start-all.sh #开启hadoop nbu@ecs:/usr/local/hadoop$ ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep ./input ./output 'dfs[a-z.]+' cat ./output/* # 查看运行结果 ``` ## 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** (通过 gedit 编辑会比较方便: `gedit ./etc/hadoop/core-site.xml`),将当中的 ```xml <configuration> </configuration> ``` 修改为下面配置 ```xml <configuration> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp</value> <description>Abase for other temporary directories.</description> </property> <property> <name>fs.defaultFS</name> <value>hdfs://0.0.0.0:9000</value> </property> </configuration> ``` 同样的,修改配置文件 **hdfs-site.xml**: ```xml <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> ``` 配置完成后,执行 NameNode 的格式化: ```shell nbu@ecs:/usr/local/hadoop$./bin/hdfs namenode -format ``` 成功的话,会看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若为 “Exitting with status 1” 则是出错。 如果在这一步时提示 **Error: JAVA_HOME is not set and could not be found.** 的错误,则说明之前设置 JAVA_HOME 环境变量那边就没设置好,请按教程先设置好 JAVA_HOME 变量,否则后面的过程都是进行不下去的。如果已经按照前面教程在.bashrc 文件中设置了 JAVA_HOME,还是出现 **Error: JAVA_HOME is not set and could not be found.** 的错误,那么,请到 hadoop 的安装目录修改配置文件“/usr/local/hadoop/etc/hadoop/hadoop-env.sh”,在里面找到“export JAVA_HOME=${JAVA_HOME}”这行,然后,把它修改成 JAVA 安装路径的具体地址,比如,“export JAVA_HOME=/usr/lib/jvm/default-java”,然后,再次启动 Hadoop。 接着开启 NameNode 和 DataNode 守护进程。 ```shell nbu@ecs:~$cd /usr/local/hadoop nbu@ecs:/usr/local/hadoop$./sbin/start-dfs.sh #start-dfs.sh是个完整的可执行文件,中间没有空格 ``` > _启动 Hadoop 时提示 Could not resolve hostname_ > 可以在 ~/.bashrc 中,增加如下两行内容(设置过程与 JAVA_HOME 变量一样,其中 HADOOP_HOME 为 Hadoop 的安装目录): > > ```shell > export HADOOP_HOME=/usr/local/hadoop > export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native > > ``` > 保存后,务必执行 source ~/.bashrc 使变量设置生效,然后再次执行 ./sbin/start-dfs.sh 启动 Hadoop。 启动完成后,可以通过命令 `jps` 来判断是否成功启动,若成功启动则会列出如下进程: “NameNode”、”DataNode” 和 “SecondaryNameNode”。  成功启动后,可以访问 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件  ## 运行 Hadoop 伪分布式实例 上面的单机模式,grep 例子读取的是本地数据,伪分布式读取的则是 HDFS 上的数据。要使用 HDFS,首先需要在 HDFS 中创建用户目录: ```shell nbu@ecs:/usr/local/hadoop$ ./bin/hdfs dfs -mkdir -p /user/nbu/ ``` ./etc/hadoop 中的 xml 文件作为输入文件复制到分布式文件系统中,即将 /usr/local/hadoop/etc/hadoop 复制到分布式文件系统中的 /user/hadoop/input 中。我们使用的是 nbu 用户,并且已创建相应的用户目录 /user/nbu ,因此在命令中就可以使用相对路径如 input,其对应的绝对路径就是 /user/nbu/input: ```shell nbu@ecs:/usr/local/hadoop$./bin/hdfs dfs -mkdir input nbu@ecs:/usr/local/hadoop$./bin/hdfs dfs -put ./etc/hadoop/*.xml input ``` 复制完成后,可以通过如下命令查看文件列表: ```shell nbu@ecs:/usr/local/hadoop$./bin/hdfs dfs -ls input ```  伪分布式运行 MapReduce 作业的方式跟单机模式相同,区别在于伪分布式读取的是 HDFS 中的文件(可以将单机步骤中创建的本地 input 文件夹,输出结果 output 文件夹都删掉来验证这一点)。 ```shell nbu@ecs:/usr/local/hadoop$ ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+' ```  查看运行结果的命令(查看的是位于 HDFS 中的输出结果): ```shell nbu@ecs:/usr/local/hadoop$ ./bin/hdfs dfs -cat output/* ``` 结果如下,注意到刚才我们已经更改了配置文件,所以运行结果不同。  可以将运行结果取回到本地: ```shell nbu@ecs:/usr/local/hadoop$ rm -r ./output # 先删除本地的 output 文件夹(如果存在) nbu@ecs:/usr/local/hadoop$ ./bin/hdfs dfs -get output ./output # 将 HDFS 上的 output 文件夹拷贝到本机 nbu@ecs:/usr/local/hadoop$ cat ./output/* ```  Hadoop 运行程序时,输出目录不能存在,否则会提示错误 “org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists” ,因此若要再次执行,需要执行如下命令删除 output 文件夹: ```shell nbu@ecs:/usr/local/hadoop$./bin/hdfs dfs -rm -r output # 删除 output 文件夹 ``` > _运行程序时,输出目录不能存在_ > > 运行 Hadoop 程序时,为了防止覆盖结果,程序指定的输出目录(如 output)不能存在,否则会提示错误,因此运行前需要先删除输出目录。在实际开发应用程序时,可考虑在程序中加上如下代码,能在每次运行时自动删除输出目录,避免繁琐的命令行操作: > > ```java > Configuration conf = new Configuration(); > Job job = new Job(conf); > /* 删除输出目录 */ > Path outputPath = new Path(args[1]); > outputPath.getFileSystem(conf).delete(outputPath, true); > ``` 若要关闭 Hadoop,则运行 ```shell nbu@ecs:/usr/local/hadoop$./sbin/stop-dfs.sh ``` ## 参考资料 - https://dblab.xmu.edu.cn/blog/247
上一篇:
01-HBase安装
下一篇:
01-Hive简介
文档导航