Need to install Hadoop for a class or a project? It can be hard. It took me 1 hour to install and that was after clear instructions provided by Professor.
So I did what a good Software Engineer does and automated it.
Comic credit: Automation by xkcd.
In this post, I will cover two ways to install Hadoop:
- Automatic install in 5 minutes
- Manual install in 15ish minutes
Unless you are a Software Engineer who wants to install it manually, I’d recommend going with Vagrant as it’s faster and you don’t have to fiddle with you OS.
Vagrant also has an added benefit of keeping your local OS clean and not having to install and troubleshoot different versions of jdk and other packages.
Installing Hadoop in 5 Minutes with Vagrant
- Make sure you have latest versions of VirtualBox and Vagrant installed.
- Download or clone Vagrant Hadoop repository.
- Navigate to the directory where you downloaded the repo using command line (want to learn command line? I’ve got you covered: 7 Essential Linux Commands You Need To Know)
- Run
vagrant up
- Done
That’s it. Once installation is done, run vagrant ssh
to access your vagrant machine and use Hadoop.
Installing Hadoop Manually on macOS and Linux
Warning: I’ve only tested these instructions on Linux (Ubuntu to be specific). On macOS, you may need to use different folders or install additional software.
Here are the instructions:
- Make sure that apt-get knows about latest repos using
sudo apt-get update
- Install Java
sudo apt-get install openjdk-11-jdk
- Download Hadoop
wget http://mirrors.koehn.com/apache/hadoop/common/hadoop-3.2.0/hadoop-3.2.0.tar.gz
- Copy Hadoop files to
/usr/local/bin
(this is a personal preference, you can copy to any folder, just make sure you change the commands going forward)
sudo tar -xvzf hadoop-3.2.0.tar.gz -C /usr/local/bin/
- Rename the hadoop folder. Again, this is a personal preference, you can leave it the way you want but you’ll need to change the paths going forward.
sudo mv /usr/local/bin/hadoop-3.2.0 /usr/local/bin/hadoop/
- Update path variables:
echo "export JAVA_HOME=/usr" >> /home/vagrant/.bashrc echo "export HADOOP_LOG_DIR=/hadoop_logs" >> /home/vagrant/.bashrc echo "export PATH=\$PATH:/usr/local/bin/hadoop/bin:/usr/local/bin/hadoop/sbin" >> /home/vagrant/.bashrc source ~/.bashrc - Update Hadoop environment variables:
echo "export JAVA_HOME=/usr" | sudo tee --append /usr/local/bin/hadoop/etc/hadoop/hadoop-env.sh echo "export HADOOP_LOG_DIR=/hadoop_logs" | sudo tee --append /usr/local/bin/hadoop/etc/hadoop/hadoop-env.sh echo "export HDFS_NAMENODE_USER=\"vagrant\"" | sudo tee --append /usr/local/bin/hadoop/etc/hadoop/hadoop-env.sh echo "export HDFS_DATANODE_USER=\"vagrant\"" | sudo tee --append /usr/local/bin/hadoop/etc/hadoop/hadoop-env.sh echo "export HDFS_SECONDARYNAMENODE_USER=\"vagrant\"" | sudo tee --append /usr/local/bin/hadoop/etc/hadoop/hadoop-env.sh echo "export YARN_RESOURCEMANAGER_USER=\"vagrant\"" | sudo tee --append /usr/local/bin/hadoop/etc/hadoop/hadoop-env.sh echo "export YARN_NODEMANAGER_USER=\"vagrant\"" | sudo tee --append /usr/local/bin/hadoop/etc/hadoop/hadoop-env.sh - Generate a SSH key and add it to
authorized_keys
(thanks to Stack Overflow user sapy: Hadoop “Permission denied” warning)
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa cat /home/vagrant/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys - You’ll need to edit the
/usr/local/bin/hadoop/etc/hadoop/core-site.xml
file to addfs.defaultFS
setting. Here’s my configuration file:<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. See accompanying LICENSE file. --> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> </configuration> - Next, edit the
/usr/local/bin/hadoop/etc/hadoop/hdfs-site.xml
file to add 3 properties. As SachinJ noted on Stack Overlow, hdfs will reset every time you reboot your OS without the first two of these. (Hadoop namenode needs to be formatted after every computer start)<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. See accompanying LICENSE file. --> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>dfs.name.dir</name> <value>file:///vagrant_data/hadoop/name</value> </property> <property> <name>dfs.data.dir</name> <value>file:///vagrant_data/hadoop/data</value> </property> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration> - Initialize the hdfs
/usr/local/bin/hadoop/bin/hdfs namenode -format
- Run dfs using
/usr/local/bin/hadoop/sbin/start-dfs.sh
- Test everything is running fine by creating a directory in hdfs using
hdfs dfs -mkdir /test
That’s it. If you got Hadoop working, do share the post to help others.
Faced any issues? Tell me in comments and I’ll see how I can help.
Leave a Reply