您的位置:首页 > 运维架构

hadoop从安装到布署

2016-03-29 12:46 501 查看
检查是否安装JDK
$ java -version
若没有就安装JDK(可把压缩包放在/usr/lib/java中解压),之后添加环境变量
$ export JAVA_HOME=/path to jdk

$ export PATH=$JAVA_HOME/bin:$PATH

值得注意的是,上面的命令只对当前正在运行的shell起作用,一旦注销用户、关闭shell或重启系统之后会失效。要确保相同的设置始终有效,可以把这些设置添加到shell启动文件。对于Bash Shell来说,那就是.bash_profile文件。当然,为避免shell启动过程过于复杂,可把相关配置放入一个单独的文件,然后从命令行显式调用此文件,如:
$ source ini-hadoop-config.sh
对于CentOS,就执行vim ~/.bashrc,增加配置内容,然后source ~/.bashrc
下载HADOOP并配置环境变量
$ export HADOOP_HOME=/path to hadoop

$ export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
进入hadoop安装路径的etc/hadoop目录,编辑hadoop-env.sh、yarn-env.sh文件。搜索JAVA_HOME并取消那行注释,修改为JDK的安装路径。在相同的目录下找到slaves文件,去掉“”localhost”,每行添加一个主机名,行末没有任何符号。这样写入所有从节点主机名或IP。最后让配置文件生效

$ source hadoop-env.sh
$ source yarn-env.sh
添加hadoop用户、创建空口令Secure Shell(SSH)的密钥对
$ useradd hadoop
$ passwd hadoop
$ vim /etc/sudoers然后增加这个条目:hadoop
ALL=(ALL) ALL

创建密钥

公钥和密钥是两份文件,服务端持有公钥,用来加密;客户端持有密钥,用来解密。客户端向服务端发起连接请求时,服务端会生成一串随机数,经过公钥加密后传给客户端。这时客户端会用密钥解密获取随机数,再返回服务端。最后服务端判断一下,如果客户端能够返回正确的随机数,就认为校验通过了。使用公钥认证,就只需要把自己生成的公钥发给管理员,而不需要管理员把服务器的用户密码告诉每一个人
$ ssh-keygen -t rsa -P ''
复制新生成的公钥至已授权秘钥列表
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 600 authorized_keys
确认信任主机证书,之后再连接则不需要密码
$ ssh localhost
$ chown -R hadoop:hadoop /usr/hadoop
若使用一个完全分布式的集群,需要确保集群中每台机器的hadoop用户具有相同的密钥设置。将master上的authorized_keys放到其他linux主机的~/.ssh目录下。
$ sudo scp ~/.ssh/authorized_keys hadoop@slave1:~/.ssh

如果不进行任何配置,hadoop以本地独立模式运行,也就是说所有组件都运行在一个进程中。而伪分布式模式是让每个组件运行在不同的Java虚拟机中,它们之间通过socket通信。

按如下步骤配置成伪分布式,core-site.xml文件的configuration节点内增加内容:

<property>
<!-- NameNode的位置-->
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<!-- 文件根目录-->
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>



完全分布式的配置类似如下

<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://192.168.7.141 :9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/ hadoop/tmp</value >
<description>A base for other temporary directories.</description>
</property>
<property>
<name>hadoop.proxyuser.hduser.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hduser.groups</name>
<value>*</value>
</property>
</configuration>


同样地,修改hdfs-site.xml文件中的configuration节点:

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

完全分布式的配置类似如下

<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:9001</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/name</value>
</pr
c574
operty>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>4</value>
<description>storage copy number</description>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>


对于mapred-site.xml.template文件,给出了模板,先拷贝得到mapred-site.xml。要运行在yarn上,可按如下方式修改:

<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>

完全分布式的配置类似如下

<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>master:9001</value>
<description>JobTracker visit  path</description>
</property>
</configuration>


对于yarn-site.xml文件

<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

完全分布式的配置类似如下

<configuration>
<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
</configuration>


启动之前最好执行设置存储hadoop文件的根目录(假如是/var/lib/hadoop),可让作何用户都能在此目录写入数据:

$ chmod 777 /var/lib/hadoop

首次启动Hadoop之前,都需要格式化HDFS文件系统

$ bin/hdfs namenode -format

启动Hadoop、使用HDFS

$ sbin/start-dfs.sh

所有节点采用相同的配置文件和安装目录,直接把master上面的所有hadoop目录copy到slave1,slave2,slave3上面去。

然后可以打开hadoop的监控页面查看状态:http://localhost:50070(MapReduce)或50030(HDFS)。这些Web页面很可能是诊断作业开始缓慢地运行或出现了明显的失败问题的第一站,因为该接口提供的丰富信息是调查正在运行的作业和已完成作业的入手点。

如果namenode没有启动,而secondarynamenode被启动,则停止服务,重新格式化
bin/hdfs namenode -format

接着来测试、操作文件系统上的文件和目录

hadoop为每个用户保留一个主目录,这些主目录都位于HDFS上的/user路径下,若你的主目录不存在,则需要自己创建。未带参数的-ls命令会指定用户主目录,相对路径(不是以/开关)也是相对那个位置。

$ bin/hdfs dfs -mkdir /user    $ bin/hdfs dfs -mkdir /user/<username>

$ bin/hdfs dfs -ls /user

$ echo "this is a test." >> test.txt

$ bin/hdfs dfs -copyFromLocal test.txt

$ bin/hdfs dfs -ls

$ bin/hdfs dfs -cat test.txt

$ rm test.txt

$ bin/hdfs dfs -copyToLocal test.txt

执行MapReduce作业

$ bin/hdfs dfs -put etc/hadoop input

不能把一个已存在的目录指定为Hadoop作业的的输出路径,这是一种安全机制,防止用户重写有用的文件。当然也可以覆盖这种方式。

$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jar grep input output 'dfs[a-z.]+'

从分布式文件系统中取出文件放到本地文件系统

$ bin/hdfs dfs -get output output

$ cat output/*
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息